import {computed, ref, Ref, toRaw} from "vue"; import {uiType} from "@/hook/useGraphic"; type MenuRaw = { key: any, children?: MenuRaw[] } type GenerateResult = Array } & E>; export const generateByMenus = ( generateFn: (men: T) => R, mainMenus: T[] ): GenerateResult => { return mainMenus.map(mainMenu => ({ ...generateFn(mainMenu), children: mainMenu.children ? generateByMenus(generateFn, mainMenu.children) : [] })) } export const findMenuByAttr = (value: V, attr: K, mainMenus: T[]) => { for (const mainMenu of mainMenus) { if (toRaw(mainMenu[attr]) === toRaw(value)) { return mainMenu } else if (mainMenu.children) { const childMainMenu = findMenuByAttr(value, attr as any, mainMenu.children) if (childMainMenu) { return childMainMenu; } } } } export type GenerateMinMenusResult = { menus: GenerateResult void }>, child: Ref, activeMenuKey: Ref } export const generateMixMenus = < T extends MenuRaw, K extends keyof T, R >( childKey: K, generateFn: (men: T) => R, mainMenus: T[], itemAction: (men: T) => void, getActiveItem: () => any ): GenerateMinMenusResult => { const child = ref(); const menus = generateByMenus((menu) => ({ ...generateFn(menu), onClick: () => { if (menu[childKey]) { if (toRaw(menu[childKey]) !== toRaw(child.value)) { child.value = menu[childKey] return; } } else { itemAction(menu); } child.value = null } }), mainMenus) const activeMenuKey = computed(() => child.value ? findMenuByAttr(child.value, childKey, mainMenus)?.key : getActiveItem() ) return { child, menus, activeMenuKey }; }