app.ts 3.3 KB

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