提交 | 用户 | 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 |
} |