import { Key } from '../../../_util/type'; import { ComputedRef, CSSProperties, defineComponent, inject, InjectionKey, provide, Ref, UnwrapRef, } from 'vue'; import { BuiltinPlacements, MenuClickEventHandler, MenuMode, MenuTheme, TriggerSubMenuAction, } from '../interface'; import { CSSMotionProps } from '../../../_util/transition'; export interface StoreMenuInfo { eventKey: string; key: Key; parentEventKeys: ComputedRef; childrenEventKeys: Ref; isLeaf?: boolean; } export interface MenuContextProps { store: UnwrapRef>; registerMenuInfo: (key: string, info: StoreMenuInfo) => void; unRegisterMenuInfo: (key: string) => void; prefixCls: ComputedRef; openKeys: Ref; selectedKeys: Ref; rtl?: ComputedRef; locked?: Ref; inlineCollapsed: Ref; antdMenuTheme?: ComputedRef; siderCollapsed?: ComputedRef; // // Mode mode: Ref; // // Disabled disabled?: ComputedRef; // // Used for overflow only. Prevent hidden node trigger open overflowDisabled?: ComputedRef; // // Active activeKeys: Ref; changeActiveKeys: (keys: Key[]) => void; // onActive: (key: string) => void; // onInactive: (key: string) => void; // // Selection // selectedKeys: string[]; // // Level inlineIndent: ComputedRef; // // Motion motion?: ComputedRef; defaultMotions?: ComputedRef, className: Ref) => CSSMotionProps); } > | null>; // // Popup subMenuOpenDelay: ComputedRef; subMenuCloseDelay: ComputedRef; // forceSubMenuRender?: boolean; builtinPlacements?: ComputedRef; triggerSubMenuAction?: ComputedRef; // // Icon // itemIcon?: RenderIconType; // expandIcon?: RenderIconType; // // Function onItemClick: MenuClickEventHandler; onOpenChange: (key: Key, open: boolean) => void; getPopupContainer: ComputedRef<(node: HTMLElement) => HTMLElement>; } const MenuContextKey: InjectionKey = Symbol('menuContextKey'); const useProvideMenu = (props: MenuContextProps) => { provide(MenuContextKey, props); }; const useInjectMenu = () => { return inject(MenuContextKey); }; const MenuFirstLevelContextKey: InjectionKey = Symbol('menuFirstLevelContextKey'); const useProvideFirstLevel = (firstLevel: Boolean) => { provide(MenuFirstLevelContextKey, firstLevel); }; const useInjectFirstLevel = () => { return inject(MenuFirstLevelContextKey, true); }; const MenuContextProvider = defineComponent({ name: 'MenuContextProvider', inheritAttrs: false, props: { props: Object, }, setup(props, { slots }) { useProvideMenu({ ...useInjectMenu(), ...props }); return () => slots.default?.(); }, }); export { useProvideMenu, MenuContextKey, useInjectMenu, MenuFirstLevelContextKey, useProvideFirstLevel, useInjectFirstLevel, MenuContextProvider, }; export default useProvideMenu;