|
import { DocumentParserType } from '@/constants/knowledge'; |
|
import { useTranslate } from '@/hooks/common-hooks'; |
|
import { useFetchKnowledgeList } from '@/hooks/knowledge-hooks'; |
|
import { UserOutlined } from '@ant-design/icons'; |
|
import { Avatar as AntAvatar, Form, Select, Space } from 'antd'; |
|
import { Book } from 'lucide-react'; |
|
import { useFormContext } from 'react-hook-form'; |
|
import { Avatar, AvatarFallback, AvatarImage } from './ui/avatar'; |
|
import { FormControl, FormField, FormItem, FormLabel } from './ui/form'; |
|
import { MultiSelect } from './ui/multi-select'; |
|
|
|
interface KnowledgeBaseItemProps { |
|
required?: boolean; |
|
onChange?(): void; |
|
} |
|
|
|
const KnowledgeBaseItem = ({ |
|
required = true, |
|
onChange, |
|
}: KnowledgeBaseItemProps) => { |
|
const { t } = useTranslate('chat'); |
|
|
|
const { list: knowledgeList } = useFetchKnowledgeList(true); |
|
|
|
const filteredKnowledgeList = knowledgeList.filter( |
|
(x) => x.parser_id !== DocumentParserType.Tag, |
|
); |
|
|
|
const knowledgeOptions = filteredKnowledgeList.map((x) => ({ |
|
label: ( |
|
<Space> |
|
<AntAvatar size={20} icon={<UserOutlined />} src={x.avatar} /> |
|
{x.name} |
|
</Space> |
|
), |
|
value: x.id, |
|
})); |
|
|
|
return ( |
|
<Form.Item |
|
label={t('knowledgeBases')} |
|
name="kb_ids" |
|
tooltip={t('knowledgeBasesTip')} |
|
rules={[ |
|
{ |
|
required, |
|
message: t('knowledgeBasesMessage'), |
|
type: 'array', |
|
}, |
|
]} |
|
> |
|
<Select |
|
mode="multiple" |
|
options={knowledgeOptions} |
|
placeholder={t('knowledgeBasesMessage')} |
|
onChange={onChange} |
|
></Select> |
|
</Form.Item> |
|
); |
|
}; |
|
|
|
export default KnowledgeBaseItem; |
|
|
|
export function KnowledgeBaseFormField() { |
|
const form = useFormContext(); |
|
const { t } = useTranslate('chat'); |
|
|
|
const { list: knowledgeList } = useFetchKnowledgeList(true); |
|
|
|
const filteredKnowledgeList = knowledgeList.filter( |
|
(x) => x.parser_id !== DocumentParserType.Tag, |
|
); |
|
|
|
const knowledgeOptions = filteredKnowledgeList.map((x) => ({ |
|
label: x.name, |
|
value: x.id, |
|
icon: () => ( |
|
<Avatar className="size-4 mr-2"> |
|
<AvatarImage src={x.avatar} /> |
|
<AvatarFallback> |
|
<Book /> |
|
</AvatarFallback> |
|
</Avatar> |
|
), |
|
})); |
|
|
|
return ( |
|
<FormField |
|
control={form.control} |
|
name="kb_ids" |
|
render={({ field }) => ( |
|
<FormItem> |
|
<FormLabel>{t('knowledgeBases')}</FormLabel> |
|
<FormControl> |
|
<MultiSelect |
|
options={knowledgeOptions} |
|
onValueChange={field.onChange} |
|
placeholder={t('knowledgeBasesMessage')} |
|
variant="inverted" |
|
maxCount={100} |
|
defaultValue={field.value} |
|
{...field} |
|
/> |
|
</FormControl> |
|
</FormItem> |
|
)} |
|
/> |
|
); |
|
} |
|
|