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