import React from 'react'; import { Layout } from 'antd'; import DocumentTitle from 'react-document-title'; import deepEqual from 'lodash.isequal'; import memoizeOne from 'memoize-one'; import { connect } from 'dva'; import { ContainerQuery } from 'react-container-query'; import classNames from 'classnames'; import pathToRegexp from 'path-to-regexp'; import { formatMessage } from 'umi/locale'; import SiderMenu from '@/components/SiderMenu'; import Authorized from '@/utils/Authorized'; import SettingDrawer from '@/components/SettingDrawer'; import logo from '../assets/logo.svg'; import Footer from './Footer'; import Header from './Header'; import Context from './MenuContext'; const { Content } = Layout; const { check } = Authorized; /** * 获取面包屑映射 * @param {Object} menuData 菜单配置 */ const getBreadcrumbNameMap = memoizeOne(meun => { const routerMap = {}; const mergeMeunAndRouter = meunData => { meunData.forEach(meunItem => { if (meunItem.children) { mergeMeunAndRouter(meunItem.children); } // Reduce memory usage routerMap[meunItem.path] = meunItem; }); }; mergeMeunAndRouter(meun); return routerMap; }, deepEqual); const query = { 'screen-xs': { maxWidth: 575, }, 'screen-sm': { minWidth: 576, maxWidth: 767, }, 'screen-md': { minWidth: 768, maxWidth: 991, }, 'screen-lg': { minWidth: 992, maxWidth: 1199, }, 'screen-xl': { minWidth: 1200, maxWidth: 1599, }, 'screen-xxl': { minWidth: 1600, }, }; class BasicLayout extends React.PureComponent { constructor(props) { super(props); const { menuData } = this.props; this.getPageTitle = memoizeOne(this.getPageTitle); // Because there are many places to be. So put it here this.breadcrumbNameMap = getBreadcrumbNameMap(menuData); } state = { rendering: true, }; componentDidMount() { this.renderRef = requestAnimationFrame(() => { this.setState({ rendering: false, }); }); } componentDidUpdate() { const { menuData } = this.props; this.breadcrumbNameMap = getBreadcrumbNameMap(menuData); } componentWillUnmount() { cancelAnimationFrame(this.renderRef); } getContext() { const { location } = this.props; return { location, breadcrumbNameMap: this.breadcrumbNameMap, }; } getPageTitle = pathname => { let currRouterData = null; // match params path Object.keys(this.breadcrumbNameMap).forEach(key => { if (pathToRegexp(key).test(pathname)) { currRouterData = this.breadcrumbNameMap[key]; } }); if (!currRouterData) { return 'Ant Design Pro'; } const message = formatMessage({ id: currRouterData.locale || currRouterData.name, defaultMessage: currRouterData.name, }); return `${message} - Ant Design Pro`; }; getLayoutStyle = () => { const { fixSiderbar, collapsed, layout } = this.props; if (fixSiderbar && layout !== 'topmenu') { return { paddingLeft: collapsed ? '80px' : '256px', }; } return null; }; getContentStyle = () => { const { fixedHeader } = this.props; return { margin: '24px 24px 0', paddingTop: fixedHeader ? 64 : 0, }; }; getBashRedirect = () => { // According to the url parameter to redirect // 这里是重定向的,重定向到 url 的 redirect 参数所示地址 const urlParams = new URL(window.location.href); const redirect = urlParams.searchParams.get('redirect'); // Remove the parameters in the url if (redirect) { urlParams.searchParams.delete('redirect'); window.history.replaceState(null, 'redirect', urlParams.href); } else { const { routerData } = this.props; // get the first authorized route path in routerData const authorizedPath = Object.keys(routerData).find( item => check(routerData[item].authority, item) && item !== '/' ); return authorizedPath; } return redirect; }; handleMenuCollapse = collapsed => { const { dispatch } = this.props; dispatch({ type: 'global/changeLayoutCollapsed', payload: collapsed, }); }; render() { const { isMobile, silderTheme, layout: PropsLayout, children, location: { pathname }, } = this.props; const isTop = PropsLayout === 'topmenu'; const layout = ( {isTop && !isMobile ? null : ( )}
{children}