LooSheng
2023-03-24 74ded8aed7bd5f2e4f3008a4566d8e3dd0510566
提交 | 用户 | age
e8d6f8 1 import type {
V 2   ProjectConfig,
3   HeaderSetting,
4   MenuSetting,
5   TransitionSetting,
6   MultiTabsSetting,
7 } from '/#/config';
215d8b 8 import type { BeforeMiniState } from '/#/store';
e23336 9
215d8b 10 import { defineStore } from 'pinia';
V 11 import { store } from '/@/store';
2f6253 12
215d8b 13 import { ThemeEnum } from '/@/enums/appEnum';
V 14 import { APP_DARK_MODE_KEY_, PROJ_CFG_KEY } from '/@/enums/cacheEnum';
f57eb9 15 import { Persistent } from '/@/utils/cache/persistent';
215d8b 16 import { darkMode } from '/@/settings/designSetting';
V 17 import { resetRouter } from '/@/router';
2f6253 18 import { deepMerge } from '/@/utils';
737b1b 19
215d8b 20 interface AppState {
967b28 21   darkMode?: ThemeEnum;
e23336 22   // Page loading status
215d8b 23   pageLoading: boolean;
e23336 24   // project config
215d8b 25   projectConfig: ProjectConfig | null;
82c318 26   // When the window shrinks, remember some states, and restore these states when the window is restored
215d8b 27   beforeMiniInfo: BeforeMiniState;
2f6253 28 }
215d8b 29 let timeId: TimeoutHandle;
V 30 export const useAppStore = defineStore({
31   id: 'app',
32   state: (): AppState => ({
967b28 33     darkMode: undefined,
215d8b 34     pageLoading: false,
V 35     projectConfig: Persistent.getLocal(PROJ_CFG_KEY),
36     beforeMiniInfo: {},
37   }),
38   getters: {
74ded8 39     getPageLoading(state): boolean {
L 40       return state.pageLoading;
215d8b 41     },
74ded8 42     getDarkMode(state): 'light' | 'dark' | string {
L 43       return state.darkMode || localStorage.getItem(APP_DARK_MODE_KEY_) || darkMode;
215d8b 44     },
V 45
74ded8 46     getBeforeMiniInfo(state): BeforeMiniState {
L 47       return state.beforeMiniInfo;
215d8b 48     },
V 49
74ded8 50     getProjectConfig(state): ProjectConfig {
L 51       return state.projectConfig || ({} as ProjectConfig);
215d8b 52     },
V 53
e8d6f8 54     getHeaderSetting(): HeaderSetting {
215d8b 55       return this.getProjectConfig.headerSetting;
V 56     },
e8d6f8 57     getMenuSetting(): MenuSetting {
215d8b 58       return this.getProjectConfig.menuSetting;
V 59     },
e8d6f8 60     getTransitionSetting(): TransitionSetting {
215d8b 61       return this.getProjectConfig.transitionSetting;
V 62     },
e8d6f8 63     getMultiTabsSetting(): MultiTabsSetting {
215d8b 64       return this.getProjectConfig.multiTabsSetting;
V 65     },
66   },
67   actions: {
68     setPageLoading(loading: boolean): void {
69       this.pageLoading = loading;
70     },
71
72     setDarkMode(mode: ThemeEnum): void {
73       this.darkMode = mode;
74       localStorage.setItem(APP_DARK_MODE_KEY_, mode);
75     },
76
77     setBeforeMiniInfo(state: BeforeMiniState): void {
78       this.beforeMiniInfo = state;
79     },
80
81     setProjectConfig(config: DeepPartial<ProjectConfig>): void {
82       this.projectConfig = deepMerge(this.projectConfig || {}, config);
83       Persistent.setLocal(PROJ_CFG_KEY, this.projectConfig);
84     },
85
86     async resetAllState() {
87       resetRouter();
88       Persistent.clearAll();
89     },
90     async setPageLoadingAction(loading: boolean): Promise<void> {
91       if (loading) {
92         clearTimeout(timeId);
93         // Prevent flicker
94         timeId = setTimeout(() => {
95           this.setPageLoading(loading);
96         }, 50);
97       } else {
98         this.setPageLoading(loading);
99         clearTimeout(timeId);
100       }
101     },
102   },
103 });
104
105 // Need to be used outside the setup
913c22 106 export function useAppStoreWithOut() {
215d8b 107   return useAppStore(store);
V 108 }