import './BasicLayout.less'; import type { CSSProperties } from 'react'; import { useCallback, useRef } from 'react'; import React, { useContext, useEffect, useMemo, useState } from 'react'; import type { BreadcrumbProps as AntdBreadcrumbProps, BreadcrumbProps } from 'antd/lib/breadcrumb'; import { Layout, ConfigProvider } from 'antd'; import classNames from 'classnames'; import warning from 'warning'; import useMergedState from 'rc-util/lib/hooks/useMergedState'; import useAntdMediaQuery from 'use-media-antd-query'; import { useDeepCompareEffect, useDocumentTitle, isBrowser, useMountMergeState, } from '@ant-design/pro-utils'; import Omit from 'omit.js'; import useSWR, { mutate } from 'swr'; import { getMatchMenu } from '@umijs/route-utils'; import type { HeaderViewProps } from './Header'; import Header from './Header'; import type { MenuDataItem, MessageDescriptor, Route, RouterTypes, WithFalse } from './typings'; import type { GetPageTitleProps } from './getPageTitle'; import { getPageTitleInfo } from './getPageTitle'; import type { ProSettings } from './defaultSettings'; import defaultSettings from './defaultSettings'; import type { LocaleType } from './locales'; import getLocales from './locales'; import type { BaseMenuProps } from './components/SiderMenu/BaseMenu'; import Footer from './Footer'; import RouteContext from './RouteContext'; import SiderMenu from './components/SiderMenu'; import type { SiderMenuProps } from './components/SiderMenu/SiderMenu'; import { getBreadcrumbProps } from './utils/getBreadcrumbProps'; import getMenuData from './utils/getMenuData'; import PageLoading from './components/PageLoading'; import MenuCounter from './components/SiderMenu/Counter'; import WrapContent from './WrapContent'; import compatibleLayout from './utils/compatibleLayout'; import useCurrentMenuLayoutProps from './utils/useCurrentMenuLayoutProps'; import { clearMenuItem } from './utils/utils'; import type { WaterMarkProps } from './components/WaterMark'; import { stringify } from 'use-json-comparison'; let layoutIndex = 0; export type BasicLayoutProps = Partial> & SiderMenuProps & HeaderViewProps & { pure?: boolean; /** @name logo url */ logo?: React.ReactNode | WithFalse<() => React.ReactNode>; /** @name 页面切换的时候触发 */ onPageChange?: (location?: RouterTypes['location']) => void; loading?: boolean; locale?: LocaleType; onCollapse?: (collapsed: boolean) => void; footerRender?: WithFalse< (props: HeaderViewProps, defaultDom: React.ReactNode) => React.ReactNode >; breadcrumbRender?: WithFalse< (routers: AntdBreadcrumbProps['routes']) => AntdBreadcrumbProps['routes'] >; menuItemRender?: BaseMenuProps['menuItemRender']; pageTitleRender?: WithFalse< ( props: GetPageTitleProps, defaultPageTitle?: string, info?: { // 页面标题 title: string; // locale 的 title id: string; // 页面标题不带默认的 title pageName: string; }, ) => string >; menuDataRender?: (menuData: MenuDataItem[]) => MenuDataItem[]; itemRender?: AntdBreadcrumbProps['itemRender']; formatMessage?: (message: MessageDescriptor) => string; /** 是否禁用移动端模式,有的管理系统不需要移动端模式,此属性设置为true即可 */ disableMobile?: boolean; contentStyle?: CSSProperties; isChildrenLayout?: boolean; className?: string; /** 兼用 content的 margin */ disableContentMargin?: boolean; /** PageHeader 的 BreadcrumbProps 配置,会透传下去 */ breadcrumbProps?: BreadcrumbProps; /** @name 水印的相关配置 */ waterMarkProps?: WaterMarkProps; /** @name 操作菜单重新刷新 */ actionRef?: React.MutableRefObject< | { reload: () => void; } | undefined >; }; const headerRender = ( props: BasicLayoutProps & { hasSiderMenu: boolean; }, matchMenuKeys: string[], ): React.ReactNode => { if (props.headerRender === false || props.pure) { return null; } return
; }; const footerRender = (props: BasicLayoutProps): React.ReactNode => { if (props.footerRender === false || props.pure) { return null; } if (props.footerRender) { return props.footerRender({ ...props },