import type { FC } from 'react' import { useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import { useDebounceFn } from 'ahooks' import { RiArrowDownSLine } from '@remixicon/react' import cn from '@/utils/classnames' import { PortalToFollowElem, PortalToFollowElemContent, PortalToFollowElemTrigger, } from '@/app/components/base/portal-to-follow-elem' import Input from '@/app/components/base/input' import { Tag03 } from '@/app/components/base/icons/src/vender/line/financeAndECommerce' import Checkbox from '@/app/components/base/checkbox' import type { Label } from '@/app/components/tools/labels/constant' import { useTags } from '@/app/components/plugins/hooks' type LabelSelectorProps = { value: string[] onChange: (v: string[]) => void } const LabelSelector: FC = ({ value, onChange, }) => { const { t } = useTranslation() const [open, setOpen] = useState(false) const { tags: labelList } = useTags() const [keywords, setKeywords] = useState('') const [searchKeywords, setSearchKeywords] = useState('') const { run: handleSearch } = useDebounceFn(() => { setSearchKeywords(keywords) }, { wait: 500 }) const handleKeywordsChange = (value: string) => { setKeywords(value) handleSearch() } const filteredLabelList = useMemo(() => { return labelList.filter(label => label.name.includes(searchKeywords)) }, [labelList, searchKeywords]) const selectedLabels = useMemo(() => { return value.map(v => labelList.find(l => l.name === v)?.label).join(', ') }, [value, labelList]) const selectLabel = (label: Label) => { if (value.includes(label.name)) onChange(value.filter(v => v !== label.name)) else onChange([...value, label.name]) } return (
setOpen(v => !v)} className='block' >
0 ? selectedLabels : ''} className={cn('grow truncate text-[13px] leading-[18px] text-text-secondary', !value.length && '!text-text-quaternary')}> {!value.length && t('tools.createTool.toolInput.labelPlaceholder')} {!!value.length && selectedLabels}
handleKeywordsChange(e.target.value)} onClear={() => handleKeywordsChange('')} />
{filteredLabelList.map(label => (
selectLabel(label)} > { }} />
{label.label}
))} {!filteredLabelList.length && (
{t('common.tag.noTag')}
)}
) } export default LabelSelector