forked from wangjiadong/comp
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
112 lines
3.2 KiB
112 lines
3.2 KiB
import type { ProjectConfig, HeaderSetting, MenuSetting, TransitionSetting, MultiTabsSetting } from '/#/config'; |
|
import type { BeforeMiniState } from '/#/store'; |
|
|
|
import { defineStore } from 'pinia'; |
|
import { store } from '/@/store'; |
|
|
|
import { ThemeEnum } from '/@/enums/appEnum'; |
|
import { APP_DARK_MODE_KEY_, PROJ_CFG_KEY } from '/@/enums/cacheEnum'; |
|
import { Persistent } from '/@/utils/cache/persistent'; |
|
import { darkMode } from '/@/settings/designSetting'; |
|
import { resetRouter } from '/@/router'; |
|
import { deepMerge } from '/@/utils'; |
|
|
|
interface AppState { |
|
darkMode?: ThemeEnum; |
|
// Page loading status |
|
pageLoading: boolean; |
|
// project config |
|
projectConfig: ProjectConfig | null; |
|
// When the window shrinks, remember some states, and restore these states when the window is restored |
|
beforeMiniInfo: BeforeMiniState; |
|
// 页面跳转临时参数存储 |
|
messageHrefParams: any |
|
} |
|
let timeId: TimeoutHandle; |
|
export const useAppStore = defineStore({ |
|
id: 'app', |
|
state: (): AppState => ({ |
|
darkMode: undefined, |
|
pageLoading: false, |
|
projectConfig: Persistent.getLocal(PROJ_CFG_KEY), |
|
beforeMiniInfo: {}, |
|
messageHrefParams: {} |
|
}), |
|
getters: { |
|
getPageLoading(): boolean { |
|
return this.pageLoading; |
|
}, |
|
getDarkMode(): 'light' | 'dark' | string { |
|
return this.darkMode || localStorage.getItem(APP_DARK_MODE_KEY_) || darkMode; |
|
}, |
|
|
|
getBeforeMiniInfo(): BeforeMiniState { |
|
return this.beforeMiniInfo; |
|
}, |
|
|
|
getProjectConfig(): ProjectConfig { |
|
return this.projectConfig || ({} as ProjectConfig); |
|
}, |
|
|
|
getHeaderSetting(): HeaderSetting { |
|
return this.getProjectConfig.headerSetting; |
|
}, |
|
getMenuSetting(): MenuSetting { |
|
return this.getProjectConfig.menuSetting; |
|
}, |
|
getTransitionSetting(): TransitionSetting { |
|
return this.getProjectConfig.transitionSetting; |
|
}, |
|
getMultiTabsSetting(): MultiTabsSetting { |
|
return this.getProjectConfig.multiTabsSetting; |
|
}, |
|
getMessageHrefParams():any{ |
|
return this.messageHrefParams; |
|
} |
|
}, |
|
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); |
|
} |
|
}, |
|
setMessageHrefParams(params: any): void { |
|
this.messageHrefParams = params; |
|
}, |
|
|
|
}, |
|
}); |
|
|
|
// Need to be used outside the setup |
|
export function useAppStoreWithOut() { |
|
return useAppStore(store); |
|
}
|
|
|