import { computed } from 'vue'
import { RouteRecordRaw, RouteRecordNormalized } from 'vue-router'
import usePermission from '@/hooks/permission'
import { useAppStore } from '@/store'
import appClientMenus from '@/router/appMenus'
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 = JSON.parse(JSON.stringify(appRoute.value))
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) => {
if (!permission.accessRouter(element)) {
return null
}
if (element.meta?.hideInMenu) {
return null
}
if (element.meta?.hideChildrenInMenu || !element.children) {
element.children = []
return element
}
element.children = element.children.filter(
(x) => x.meta?.hideInMenu !== true
)
const subItem = travel(element.children, layer + 1)
if (subItem.length) {
element.children = subItem
return element
}
if (layer > 1) {
element.children = subItem
return element
}
return null
})
return collector.filter(Boolean)
}
return travel(copyRouter, 0)
})
return {
menuTree
}
}