vue-vben-admin/src/store/modules/app.ts

109 lines
2.9 KiB
TypeScript
Raw Normal View History

import type {
ProjectConfig,
HeaderSetting,
MenuSetting,
TransitionSetting,
MultiTabsSetting,
} from '/#/config';
2021-04-10 19:25:49 +08:00
import type { BeforeMiniState } from '/#/store';
2020-10-30 21:32:05 +08:00
2021-04-10 19:25:49 +08:00
import { defineStore } from 'pinia';
import { store } from '/@/store';
2020-09-28 20:19:10 +08:00
2021-04-10 19:25:49 +08:00
import { ThemeEnum } from '/@/enums/appEnum';
import { APP_DARK_MODE_KEY_, PROJ_CFG_KEY } from '/@/enums/cacheEnum';
2021-02-27 19:55:30 +08:00
import { Persistent } from '/@/utils/cache/persistent';
2021-04-07 23:14:51 +08:00
import { darkMode } from '/@/settings/designSetting';
2021-04-10 19:25:49 +08:00
import { resetRouter } from '/@/router';
import { deepMerge } from '/@/utils';
2020-09-28 20:19:10 +08:00
2021-04-10 19:25:49 +08:00
interface AppState {
2021-04-10 21:18:35 +08:00
darkMode?: ThemeEnum;
2020-10-30 21:32:05 +08:00
// Page loading status
2021-04-10 19:25:49 +08:00
pageLoading: boolean;
2020-10-30 21:32:05 +08:00
// project config
2021-04-10 19:25:49 +08:00
projectConfig: ProjectConfig | null;
// When the window shrinks, remember some states, and restore these states when the window is restored
2021-04-10 19:25:49 +08:00
beforeMiniInfo: BeforeMiniState;
}
let timeId: TimeoutHandle;
export const useAppStore = defineStore({
id: 'app',
state: (): AppState => ({
2021-04-10 21:18:35 +08:00
darkMode: undefined,
2021-04-10 19:25:49 +08:00
pageLoading: false,
projectConfig: Persistent.getLocal(PROJ_CFG_KEY),
beforeMiniInfo: {},
}),
getters: {
getPageLoading(): boolean {
2021-04-10 19:25:49 +08:00
return this.pageLoading;
},
2021-05-25 01:24:26 +08:00
getDarkMode(): 'light' | 'dark' | string {
2021-04-10 19:25:49 +08:00
return this.darkMode || localStorage.getItem(APP_DARK_MODE_KEY_) || darkMode;
},
getBeforeMiniInfo(): BeforeMiniState {
2021-04-10 19:25:49 +08:00
return this.beforeMiniInfo;
},
2021-05-25 01:24:26 +08:00
getProjectConfig(): ProjectConfig {
2021-04-10 19:25:49 +08:00
return this.projectConfig || ({} as ProjectConfig);
},
getHeaderSetting(): HeaderSetting {
2021-04-10 19:25:49 +08:00
return this.getProjectConfig.headerSetting;
},
getMenuSetting(): MenuSetting {
2021-04-10 19:25:49 +08:00
return this.getProjectConfig.menuSetting;
},
getTransitionSetting(): TransitionSetting {
2021-04-10 19:25:49 +08:00
return this.getProjectConfig.transitionSetting;
},
getMultiTabsSetting(): MultiTabsSetting {
2021-04-10 19:25:49 +08:00
return this.getProjectConfig.multiTabsSetting;
},
},
actions: {
setPageLoading(loading: boolean): void {
this.pageLoading = loading;
},
setDarkMode(mode: ThemeEnum): void {
this.darkMode = mode;
localStorage.setItem(APP_DARK_MODE_KEY_, mode);
},
setBeforeMiniInfo(state: BeforeMiniState): void {
this.beforeMiniInfo = state;
},
setProjectConfig(config: DeepPartial<ProjectConfig>): void {
this.projectConfig = deepMerge(this.projectConfig || {}, config);
Persistent.setLocal(PROJ_CFG_KEY, this.projectConfig);
},
async resetAllState() {
resetRouter();
Persistent.clearAll();
},
async setPageLoadingAction(loading: boolean): Promise<void> {
if (loading) {
clearTimeout(timeId);
// Prevent flicker
timeId = setTimeout(() => {
this.setPageLoading(loading);
}, 50);
} else {
this.setPageLoading(loading);
clearTimeout(timeId);
}
},
},
});
// Need to be used outside the setup
export function useAppStoreWithOut() {
2021-04-10 19:25:49 +08:00
return useAppStore(store);
2020-09-28 20:19:10 +08:00
}