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