app.ts 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. import type { MainAppProps } from '#/main';
  2. import type { ProjectConfig, HeaderSetting, MenuSetting, TransitionSetting, MultiTabsSetting } from '/#/config';
  3. import type { BeforeMiniState } from '/#/store';
  4. import { defineStore } from 'pinia';
  5. import { store } from '/@/store';
  6. import { ThemeEnum } from '/@/enums/appEnum';
  7. import { APP_DARK_MODE_KEY_, PROJ_CFG_KEY } from '/@/enums/cacheEnum';
  8. import { Persistent } from '/@/utils/cache/persistent';
  9. import { darkMode } from '/@/settings/designSetting';
  10. import { resetRouter } from '/@/router';
  11. import { deepMerge } from '/@/utils';
  12. import { getHideLayoutTypes } from '/@/utils/env';
  13. import setting from '/@/settings/projectSetting';
  14. interface AppState {
  15. darkMode?: ThemeEnum;
  16. // Page loading status
  17. pageLoading: boolean;
  18. // project config
  19. projectConfig: ProjectConfig | null;
  20. // When the window shrinks, remember some states, and restore these states when the window is restored
  21. beforeMiniInfo: BeforeMiniState;
  22. // 页面跳转临时参数存储
  23. messageHrefParams: any;
  24. // 应用参数
  25. mainAppProps: MainAppProps;
  26. }
  27. let timeId: TimeoutHandle;
  28. export const useAppStore = defineStore({
  29. id: 'app',
  30. state: (): AppState => ({
  31. darkMode: undefined,
  32. pageLoading: false,
  33. projectConfig: Persistent.getLocal(PROJ_CFG_KEY),
  34. beforeMiniInfo: {},
  35. messageHrefParams: {},
  36. mainAppProps: {},
  37. }),
  38. getters: {
  39. getPageLoading(): boolean {
  40. return this.pageLoading;
  41. },
  42. getDarkMode(): 'light' | 'dark' | string {
  43. // liaozhiyang---date:20250411---for:【QQYUN-11956】修复projectSetting中配置主题模式不生效
  44. const getSettingTheme = () => {
  45. const theme = setting.themeMode;
  46. if (theme) {
  47. if (theme == ThemeEnum.DARK) {
  48. // 为了index.html页面loading时是暗黑
  49. localStorage.setItem(APP_DARK_MODE_KEY_, theme);
  50. }
  51. return theme;
  52. }
  53. return '';
  54. };
  55. // liaozhiyang---date:20250411---for:【QQYUN-11956】修复projectSetting中配置主题模式不生效
  56. return this.darkMode || localStorage.getItem(APP_DARK_MODE_KEY_) || getSettingTheme() || darkMode;
  57. },
  58. getBeforeMiniInfo(): BeforeMiniState {
  59. return this.beforeMiniInfo;
  60. },
  61. getProjectConfig(): ProjectConfig {
  62. return this.projectConfig || ({} as ProjectConfig);
  63. },
  64. getHeaderSetting(): HeaderSetting {
  65. return this.getProjectConfig.headerSetting;
  66. },
  67. getMenuSetting(): MenuSetting {
  68. return this.getProjectConfig.menuSetting;
  69. },
  70. getTransitionSetting(): TransitionSetting {
  71. return this.getProjectConfig.transitionSetting;
  72. },
  73. getMultiTabsSetting(): MultiTabsSetting {
  74. return this.getProjectConfig.multiTabsSetting;
  75. },
  76. getMessageHrefParams(): any {
  77. return this.messageHrefParams;
  78. },
  79. getMainAppProps(): MainAppProps {
  80. return this.mainAppProps;
  81. },
  82. getLayoutHideSider(): boolean {
  83. const hideLayoutTypes = getHideLayoutTypes();
  84. if (hideLayoutTypes.includes('sider')) {
  85. return true;
  86. }
  87. return !!this.mainAppProps.hideSider;
  88. },
  89. getLayoutHideHeader(): boolean {
  90. const hideLayoutTypes = getHideLayoutTypes();
  91. if (hideLayoutTypes.includes('header')) {
  92. return true;
  93. }
  94. return !!this.mainAppProps.hideHeader;
  95. },
  96. getLayoutHideMultiTabs(): boolean {
  97. const hideLayoutTypes = getHideLayoutTypes();
  98. if (hideLayoutTypes.includes('multi-tabs')) {
  99. return true;
  100. }
  101. return !!this.mainAppProps.hideMultiTabs;
  102. },
  103. },
  104. actions: {
  105. setPageLoading(loading: boolean): void {
  106. this.pageLoading = loading;
  107. },
  108. setDarkMode(mode: ThemeEnum): void {
  109. this.darkMode = mode;
  110. localStorage.setItem(APP_DARK_MODE_KEY_, mode);
  111. this.setProjectConfig({ themeMode: mode });
  112. },
  113. setBeforeMiniInfo(state: BeforeMiniState): void {
  114. this.beforeMiniInfo = state;
  115. },
  116. setProjectConfig(config: DeepPartial<ProjectConfig>): void {
  117. this.projectConfig = deepMerge(this.projectConfig || {}, config);
  118. // update-begin--author:liaozhiyang---date:20240408---for:【QQYUN-8922】设置导航栏模式没存本地,刷新就还原了
  119. Persistent.setLocal(PROJ_CFG_KEY, this.projectConfig, true);
  120. // update-end--author:liaozhiyang---date:20240408---for:【QQYUN-8922】设置导航栏模式没存本地,刷新就还原了
  121. },
  122. async resetAllState() {
  123. resetRouter();
  124. Persistent.clearAll();
  125. },
  126. async setPageLoadingAction(loading: boolean): Promise<void> {
  127. if (loading) {
  128. clearTimeout(timeId);
  129. // Prevent flicker
  130. timeId = setTimeout(() => {
  131. this.setPageLoading(loading);
  132. }, 50);
  133. } else {
  134. this.setPageLoading(loading);
  135. clearTimeout(timeId);
  136. }
  137. },
  138. setMessageHrefParams(params: any): void {
  139. this.messageHrefParams = params;
  140. },
  141. // 设置主应用参数
  142. setMainAppProps(args: MainAppProps) {
  143. this.mainAppProps.hideHeader = args.hideHeader ?? false;
  144. this.mainAppProps.hideSider = args.hideSider ?? false;
  145. this.mainAppProps.hideMultiTabs = args.hideMultiTabs ?? false;
  146. },
  147. },
  148. });
  149. // Need to be used outside the setup
  150. export function useAppStoreWithOut() {
  151. return useAppStore(store);
  152. }