mirror of
https://github.com/certd/certd.git
synced 2026-05-17 05:37:30 +08:00
51 lines
1.2 KiB
TypeScript
51 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 };
|