import React, { FC, ReactNode, useContext } from 'react'; import classNames from 'classnames'; import Context from '../common/context'; import { BaseBgMode, BaseProps, LayoutContextProps, TypeMark } from '../types'; const CustomCnTag = (props) => { const clsPrefix = `cn-layout-page-header`; return (
{props?.children}
); }; export interface CnLayoutHeaderProps extends BaseProps, BaseBgMode { /** * 头部标题 */ title?: string; /** * 头像 */ avatar?: { src: string }; /** * 标签 */ label?: string | string[]; /** * 描述 */ desc?: string; /** * 禁用底部 padding */ noBottomPadding?: boolean; divider?: boolean; fullWidth?: boolean; children?: ReactNode; } export type IPageHeader = FC & TypeMark; const PageHeader: IPageHeader = (props: CnLayoutHeaderProps) => { const { avatar, title, label, desc, className, children, mode, noBottomPadding, divider, fullWidth, ...others } = props; const { prefix } = useContext(Context); const clsPrefix = `${prefix}page-header`; const headerCls = classNames(className, clsPrefix, { [`${clsPrefix}--dividing`]: divider, [`${clsPrefix}--fullwidth`]: fullWidth, [`${prefix}bg--${mode}`]: !!mode, }); /** * 标签区域 */ const renderTags = () => { if (typeof label === 'string') { return {label}; } if (Array.isArray(label) && label?.length !== 0) { return (
{label?.map((text) => {text})}
); } return null; }; /** * title 区域 */ const renderTitle = () => { return (
{(title || label) && (
{title &&
{title}
} {renderTags()}
)} {desc && (
{desc}
)}
); }; return (
{avatar && (
)} {renderTitle()}
{children}
); }; PageHeader.displayName = 'Header'; PageHeader.typeMark = 'Header'; PageHeader.defaultProps = { noBottomPadding: false, divider: false, fullWidth: false, mode: 'surface', }; export default PageHeader;