import { Icon, Markdown, Snippet } from '@lobehub/ui'; import { Divider, Space, Typography } from 'antd'; import { useResponsive } from 'antd-style'; import { Edit3, Github } from 'lucide-react'; import { type ReactNode, memo } from 'react'; import { Flexbox, FlexboxProps } from 'react-layout-kit'; import { ApiHeaderConfig } from '@/types'; import { useStyles } from './style'; /** * @title ApiHeaderProps * @category Props * @description ApiHeader 组件的 props 类型定义 */ export interface ApiHeaderProps extends ApiHeaderConfig { /** * @title 组件名 * @description ApiHeader 组件的名称 */ componentName?: string; /** * @title 是否默认导入 * @description 是否默认导入组件 * @default false */ defaultImport?: boolean; /** * @title 描述 * @description ApiHeader 组件的描述信息 */ description?: string; /** * @title 标题 * @description ApiHeader 组件的标题 */ title: string; } /** * @title ApiHeader 配置项 */ export interface ApiTitleProps extends ApiHeaderProps { /** * @title 服务列表 * @description 可选,若存在则展示 API 服务列表 */ serviceList?: ServiceItem[]; /** * @title 标题 */ title: string; } export interface ServiceItem { /** * @title 服务描述 */ children: string; /** * @title 服务图标 */ icon: ReactNode; /** * @title 服务标签 */ label: string; /** * @title 服务链接 */ url: string; } export const ApiHeader = memo( ({ title, type, componentName, description, defaultImport, pkg, sourceUrl, docUrl, serviceList = [], ...rest }) => { const { styles } = useStyles(); const { mobile } = useResponsive(); const isDoc = type === 'doc'; const items = [ sourceUrl && { children: 'Source', icon: , url: sourceUrl, }, docUrl && { children: 'Edit', icon: , url: docUrl, }, ].filter(Boolean) as ServiceItem[]; const importString = defaultImport ? `import ${componentName} from '${pkg}';` : `import { ${componentName} } from '${pkg}';`; return ( {title} {description && {description}} {!isDoc && ( {componentName && (
{importString}
)} } wrap> {serviceList.map((item) => ( {item.icon} {item.children} ))} }> {items.map((item, index) => ( {item.icon} {item.children} ))}
)}
); }, );