/** * Application configuration */ import { createLoading, initAntdComponentSetting, useMessage } from '@eciol/ant-ui'; import { initDirectives } from '@eciol/directives'; import { changeTheme, initHooksSetting, updateColorWeak, updateDarkTheme, updateGrayMode, updateHeaderBgColor, updateSidebarBgColor, useGo, useRedo, } from '@eciol/hooks'; import { initLayoutSetting } from '@eciol/layout'; import { useI18n, useLocale } from '@eciol/locale'; import { AxiosResponse, initRequest, request } from '@eciol/request'; import { initRouterSetting, resetRouter } from '@eciol/router'; import { initSharedComponentSetting } from '@eciol/share-ui'; import { deepMerge, getCommonStoragePrefix, getStorageShortName, LOCALE, PAGE_NOT_FOUND_NAME, Persistent, REDIRECT_NAME, SessionTimeoutProcessingEnum, setPackageVersion, ThemeEnum, useGlobSetting, } from '@eciol/shared'; import { initStoreSetting, useAppStore, useAppStoreWithOut, useLocaleStore, useMultipleTabStore, } from '@eciol/store'; import type { ProjectConfig, RequestResult } from '@eciol/types'; import { Api } from '@/api/sys/user'; import { ResultEnum, RoleEnum } from '@/enums'; import { PageEnum } from '@/enums/pageEnum'; import { usePermission } from '@/hooks/web/usePermission'; import { LAYOUT } from '@/router/constant'; import { PAGE_NOT_FOUND_ROUTE } from '@/router/routes/basic'; import componentSetting from '@/settings/componentSetting'; import { prefixCls } from '@/settings/designSetting'; import { localeSetting } from '@/settings/localeSetting'; import projectSetting from '@/settings/projectSetting'; import { DOC_URL } from '@/settings/siteSetting'; import { usePermissionStore, usePermissionStoreWithOut } from '@/store/modules/permission'; import { useUserStore, useUserStoreWithOut } from '@/store/modules/user'; import { version } from '../../package.json'; const stp = projectSetting.sessionTimeoutProcessing; // 为了解耦 `packages/*` 下面各模块,不再相互依赖 // 如果模块相互依赖严重,则需要对外提供解耦方式,由调用方去进行参数传递 // 各个模块需要提供 `bridge` 文件作为解耦方式 async function initPackages() { const _initRequest = async () => { const { apiUrl, uploadUrl } = useGlobSetting(); const { createErrorModal, createSuccessModal, createMessage } = useMessage(); const { t } = useI18n(); await initRequest(() => { return { apiUrl, uploadUrl, authenticationScheme: '', getTokenFunction: () => { const userStore = useUserStoreWithOut(); return userStore.getToken; }, errorFunction: () => {}, createMessage: () => createMessage, createSuccessModal, errorModalFunction: createErrorModal, timeoutFunction: async (res: AxiosResponse) => { const userStore = useUserStoreWithOut(); if (res.config.url?.includes(Api.RefreshLogin) || !userStore.getRefreshToken) { userStore.setToken(undefined); userStore.logout(true); return false; } try { await userStore.refreshLogin(); return request.getAxios()( deepMerge(res.config, { headers: { Authorization: userStore.getToken } }), ); } catch { userStore.setToken(undefined); userStore.logout(true); } }, unauthorizedFunction: (msg?: string) => { const userStore = useUserStoreWithOut(); userStore.setToken(undefined); if (stp === SessionTimeoutProcessingEnum.PAGE_COVERAGE) { userStore.setSessionTimeout(true); } else { userStore.logout(true); } return msg || t('sys.api.errMsg401'); }, handleErrorFunction: () => {}, }; }); }; initStoreSetting(() => { return { useUserStore, localeSetting, PageEnum, projectSetting, resetRouter, useGo, useRedo, PAGE_NOT_FOUND_NAME, REDIRECT_NAME, }; }); initHooksSetting(() => { return { useAppStore, useUserStore, useMultipleTabStore, PageEnum, prefixCls, }; }); initAntdComponentSetting(() => { return { componentSetting, usePermission, theme: {}, useAppStore, localeSetting, initRequest, }; }); initSharedComponentSetting(() => { return { componentSetting, usePermission, useAppStore, }; }); initLayoutSetting(() => { return { useMultipleTabStore, useAppStore, useUserStore, usePermissionStore, projectSetting, DOC_URL, }; }); initDirectives(() => { return { usePermission, createLoading, }; }); initRouterSetting(() => { return { PageEnum, projectSetting, RoleEnum, useAppStoreWithOut, usePermissionStoreWithOut, useUserStoreWithOut, useMultipleTabStore, LAYOUT, PAGE_NOT_FOUND_ROUTE, RootRoute: {}, isOutLogin: false, }; }); setPackageVersion(version); await Promise.all([_initRequest()]); } // Initial project configuration export async function initAppConfigStore() { await initPackages(); const localeStore = useLocaleStore(); const appStore = useAppStore(); let projCfg: ProjectConfig = appStore.getProjectConfig as ProjectConfig; projCfg = deepMerge(projectSetting, projCfg || {}); const darkMode = appStore.getDarkMode; const { colorWeak, grayMode, themeColor, headerSetting: { bgColor: headerBgColor } = {}, menuSetting: { bgColor } = {}, } = projCfg; try { grayMode && updateGrayMode(grayMode); colorWeak && updateColorWeak(colorWeak); } catch (error) { console.log(error); } appStore.setProjectConfig(projCfg); // init dark mode updateDarkTheme(darkMode); if (darkMode === ThemeEnum.DARK) { updateHeaderBgColor(); updateSidebarBgColor(); } else { headerBgColor && updateHeaderBgColor(headerBgColor); bgColor && updateSidebarBgColor(bgColor); } changeTheme(themeColor); // init store localeStore.initLocale(); const { changeLocale } = useLocale(); await changeLocale(LOCALE.EN_US); setTimeout(() => { clearObsoleteStorage(); }, 16); } /** * As the version continues to iterate, there will be more and more cache keys stored in localStorage. * This method is used to delete useless keys */ export function clearObsoleteStorage() { const commonPrefix = getCommonStoragePrefix(); const shortPrefix = getStorageShortName(); [localStorage, sessionStorage].forEach((item: Storage) => { Object.keys(item).forEach((key) => { if (key && key.startsWith(commonPrefix) && !key.startsWith(shortPrefix)) { item.removeItem(key); } }); }); }