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.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.

111 lines
3.2 KiB

2 years ago
import type { ProjectConfig, HeaderSetting, MenuSetting, TransitionSetting, MultiTabsSetting, AppSizeType } from '@/types/config'
import type { BeforeMiniState } from '@/types/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
componentSize: 'small' | 'middle' | 'large' | undefined
}
let timeId: TimeoutHandle
export const useAppStore = defineStore('app', {
state: (): AppState => ({
darkMode: undefined,
pageLoading: false,
projectConfig: Persistent.getLocal(PROJ_CFG_KEY),
beforeMiniInfo: {},
componentSize: 'middle'
}),
getters: {
getPageLoading(state): boolean {
return state.pageLoading
2 years ago
},
getDarkMode(state): 'light' | 'dark' | string {
return state.darkMode || localStorage.getItem(APP_DARK_MODE_KEY_) || darkMode
2 years ago
},
getBeforeMiniInfo(state): BeforeMiniState {
return state.beforeMiniInfo
2 years ago
},
getProjectConfig(state): ProjectConfig {
return state.projectConfig || ({} as ProjectConfig)
2 years ago
},
getHeaderSetting(): HeaderSetting {
return this.getProjectConfig.headerSetting
},
getMenuSetting(): MenuSetting {
return this.getProjectConfig.menuSetting
},
getTransitionSetting(): TransitionSetting {
return this.getProjectConfig.transitionSetting
},
getMultiTabsSetting(): MultiTabsSetting {
return this.getProjectConfig.multiTabsSetting
},
getComponentSize(state): AppSizeType | undefined {
return state.componentSize
2 years ago
}
},
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
},
setComponentSize(size: AppSizeType): void {
this.componentSize = size
},
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 useAppStoreWithOut() {
return useAppStore(store)
}