import type { ProjectConfig } from '/@/types/config'; import { VuexModule, getModule, Module, Mutation, Action } from 'vuex-module-decorators'; import store from '/@/store'; import { PROJ_CFG_KEY, LOCK_INFO_KEY } from '/@/enums/cacheEnum'; import { hotModuleUnregisterModule } from '/@/utils/helper/vuexHelper'; import { setLocal, getLocal, removeLocal, clearSession, clearLocal, } from '/@/utils/helper/persistent'; import { deepMerge } from '/@/utils'; import { resetRouter } from '/@/router'; import { permissionStore } from './permission'; import { tabStore } from './tab'; import { userStore } from './user'; export interface LockInfo { pwd: string | undefined; isLock: boolean; } let timeId: TimeoutHandle; const NAME = 'app'; hotModuleUnregisterModule(NAME); @Module({ dynamic: true, namespaced: true, store, name: NAME }) class App extends VuexModule { // Page loading status private pageLoadingState = false; // project config private projectConfigState: ProjectConfig | null = getLocal(PROJ_CFG_KEY); // lock info private lockInfoState: LockInfo | null = getLocal(LOCK_INFO_KEY); // set main overflow hidden private lockMainScrollState = false; get getPageLoading() { return this.pageLoadingState; } get getLockMainScrollState() { return this.lockMainScrollState; } get getLockInfo(): LockInfo { return this.lockInfoState || ({} as LockInfo); } get getProjectConfig(): ProjectConfig { return this.projectConfigState || ({} as ProjectConfig); } @Mutation commitPageLoadingState(loading: boolean): void { this.pageLoadingState = loading; } @Mutation commitLockMainScrollState(lock: boolean): void { this.lockMainScrollState = lock; } @Mutation commitProjectConfigState(proCfg: DeepPartial): void { this.projectConfigState = deepMerge(this.projectConfigState || {}, proCfg); setLocal(PROJ_CFG_KEY, this.projectConfigState); } @Mutation commitLockInfoState(info: LockInfo): void { this.lockInfoState = Object.assign({}, this.lockInfoState, info); setLocal(LOCK_INFO_KEY, this.lockInfoState); } @Mutation resetLockInfo(): void { removeLocal(LOCK_INFO_KEY); this.lockInfoState = null; } @Action async resumeAllState() { resetRouter(); clearSession(); clearLocal(); permissionStore.commitResetState(); tabStore.commitResetState(); userStore.commitResetState(); } @Action public async setPageLoadingAction(loading: boolean): Promise { if (loading) { clearTimeout(timeId); // Prevent flicker timeId = setTimeout(() => { this.commitPageLoadingState(loading); }, 50); } else { this.commitPageLoadingState(loading); clearTimeout(timeId); } } /** * @description: unlock page */ @Action public async unLockAction({ password, valid = true }: { password: string; valid?: boolean }) { if (!valid) { this.resetLockInfo(); return true; } const tryLogin = async () => { try { const username = userStore.getUserInfoState.username; const res = await userStore.login({ username, password }, false); if (res) { this.resetLockInfo(); } return res; } catch (error) { return false; } }; if (this.getLockInfo) { if (this.getLockInfo.pwd === password) { this.resetLockInfo(); return true; } const res = await tryLogin(); return res; } const res = await tryLogin(); return res; } } export const appStore = getModule(App);