Blame view

src/store/modules/app.ts 2.75 KB
Vben authored
1
import type { ProjectConfig } from '/#/config';
Vben authored
2
import type { BeforeMiniState } from '/#/store';
vben authored
3
Vben authored
4
5
import { defineStore } from 'pinia';
import { store } from '/@/store';
陈文彬 authored
6
Vben authored
7
8
import { ThemeEnum } from '/@/enums/appEnum';
import { APP_DARK_MODE_KEY_, PROJ_CFG_KEY } from '/@/enums/cacheEnum';
Vben authored
9
import { Persistent } from '/@/utils/cache/persistent';
Vben authored
10
import { darkMode } from '/@/settings/designSetting';
Vben authored
11
12
import { resetRouter } from '/@/router';
import { deepMerge } from '/@/utils';
陈文彬 authored
13
Vben authored
14
interface AppState {
15
  darkMode?: ThemeEnum;
vben authored
16
  // Page loading status
Vben authored
17
  pageLoading: boolean;
vben authored
18
  // project config
Vben authored
19
  projectConfig: ProjectConfig | null;
20
  // When the window shrinks, remember some states, and restore these states when the window is restored
Vben authored
21
22
23
24
25
26
  beforeMiniInfo: BeforeMiniState;
}
let timeId: TimeoutHandle;
export const useAppStore = defineStore({
  id: 'app',
  state: (): AppState => ({
27
    darkMode: undefined,
Vben authored
28
29
30
31
32
    pageLoading: false,
    projectConfig: Persistent.getLocal(PROJ_CFG_KEY),
    beforeMiniInfo: {},
  }),
  getters: {
vben authored
33
    getPageLoading() {
Vben authored
34
35
      return this.pageLoading;
    },
vben authored
36
    getDarkMode(): 'light' | 'dark' | string {
Vben authored
37
38
39
      return this.darkMode || localStorage.getItem(APP_DARK_MODE_KEY_) || darkMode;
    },
vben authored
40
    getBeforeMiniInfo() {
Vben authored
41
42
43
      return this.beforeMiniInfo;
    },
vben authored
44
    getProjectConfig(): ProjectConfig {
Vben authored
45
46
47
      return this.projectConfig || ({} as ProjectConfig);
    },
vben authored
48
    getHeaderSetting() {
Vben authored
49
50
      return this.getProjectConfig.headerSetting;
    },
vben authored
51
    getMenuSetting() {
Vben authored
52
53
      return this.getProjectConfig.menuSetting;
    },
vben authored
54
    getTransitionSetting() {
Vben authored
55
56
      return this.getProjectConfig.transitionSetting;
    },
vben authored
57
    getMultiTabsSetting() {
Vben authored
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
      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 useAppStoreWidthOut() {
  return useAppStore(store);
陈文彬 authored
102
}