Files
lingji-work-fe/src/stores/modules/side-bar/index.ts
2025-09-01 14:07:18 +08:00

122 lines
3.6 KiB
TypeScript

/*
* @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 = [];
},
},
});