import type { MenuProvider, SubMenuProvider } from '../types'; import { getCurrentInstance, inject, provide } from 'vue'; import { findComponentUpward } from '../utils'; const menuContextKey = Symbol('menuContext'); /** * @zh_CN Provide menu context */ function createMenuContext(injectMenuData: MenuProvider) { provide(menuContextKey, injectMenuData); } /** * @zh_CN Provide menu context */ function createSubMenuContext(injectSubMenuData: SubMenuProvider) { const instance = getCurrentInstance(); provide(`subMenu:${instance?.uid}`, injectSubMenuData); } /** * @zh_CN Inject menu context */ function useMenuContext() { const instance = getCurrentInstance(); if (!instance) { throw new Error('instance is required'); } const rootMenu = inject(menuContextKey) as MenuProvider; return rootMenu; } /** * @zh_CN Inject menu context */ function useSubMenuContext() { const instance = getCurrentInstance(); if (!instance) { throw new Error('instance is required'); } const parentMenu = findComponentUpward(instance, ['Menu', 'SubMenu']); const subMenu = inject(`subMenu:${parentMenu?.uid}`) as SubMenuProvider; return subMenu; } export { createMenuContext, createSubMenuContext, useMenuContext, useSubMenuContext, };