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,
|
};
|