import * as React from 'react'; import { supportNodeRef, useComposeRef } from 'rc-util/lib/ref'; import ContextIsolator from '../_util/ContextIsolator'; import type { MenuProps } from './menu'; // Used for Dropdown only export interface OverrideContextProps { prefixCls?: string; expandIcon?: React.ReactNode; mode?: MenuProps['mode']; selectable?: boolean; validator?: (menuProps: Pick) => void; onClick?: () => void; rootClassName?: string; } const OverrideContext = React.createContext(null); /** @internal Only used for Dropdown component. Do not use this in your production. */ export const OverrideProvider = React.forwardRef< HTMLElement, OverrideContextProps & { children: React.ReactNode } >((props, ref) => { const { children, ...restProps } = props; const override = React.useContext(OverrideContext); const context = React.useMemo( () => ({ ...override, ...restProps }), [ override, restProps.prefixCls, // restProps.expandIcon, Not mark as deps since this is a ReactNode restProps.mode, restProps.selectable, restProps.rootClassName, // restProps.validator, Not mark as deps since this is a function ], ); const canRef = supportNodeRef(children); const mergedRef = useComposeRef(ref, canRef ? children.ref : null); return ( {canRef ? React.cloneElement(children as React.ReactElement, { ref: mergedRef }) : children} ); }); /** @internal Only used for Dropdown component. Do not use this in your production. */ export default OverrideContext;