| import React from 'react'; | 
| import { Footer, Question, SelectLang, AvatarDropdown, AvatarName, Brightness, LayoutSwitch, FullScreen } from '@/components'; | 
| import { LinkOutlined } from '@ant-design/icons'; | 
| import { SettingDrawer } from '@ant-design/pro-components'; | 
| import { history, Link } from '@umijs/max'; | 
| import defaultSettings from '../config/defaultSettings'; | 
| import { errorConfig } from './requestErrorConfig'; | 
| import { getRemoteMenu, getRoutersInfo, getUserInfo, setRemoteMenu, patchRouteWithRemoteMenus } from './services/route'; | 
| import { getToken, setToken } from '@/utils/token-util' | 
| import { TOKEN_HEADER_NAME, TOKEN_STORE_NAME } from '@/config/setting'; | 
| import { API_BASE_URL, API_TIMEOUT } from '@/config/setting' | 
| import { message } from 'antd'; | 
|   | 
| import logo from '../public/img/logo.png' | 
| import logoDark from '../public/img/logo-dark.png' | 
|   | 
| const isDev = process.env.NODE_ENV === 'development'; | 
| const loginPath = '/user/login'; | 
| const defaultAvatar = 'https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png' | 
|   | 
| // https://xflow.antv.vision/zh-CN/docs/tutorial/solutions/dag DAG 流程图 | 
| export function render(oldRender) { | 
|   const token = getToken(); | 
|   if (!token || token?.length === 0) { | 
|     oldRender(); | 
|     return; | 
|   } | 
|   getRoutersInfo().then(res => { | 
|     setRemoteMenu(res); | 
|     oldRender(); | 
|   }); | 
| } | 
|   | 
| export async function patchClientRoutes({ routes }) { | 
|   patchRouteWithRemoteMenus(routes); | 
| } | 
|   | 
| export async function onRouteChange({ clientRoutes, location }) { | 
|   const menus = getRemoteMenu(); | 
|   if (menus === null && location.pathname !== loginPath) { | 
|     history.go(0); | 
|   } | 
| } | 
|   | 
| /** | 
|  * @see  https://umijs.org/zh-CN/plugins/plugin-initial-state | 
|  * */ | 
| export async function getInitialState() { | 
|   const fetchUserInfo = async () => { | 
|     try { | 
|       const { data: userInfo } = await getUserInfo({ | 
|         skipErrorHandler: true, | 
|       }); | 
|       if (userInfo?.avatar === '') { | 
|         userInfo.avatar = defaultAvatar; | 
|       } | 
|       userInfo.name = userInfo.nickname; | 
|       return { | 
|         ...userInfo | 
|       }; | 
|     } catch (error) { | 
|       console.log(error); | 
|       history.push(loginPath); | 
|     } | 
|     return undefined; | 
|   }; | 
|   // 如果不是登录页面,执行 | 
|   const { location } = history; | 
|   if (location.pathname !== loginPath) { | 
|     const currentUser = await fetchUserInfo(); | 
|     return { | 
|       fetchUserInfo, | 
|       currentUser, | 
|       settings: defaultSettings, | 
|     }; | 
|   } | 
|   return { | 
|     memo: 'create by vincent', | 
|     fetchUserInfo, | 
|     settings: defaultSettings, | 
|   }; | 
| } | 
|   | 
| // ProLayout 支持的api https://procomponents.ant.design/components/layout | 
| // 优先级 layout > config > defaultSetting | 
| export const layout = ({ initialState, setInitialState }) => { | 
|   const [darkMode, setDarkMode] = React.useState(() => { | 
|     const storedValue = localStorage.getItem('darkMode'); | 
|     return storedValue !== null ? JSON.parse(storedValue) : false; | 
|   }); | 
|   | 
|   const [layoutMode, setLayoutMode] = React.useState(() => { | 
|     const storedValue = localStorage.getItem('layoutMode'); | 
|     return storedValue !== null ? JSON.parse(storedValue) : true; | 
|   }); | 
|   | 
|   const [fullScreen, setFullScreen] = React.useState(false); | 
|   | 
|   React.useEffect(() => { | 
|     localStorage.setItem('darkMode', JSON.stringify(darkMode)); | 
|     localStorage.setItem('layoutMode', JSON.stringify(layoutMode)); | 
|   }, [darkMode, layoutMode]); | 
|   | 
|   return { | 
|     actionsRender: () => [ | 
|       // <Question key="doc" />, | 
|       <SelectLang key="SelectLang" />, | 
|       <FullScreen fullScreen={fullScreen} setFullScreen={setFullScreen} />, | 
|       <LayoutSwitch layoutMode={layoutMode} setLayoutMode={setLayoutMode} />, | 
|       <Brightness darkMode={darkMode} setDarkMode={setDarkMode} />, | 
|     ], | 
|     avatarProps: { | 
|       src: initialState?.currentUser?.avatar, | 
|       title: <AvatarName />, | 
|       render: (_, avatarChildren) => { | 
|         return <AvatarDropdown>{avatarChildren}</AvatarDropdown>; | 
|       }, | 
|     }, | 
|     menu: { | 
|       locale: false, | 
|       // 每当 initialState?.currentUser?.userid 发生修改时重新执行 request | 
|       params: { | 
|         userId: initialState?.currentUser?.id, | 
|       }, | 
|       request: async () => { | 
|         if (!initialState?.currentUser?.id) { | 
|           return []; | 
|         } | 
|         return getRemoteMenu(); | 
|       }, | 
|     }, | 
|     footerRender: () => <Footer />, | 
|     onPageChange: () => { | 
|       const { location } = history; | 
|       // 如果没有登录,重定向到 login | 
|       if (!initialState?.currentUser && location.pathname !== loginPath) { | 
|         history.push(loginPath); | 
|       } | 
|     }, | 
|     // token: { | 
|     //   bgLayout: '#fff', | 
|     //   header: { | 
|     //     colorBgHeader: '#fff', | 
|     //   }, | 
|     //   sider: { | 
|     //     colorMenuBackground: '#fff', | 
|     //   }, | 
|     //   pageContainer: { | 
|     //     colorBgPageContainer: '#fff', | 
|     //   }, | 
|     // }, | 
|     bgLayoutImgList: [ | 
|       // { | 
|       //   src: 'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/D2LWSqNny4sAAAAAAAAAAAAAFl94AQBr', | 
|       //   left: 85, | 
|       //   bottom: 100, | 
|       //   height: '303px', | 
|       // }, | 
|       // { | 
|       //   src: 'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/C2TWRpJpiC0AAAAAAAAAAAAAFl94AQBr', | 
|       //   bottom: -68, | 
|       //   right: -45, | 
|       //   height: '303px', | 
|       // }, | 
|       // { | 
|       //   src: 'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/F6vSTbj8KpYAAAAAAAAAAAAAFl94AQBr', | 
|       //   bottom: 0, | 
|       //   left: 0, | 
|       //   width: '331px', | 
|       // }, | 
|     ], | 
|     // 显示在菜单右下角的快捷操作 | 
|     links: [], | 
|     menuHeaderRender: undefined, | 
|     // 自定义 403 页面 | 
|     // unAccessible: <div>unAccessible</div>, | 
|     // 增加一个 loading 的状态 | 
|     childrenRender: (children) => { | 
|       // if (initialState?.loading) return <PageLoading />; | 
|       return ( | 
|         <> | 
|           {children} | 
|           {/* {isDev && ( | 
|             <SettingDrawer | 
|               disableUrlParams | 
|               enableDarkTheme | 
|               settings={initialState?.settings} | 
|               onSettingChange={(settings) => { | 
|                 console.log(settings); | 
|                 setInitialState((preInitialState) => ({ | 
|                   ...preInitialState, | 
|                   settings, | 
|                 })); | 
|               }} | 
|             /> | 
|           )} */} | 
|         </> | 
|       ); | 
|     }, | 
|     ...initialState?.settings, | 
|     layout: layoutMode ? 'top' : 'mix',  // layout 的菜单模式,side:右侧导航,top:顶部导航 | 
|     // contentStyle: () => {  //     layout 的内容区 style | 
|     //   return  | 
|     // }, | 
|     contentWidth: 'Fluid', // layout 的内容模式,Fluid:自适应(全屏),Fixed:定宽 (小) 1200px | 
|     fixedHeader: true,  // 固定 header | 
|     fixSiderbar: true,  // 固定导航 | 
|     // settings: defaultSettings, // layout 的设置 | 
|     // waterMarkProps: { content: initialState?.currentUser?.nickname }, //水印 | 
|     // navTheme: 'realDark', // 默认主题颜色  "realDark" | "light" | undef... | 
|     navTheme: darkMode ? 'realDark' : 'light', | 
|     footerRender: false,  // 页脚 启用请注释,不是设置为true | 
|     logo: darkMode | 
|       ? <img src={logo} className='header-logo' /> | 
|       : <img src={logoDark} className='header-logo' /> | 
|     , | 
|     title: ( | 
|       <div className='header-title'> | 
|       </div> | 
|     ), | 
|     colorWeak: true, | 
|   }; | 
| }; | 
|   | 
|   | 
| /** | 
|  * @name request 配置,可以配置错误处理 | 
|  * 它基于 axios 和 ahooks 的 useRequest 提供了一套统一的网络请求和错误处理方案。 | 
|  * @doc https://umijs.org/docs/max/request#配置 | 
|  */ | 
| export const request = { | 
|   baseURL: API_BASE_URL, | 
|   ...errorConfig, | 
|   timeout: API_TIMEOUT * 1000, | 
|   // 前置守卫 | 
|   requestInterceptors: [ | 
|     (url, options) => { | 
|       const token = getToken(); | 
|       if (token && options.headers) { | 
|         options.headers[TOKEN_HEADER_NAME] = token; | 
|       } | 
|       return { url, options }; | 
|     } | 
|   ], | 
|   // 后置守卫 | 
|   responseInterceptors: [ | 
|     (response) => { | 
|       if (response?.data?.code === 401) { | 
|         // message.error(intl.formatMessage({ | 
|         //   id: 'pages.login.failure', | 
|         //   defaultMessage: '登录失败,请重试!', | 
|         // })); | 
|         history.push(loginPath) | 
|       } | 
|       const token = response.headers[TOKEN_HEADER_NAME]; | 
|       if (token) { | 
|         setToken(token); | 
|       } | 
|       return response; | 
|     } | 
|   ] | 
| }; |