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.

157 lines
4.5 KiB

import { defineStore } from 'pinia'
2 years ago
import { theme as antdTheme } from 'ant-design-vue/es'
import type { ThemeConfig } from 'ant-design-vue/es/config-provider/context'
import { reactive } from 'vue'
import type { AppSizeType, HeaderSetting, MenuSetting, MultiTabsSetting, ProjectConfig, TransitionSetting } from '@/types/config'
2 years ago
import type { BeforeMiniState } from '@/types/store'
import { store } from '@/store'
import type { ThemeEnum } from '@/enums/appEnum'
2 years ago
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
2 years ago
themeConfig: ThemeConfig
2 years ago
// 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,
2 years ago
themeConfig: {
algorithm: antdTheme.defaultAlgorithm,
token: {
colorBgContainer: '#fff',
},
components: {},
},
2 years ago
pageLoading: false,
projectConfig: Persistent.getLocal(PROJ_CFG_KEY),
beforeMiniInfo: {},
componentSize: 'middle',
2 years ago
}),
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
2 years ago
this.setThemeConfig()
2 years ago
localStorage.setItem(APP_DARK_MODE_KEY_, mode)
},
2 years ago
2 years ago
setThemeConfig(color?: string): void {
let themeConfig = reactive<ThemeConfig>({
algorithm: antdTheme.defaultAlgorithm,
token: {
colorBgContainer: '#fff',
colorPrimary: color || (this.projectConfig
? this.projectConfig.themeColor
: '#1890ff'),
},
components: {},
})
if (this.darkMode === 'dark') {
themeConfig = {
algorithm: antdTheme.darkAlgorithm,
token: {
colorBgContainer: 'rgb(36, 37, 37)',
colorPrimary: color || (this.projectConfig
? this.projectConfig.themeColor
: '#1890ff'),
},
components: {},
}
}
this.themeConfig = themeConfig
},
2 years ago
setBeforeMiniInfo(state: BeforeMiniState): void {
this.beforeMiniInfo = state
},
setComponentSize(size: AppSizeType): void {
this.componentSize = size
},
setProjectConfig(config: DeepPartial<ProjectConfig>): void {
2 years ago
this.projectConfig = deepMerge(this.projectConfig, config)
2 years ago
Persistent.setLocal(PROJ_CFG_KEY, this.projectConfig)
2 years ago
this.setThemeConfig(config.themeColor)
2 years ago
},
setMenuSetting(setting: Partial<MenuSetting>): void {
this.projectConfig.menuSetting = deepMerge(this.projectConfig.menuSetting, setting)
Persistent.setLocal(PROJ_CFG_KEY, this.projectConfig)
},
2 years ago
resetAllState() {
2 years ago
resetRouter()
Persistent.clearAll()
},
2 years ago
setPageLoadingAction(loading: boolean) {
2 years ago
if (loading) {
clearTimeout(timeId)
// Prevent flicker
timeId = setTimeout(() => {
this.setPageLoading(loading)
}, 50)
}
else {
2 years ago
this.setPageLoading(loading)
clearTimeout(timeId)
}
},
},
2 years ago
})
// Need to be used outside the setup
export function useAppStoreWithOut() {
return useAppStore(store)
}