import './index.less'; import React from 'react'; import classNames from 'classnames'; import type { HeaderViewProps } from '../../Header'; import type { SiderMenuProps, PrivateSiderMenuProps } from '../SiderMenu/SiderMenu'; import { defaultRenderLogo, defaultRenderLogoAndTitle, defaultRenderCollapsedButton, } from '../SiderMenu/SiderMenu'; import type { PureSettings } from '../../defaultSettings'; import TopNavHeader from '../TopNavHeader'; import type { MenuDataItem } from '../../index'; import type { WithFalse } from '../../typings'; import { clearMenuItem } from '../../utils/utils'; export type GlobalHeaderProps = { collapsed?: boolean; onCollapse?: (collapsed: boolean) => void; isMobile?: boolean; logo?: React.ReactNode; menuRender?: WithFalse<(props: HeaderViewProps, defaultDom: React.ReactNode) => React.ReactNode>; rightContentRender?: WithFalse<(props: HeaderViewProps) => React.ReactNode>; className?: string; prefixCls?: string; menuData?: MenuDataItem[]; onMenuHeaderClick?: (e: React.MouseEvent) => void; style?: React.CSSProperties; menuHeaderRender?: SiderMenuProps['menuHeaderRender']; collapsedButtonRender?: SiderMenuProps['collapsedButtonRender']; splitMenus?: boolean; } & Partial; const renderLogo = ( menuHeaderRender: SiderMenuProps['menuHeaderRender'], logoDom: React.ReactNode, ) => { if (menuHeaderRender === false) { return null; } if (menuHeaderRender) { return menuHeaderRender(logoDom, null); } return logoDom; }; const GlobalHeader: React.FC = (props) => { const { isMobile, logo, collapsed, onCollapse, collapsedButtonRender = defaultRenderCollapsedButton, rightContentRender, menuHeaderRender, onMenuHeaderClick, className: propClassName, style, layout, children, headerTheme = 'dark', splitMenus, menuData, prefixCls, } = props; const baseClassName = `${prefixCls}-global-header`; const className = classNames(propClassName, baseClassName, { [`${baseClassName}-layout-${layout}`]: layout && headerTheme === 'dark', }); if (layout === 'mix' && !isMobile && splitMenus) { const noChildrenMenuData = (menuData || []).map((item) => ({ ...item, children: undefined, })); const clearMenuData = clearMenuItem(noChildrenMenuData); return ( ); } const logoDom = ( {defaultRenderLogo(logo)} ); return (
{isMobile && renderLogo(menuHeaderRender, logoDom)} {isMobile && collapsedButtonRender && ( { if (onCollapse) { onCollapse(!collapsed); } }} > {collapsedButtonRender(collapsed)} )} {layout === 'mix' && !isMobile && ( <>
{defaultRenderLogoAndTitle({ ...props, collapsed: false }, 'headerTitleRender')}
)}
{children}
{rightContentRender && rightContentRender(props)}
); }; export default GlobalHeader;