| import { computed } from 'vue'; | 
| import { RouteRecordRaw, RouteRecordNormalized } from 'vue-router'; | 
| import usePermission from '@/hooks/permission'; | 
| import { useAppStore } from '@/store'; | 
| import appClientMenus from '@/router/app-menus'; | 
| import { cloneDeep } from 'lodash'; | 
|   | 
| export default function useMenuTree() { | 
|   const permission = usePermission(); | 
|   const appStore = useAppStore(); | 
|   const appRoute = computed(() => { | 
|     if (appStore.menuFromServer) { | 
|       return appStore.appAsyncMenus; | 
|     } | 
|     return appClientMenus; | 
|   }); | 
|   const menuTree = computed(() => { | 
|     const copyRouter = cloneDeep(appRoute.value) as RouteRecordNormalized[]; | 
|     copyRouter.sort((a: RouteRecordNormalized, b: RouteRecordNormalized) => { | 
|       return (a.meta.order || 0) - (b.meta.order || 0); | 
|     }); | 
|     function travel(_routes: RouteRecordRaw[], layer: number) { | 
|       if (!_routes) return null; | 
|   | 
|       const collector: any = _routes.map((element) => { | 
|         // no access | 
|         if (!permission.accessRouter(element)) { | 
|           return null; | 
|         } | 
|   | 
|         // leaf node | 
|         if (element.meta?.hideChildrenInMenu || !element.children) { | 
|           element.children = []; | 
|           return element; | 
|         } | 
|   | 
|         // route filter hideInMenu true | 
|         element.children = element.children.filter( | 
|           (x) => x.meta?.hideInMenu !== true | 
|         ); | 
|   | 
|         // Associated child node | 
|         const subItem = travel(element.children, layer + 1); | 
|   | 
|         if (subItem.length) { | 
|           element.children = subItem; | 
|           return element; | 
|         } | 
|         // the else logic | 
|         if (layer > 1) { | 
|           element.children = subItem; | 
|           return element; | 
|         } | 
|   | 
|         if (element.meta?.hideInMenu === false) { | 
|           return element; | 
|         } | 
|   | 
|         return null; | 
|       }); | 
|       return collector.filter(Boolean); | 
|     } | 
|     return travel(copyRouter, 0); | 
|   }); | 
|   | 
|   return { | 
|     menuTree, | 
|   }; | 
| } |