/** * 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 } from '@eciol/locale'; import { initRequest, InternalAxiosRequestConfig } from '@eciol/request'; import { initRouterSetting, PAGE_NOT_FOUND_NAME, REDIRECT_NAME, resetRouter } from '@eciol/router'; import { initSharedComponentSetting } from '@eciol/share-ui'; import { deepMerge, getCommonStoragePrefix, getStorageShortName, SessionTimeoutProcessingEnum, setPackageVersion, ThemeEnum, useGlobSetting, } from '@eciol/shared'; import { initStoreSetting, useAppStore, useAppStoreWithOut, useLocaleStore } from '@eciol/store'; import type { ProjectConfig } from '@eciol/types'; 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, localeSetting, prefixCls, projectSetting } from '@/settings'; import { useMultipleTabStore, usePermissionStoreWithOut, useUserStore } from '@/store'; import { useUserStoreWithOut } from '@/store/modules/user'; const stp = projectSetting.sessionTimeoutProcessing; // 为了解耦 `packages/*` 下面各模块,不再相互依赖 // 如果模块相互依赖严重,则需要对外提供解耦方式,由调用方去进行参数传递 // 各个模块需要提供 `bridge` 文件作为解耦方式 async function initPackages() { const _initRequest = async () => { const { apiUrl, uploadUrl, urlPrefix } = useGlobSetting(); const { createErrorModal, createSuccessModal, createMessage } = useMessage(); const { t } = useI18n(); await initRequest(() => { return { apiUrl, urlPrefix, uploadUrl, // authenticationScheme: '', getTokenFunction: () => { const userStore = useUserStoreWithOut(); return userStore.getToken; }, requestInterceptors: (config: InternalAxiosRequestConfig) => { const userStore = useUserStoreWithOut(); userStore.cookieLose(); return config; }, errorFunction: () => {}, createMessage: () => createMessage, createSuccessModal, errorModalFunction: createErrorModal, timeoutFunction: async () => { const userStore = useUserStoreWithOut(); userStore.logout(true); }, unauthorizedFunction: (msg?: string) => { const userStore = useUserStoreWithOut(); if (stp === SessionTimeoutProcessingEnum.PAGE_COVERAGE) { userStore.setSessionTimeout(true); } else { userStore.logout(true); } return msg || t('sys.api.errMsg401'); }, handleErrorFunction: () => {}, ResultEnum, }; }); }; initStoreSetting(() => { return { useUserStore, localeSetting, PageEnum, projectSetting, resetRouter, useGo, useRedo, PAGE_NOT_FOUND_NAME, REDIRECT_NAME, }; }); initHooksSetting(() => { return { useAppStore, useMultipleTabStore, PageEnum, prefixCls, }; }); initAntdComponentSetting(() => { return { componentSetting, usePermission, theme: {}, useAppStore, localeSetting, initRequest, }; }); initSharedComponentSetting(() => { return { componentSetting, usePermission, useAppStore, }; }); initLayoutSetting(() => { return { useMultipleTabStore, useAppStore, }; }); initDirectives(() => { return { usePermission, createLoading, }; }); initRouterSetting(() => { return { PageEnum, projectSetting, RoleEnum, useAppStoreWithOut, usePermissionStoreWithOut, useUserStoreWithOut, useMultipleTabStore, LAYOUT, PAGE_NOT_FOUND_ROUTE, RootRoute: {}, isOutLogin: true, }; }); await Promise.all([_initRequest()]); } // Initial project configuration export async function initAppConfigStore() { const userStore = useUserStoreWithOut(); userStore.setTokenByCookie(); 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(); 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); } }); }); }