import React, { useState, useMemo, useCallback } from 'react'; import { Select, Modal, Tabs } from 'antd'; import type { TabsProps } from 'antd'; import { categories, type CategoriesKeys } from '@/utils/iconFields'; import IconFont from '@/components/IconFont'; import { useTranslation } from 'react-i18next'; /** * 图标选择器组件属性 */ export interface IconSelectProps { value?: string; onChange?: (value: string | null) => void; placeholder?: string; disabled?: boolean; readonly?: boolean; } /** * 图标选择器组件 * 基于 Ant Design Select + Modal + Tabs 封装 * * @example * */ const IconSelect: React.FC = ({ value, onChange, placeholder, disabled = false, readonly = false, }) => { const { t } = useTranslation(); const [open, setOpen] = useState(false); const [selectedIcon, setSelectedIcon] = useState(value); // 同步外部 value React.useEffect(() => { setSelectedIcon(value); }, [value]); // 处理图标选择 const handleIconClick = useCallback((icon: string) => { setSelectedIcon(icon); onChange?.(icon); setOpen(false); }, [onChange]); // 处理清空 const handleClear = useCallback(() => { setSelectedIcon(undefined); onChange?.(null); }, [onChange]); // 图标列表组件 const IconsList = useCallback(({ type }: { type: CategoriesKeys }) => { return (
{categories[type].map((item) => (
handleIconClick(item)} title={item} >
))}
); }, [handleIconClick]); // Tabs 配置 const tabItems: TabsProps['items'] = useMemo(() => [ { key: 'use', label: t('xin.form.iconSelector.tabs.use'), children: , }, { key: 'suggestion', label: t('xin.form.iconSelector.tabs.suggestion'), children: , }, { key: 'direction', label: t('xin.form.iconSelector.tabs.direction'), children: , }, { key: 'editor', label: t('xin.form.iconSelector.tabs.editor'), children: , }, { key: 'data', label: t('xin.form.iconSelector.tabs.data'), children: , }, { key: 'logo', label: t('xin.form.iconSelector.tabs.logo'), children: , }, { key: 'other', label: t('xin.form.iconSelector.tabs.other'), children: , }, ], [IconsList, t]); // Select 选项 const selectOptions = useMemo(() => { if (!selectedIcon) return []; return [{ label: (
{selectedIcon}
), value: selectedIcon, }]; }, [selectedIcon]); return ( <>