/* * @Author: RenXiaoDong * @Date: 2025-06-23 22:13:30 */ // import { useRoute } from 'vue-router'; import { defineStore } from 'pinia'; import router from '@/router'; import type { RouteLocationNormalized } from 'vue-router'; // import { MENU_LIST } from './constants'; import { useEnterpriseStore } from '@/stores/modules/enterprise'; import { getTaskUnread, patchTaskRead } from '@/api/all/common'; interface sidebarState { activeMenuKey: string | number | null; currentMenuList: any[]; unreadInfo: number[]; menuCollapse: boolean; hasMenuList: boolean; } let unreadInfoTimer: number | null = null; export const useSidebarStore = defineStore('sidebar', { state: (): sidebarState => ({ activeMenuKey: null, // 激活的菜单id currentMenuList: [], // 菜单信息 unreadInfo: [], // 未读消息 menuCollapse: false, // 菜单是否折叠 hasMenuList: true, // 是否有菜单 }), getters: { showSider(): boolean { const route = router.currentRoute.value; return !route.meta?.hideSidebar && this.hasMenuList; }, sidebarWidth(): number { if (!this.showSider) return 0; return this.menuCollapse ? 74 : 138; }, }, actions: { clearActiveMenuKey() { this.activeMenuKey = null; }, setActiveMenuKey(key: string | number) { this.activeMenuKey = key; }, setMenuCollapse() { this.menuCollapse = !this.menuCollapse; }, clearMenuCollapse() { this.menuCollapse = false; }, setCurrentMenuList(newMenuList: any[]) { this.currentMenuList = newMenuList; this.hasMenuList = newMenuList.length > 0; }, // navbar菜单列表由企业对应权限决定 // getUserNavbarMenuList() { // const enterpriseStore = useEnterpriseStore(); // this.menuList = MENU_LIST.filter( // (item) => !item.permissionKey || enterpriseStore.enterpriseInfo?.permissions?.includes(item.permissionKey), // ); // }, // 根据当前路由自动设置 activeMenuKey setActiveMenuKeyByRoute(route: RouteLocationNormalized) { const appRoutes = router.options?.routes ?? []; const findMenuGroup = (routes: any[]): number | null => { for (const routeItem of routes) { if (routeItem.children?.length > 0) { const isChildRoute = routeItem.children.some((child: any) => child.name === route.name); if (isChildRoute) { return routeItem.meta?.id || null; } const childResult = findMenuGroup(routeItem.children); if (childResult !== null) { return routeItem.meta?.id || childResult; } } else { if (routeItem.name === route.name) { return routeItem.meta?.id || null; } } } return null; }; const menuId = findMenuGroup(appRoutes as any); if (menuId !== null) { this.activeMenuKey = menuId; } }, async getTaskUnreadInfo() { const { code, data } = await getTaskUnread(); if (code === 200) { this.unreadInfo = data; } }, // 查询未读信息 startUnreadInfoPolling() { if (unreadInfoTimer) return; this.getTaskUnreadInfo(); unreadInfoTimer = window.setInterval(() => { this.getTaskUnreadInfo(); }, 30000); }, stopUnreadInfoPolling() { this.unreadInfo = []; if (unreadInfoTimer) { clearInterval(unreadInfoTimer); unreadInfoTimer = null; } }, async removeTaskUnreadInfo() { patchTaskRead({ ids: this.unreadInfo }); this.unreadInfo = []; }, }, });