app.ts 2.7 KB

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