// 运行时配置 import { getLocale, history, Link, RunTimeLayoutConfig } from '@umijs/max'; import { ConfigProvider } from 'antd'; import dayjs from 'dayjs'; import { handleRequestConfig as devRequestConfig } from '../config/request_dev'; import { handleRequestConfig as prodRequestConfig } from '../config/request_prod'; import { AvatarDropdown } from './components/Avatar/AvatarDropdown'; import IconFont from './components/IconFont'; import LanguageSwitcher from './components/Lang/LanguageSwitcher'; import ThemeProvider from './components/Theme/ThemeProvider'; import ThemeSwitcher from './components/Theme/ThemeSwitcher'; import { THEME_KEY } from './constants'; import { ROUTE_LOGIN } from './constants/routes'; import NotFoundPage from './pages/Exception/NotFound'; import UnAccessPage from './pages/Exception/UnAccess'; import { apiQueryProfile } from './services/master/AuthController'; import { checkTokenExpired } from './utils/jwt'; import { getLogoImage } from './utils/logo'; import { clearAllData, clearSessionData, getToken, removeToken, } from './utils/storage'; const isProdBuild = process.env.NODE_ENV === 'production'; export type InitialStateResponse = { getUserProfile?: () => Promise; currentUserProfile?: MasterModel.UserResponse; theme?: 'light' | 'dark'; }; // 全局初始化数据配置,用于 Layout 用户信息和权限初始化 // 更多信息见文档:https://umijs.org/docs/api/runtime-config#getinitialstate export async function getInitialState(): Promise { const userToken: string = getToken(); const { pathname } = history.location; dayjs.locale(getLocale() === 'en-US' ? 'en' : 'vi'); if (!userToken) { if (pathname !== ROUTE_LOGIN) { history.push(`${ROUTE_LOGIN}?redirect=${pathname}`); } else { history.push(ROUTE_LOGIN); } return {}; } const isTokenExpried = checkTokenExpired(userToken); if (isTokenExpried) { removeToken(); clearAllData(); clearSessionData(); window.location.href = ROUTE_LOGIN; return {}; } const getUserProfile = async () => { try { const resp = await apiQueryProfile(); return resp; } catch (error) { removeToken(); clearAllData(); clearSessionData(); window.location.href = ROUTE_LOGIN; } }; const resp = await getUserProfile(); const currentTheme = (localStorage.getItem(THEME_KEY) as 'light' | 'dark') || 'light'; return { getUserProfile: getUserProfile!, currentUserProfile: resp, theme: currentTheme, }; } export const layout: RunTimeLayoutConfig = ({ initialState }) => { const isDark = initialState?.theme === 'dark'; return { logo: getLogoImage(), menu: { locale: true, }, fixedHeader: true, contentWidth: 'Fluid', navTheme: isDark ? 'realDark' : 'light', splitMenus: true, iconfontUrl: '//at.alicdn.com/t/c/font_5096559_84vdbef39dp.js', contentStyle: { padding: 0, margin: 0, paddingInline: 0, }, actionsRender: () => [ , , ], avatarProps: { size: 'small', src: '/avatar.svg', render: () => ( ), }, childrenRender: (children) => { return ( {children} ); }, layout: 'top', menuHeaderRender: undefined, menuItemRender: (item, dom) => { if (item.path) { // Coerce values to string to satisfy TypeScript expectations const to = String(item.path ?? ''); const iconType = String(item.icon ?? ''); const label = String(item.name ?? ''); return ( {label} ); } return dom; }, token: { header: { colorBgMenuItemSelected: '#EEF7FF', // background khi chọn colorTextMenuSelected: isDark ? '#fff' : '#1A2130', // màu chữ khi chọn }, }, unAccessible: , noFound: , }; }; export const request = isProdBuild ? prodRequestConfig : devRequestConfig;