store.ts 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. import { create } from 'zustand';
  2. import { message } from 'antd';
  3. import { apis } from '@/apis';
  4. import LocalStorage from '@/LocalStorage';
  5. export interface RouterMatchItem {
  6. breadcrumbName: string;
  7. path: string;
  8. hidden?: boolean;
  9. }
  10. interface LayoutState {
  11. routerMatchList: RouterMatchItem[];
  12. userName: string;
  13. collapsed: boolean;
  14. selectedKey: string;
  15. openKeys: string[];
  16. appThemeMode: string;
  17. }
  18. interface LayoutActions {
  19. setRouterMatchList: (list: RouterMatchItem[]) => void;
  20. setUserName: (userName: string) => void;
  21. setCollapsed: (collapsed: boolean) => void;
  22. setSelectedKey: (key: string) => void;
  23. setOpenKeys: (openKeys: string[]) => void;
  24. setRoouterName: (name: string) => void;
  25. reset: () => void;
  26. }
  27. export type LayoutStore = LayoutState & LayoutActions & {
  28. // Actions
  29. logout: (navigate: any) => Promise<void>;
  30. onClickLogout: (navigate: any) => Promise<void>;
  31. onChangeSelectedKey: (item: { key: string; keyPath?: string[] }) => void;
  32. onOpenChange: (openKeys: string[]) => void;
  33. onClickCollapsed: () => void;
  34. init: (list: RouterMatchItem[]) => void;
  35. onSetRouterMatchList: (list: RouterMatchItem[]) => void;
  36. handleSelectChange: (menuLevel: number) => void;
  37. onSetRoouterName: (name: string) => void;
  38. };
  39. const initialState: LayoutState = {
  40. routerMatchList: [],
  41. userName: '',
  42. collapsed: false,
  43. selectedKey: '',
  44. openKeys: [],
  45. appThemeMode: '',
  46. };
  47. export const useLayoutStore = create<LayoutStore>((set, get) => ({
  48. ...initialState,
  49. setRouterMatchList: (list) => set({ routerMatchList: list }),
  50. setUserName: (userName) => set({ userName }),
  51. setCollapsed: (collapsed) => set({ collapsed }),
  52. setSelectedKey: (key) => set({ selectedKey: key }),
  53. setOpenKeys: (openKeys) => set({ openKeys }),
  54. setRoouterName: (name) => set((state) => ({
  55. routerMatchList: state.routerMatchList.map((val) => {
  56. if (val && val.breadcrumbName === '知识库详情') {
  57. return { ...val, breadcrumbName: name };
  58. }
  59. return val;
  60. }),
  61. })),
  62. reset: () => set(initialState),
  63. logout: async (navigate) => {
  64. try {
  65. await apis.logout();
  66. await apis.getSseclose();
  67. LocalStorage.clear();
  68. navigate({ pathname: '/login' }, { replace: true });
  69. message.success('退出成功');
  70. } catch (e) {
  71. console.error('退出登录失败:', e);
  72. }
  73. },
  74. onClickLogout: async (navigate) => {
  75. await get().logout(navigate);
  76. },
  77. onChangeSelectedKey: (item) => {
  78. set({ selectedKey: item.key });
  79. if (item.keyPath) {
  80. get().onOpenChange(item.keyPath);
  81. }
  82. },
  83. onOpenChange: (openKeys) => {
  84. // 点击菜单,收起其他展开的所有菜单
  85. const latestOpenKey = openKeys.find((key) => get().openKeys.indexOf(key) === -1);
  86. set({ openKeys: latestOpenKey ? [latestOpenKey] : [] });
  87. },
  88. onClickCollapsed: () => {
  89. set((state) => ({ collapsed: !state.collapsed }));
  90. },
  91. init: (list) => {
  92. const userInfo = LocalStorage.getUserInfo();
  93. if (userInfo) {
  94. set({ userName: userInfo.name });
  95. }
  96. set({ routerMatchList: list });
  97. const routerInfo = list.length > 1 ? list[list.length - 1] : list[0];
  98. const flagkeyPath = list.map(item => item.path);
  99. const visibleItems = list.filter(item => item?.hidden === false);
  100. const lastVisibleItem = visibleItems.at(-1);
  101. if (routerInfo && lastVisibleItem) {
  102. get().onChangeSelectedKey({
  103. key: lastVisibleItem.path,
  104. keyPath: flagkeyPath,
  105. });
  106. }
  107. },
  108. onSetRouterMatchList: (list) => {
  109. set({ routerMatchList: list });
  110. },
  111. handleSelectChange: () => {
  112. // 预留功能
  113. },
  114. onSetRoouterName: (name) => {
  115. get().setRoouterName(name);
  116. },
  117. }));