Files
certd/packages/ui/certd-client/src/vben/menu-ui/hooks/use-menu-context.ts
T

51 lines
1.2 KiB
TypeScript
Raw Normal View History

2025-06-29 14:09:09 +08:00
import type { MenuProvider, SubMenuProvider } from "../types";
2025-06-29 14:09:09 +08:00
import { getCurrentInstance, inject, provide } from "vue";
2025-06-29 14:09:09 +08:00
import { findComponentUpward } from "../utils";
2025-06-29 14:09:09 +08:00
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) {
2025-06-29 14:09:09 +08:00
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) {
2025-06-29 14:09:09 +08:00
throw new Error("instance is required");
}
2025-06-29 14:09:09 +08:00
const parentMenu = findComponentUpward(instance, ["Menu", "SubMenu"]);
const subMenu = inject(`subMenu:${parentMenu?.uid}`) as SubMenuProvider;
return subMenu;
}
2025-06-29 14:09:09 +08:00
export { createMenuContext, createSubMenuContext, useMenuContext, useSubMenuContext };