import React from 'react'; import { icons, LucideProps } from 'lucide-react'; import { FolderKanban } from 'lucide-react'; interface DynamicIconProps extends Omit { /** 图标名称(Lucide React 图标名)或 emoji */ name?: string; /** 默认图标(当找不到指定图标时显示) */ fallback?: React.ComponentType; } /** * 动态图标组件 * * 支持: * 1. Lucide React 的所有图标(通过图标名称字符串) * 2. Emoji 表情 * * @example * ```tsx * // 使用 Lucide 图标名称 * * * // 使用 emoji * * * // 自定义默认图标 * * ``` */ const DynamicIcon: React.FC = ({ name, fallback: FallbackIcon = FolderKanban, className = "h-4 w-4", ...props }) => { if (!name) { return ; } // 检测是否为 emoji(包括各种 Unicode emoji 范围) const isEmoji = name.length <= 4 && /[\u{1F300}-\u{1F9FF}\u{2600}-\u{26FF}\u{2700}-\u{27BF}\u{1F1E0}-\u{1F1FF}]/u.test(name); if (isEmoji) { return {name}; } // 从 lucide-react 的 icons 对象中动态获取图标组件 const IconComponent = icons[name as keyof typeof icons]; if (IconComponent) { return ; } // 如果找不到,显示默认图标 return ; }; export default DynamicIcon;