mirror of
https://github.com/certd/certd.git
synced 2026-05-17 13:57:31 +08:00
56 lines
1.2 KiB
TypeScript
56 lines
1.2 KiB
TypeScript
|
|
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,
|
||
|
|
};
|