import React, { useCallback, useState, useRef, forwardRef, useImperativeHandle, ForwardedRef } from 'react'; import { useRouter } from 'next/router'; import { Box, Flex, Button, FormControl, IconButton, Input } from '@chakra-ui/react'; import { QuestionOutlineIcon, DeleteIcon } from '@chakra-ui/icons'; import { delDatasetById } from '@/web/core/dataset/api'; import { useSelectFile } from '@/web/common/file/hooks/useSelectFile'; import { useToast } from '@/web/common/hooks/useToast'; import { useDatasetStore } from '@/web/core/dataset/store/dataset'; import { useConfirm } from '@/web/common/hooks/useConfirm'; import { UseFormReturn } from 'react-hook-form'; import { compressImgAndUpload } from '@/web/common/file/controller'; import type { DatasetItemType } from '@fastgpt/global/core/dataset/type.d'; import Avatar from '@/components/Avatar'; import Tag from '@/components/Tag'; import MyTooltip from '@/components/MyTooltip'; import { useTranslation } from 'next-i18next'; import PermissionRadio from '@/components/support/permission/Radio'; import MySelect from '@/components/Select'; import { qaModelList } from '@/web/common/system/staticData'; export interface ComponentRef { initInput: (tags: string) => void; } const Info = ( { datasetId, form }: { datasetId: string; form: UseFormReturn }, ref: ForwardedRef ) => { const { t } = useTranslation(); const { getValues, formState, setValue, register, handleSubmit } = form; const InputRef = useRef(null); const { toast } = useToast(); const router = useRouter(); const [btnLoading, setBtnLoading] = useState(false); const [refresh, setRefresh] = useState(false); const { openConfirm, ConfirmModal } = useConfirm({ content: '确认删除该知识库?数据将无法恢复,请确认!' }); const { File, onOpen: onOpenSelectFile } = useSelectFile({ fileType: '.jpg,.png', multiple: false }); const { datasetDetail, loadDatasetDetail, loadDatasets, updateDataset } = useDatasetStore(); /* 点击删除 */ const onclickDelKb = useCallback(async () => { setBtnLoading(true); try { await delDatasetById(datasetId); toast({ title: '删除成功', status: 'success' }); router.replace(`/dataset/list`); await loadDatasets(); } catch (err: any) { toast({ title: err?.message || '删除失败', status: 'error' }); } setBtnLoading(false); }, [setBtnLoading, datasetId, toast, router, loadDatasets]); const saveSubmitSuccess = useCallback( async (data: DatasetItemType) => { setBtnLoading(true); try { await updateDataset({ id: datasetId, ...data }); toast({ title: '更新成功', status: 'success' }); loadDatasets(); } catch (err: any) { toast({ title: err?.message || '更新失败', status: 'error' }); } setBtnLoading(false); }, [updateDataset, datasetId, loadDatasetDetail, toast, loadDatasets] ); const saveSubmitError = useCallback(() => { // deep search message const deepSearch = (obj: any): string => { if (!obj) return '提交表单错误'; if (!!obj.message) { return obj.message; } return deepSearch(Object.values(obj)[0]); }; toast({ title: deepSearch(formState.errors), status: 'error', duration: 4000, isClosable: true }); }, [formState.errors, toast]); const onSelectFile = useCallback( async (e: File[]) => { const file = e[0]; if (!file) return; try { const src = await compressImgAndUpload({ file, maxW: 100, maxH: 100 }); setValue('avatar', src); setRefresh((state) => !state); } catch (err: any) { toast({ title: typeof err === 'string' ? err : '头像选择异常', status: 'warning' }); } }, [setRefresh, setValue, toast] ); useImperativeHandle(ref, () => ({ initInput: (tags: string) => { if (InputRef.current) { InputRef.current.value = tags; } } })); return ( 知识库 ID {datasetDetail._id} 索引模型 {getValues('vectorModel').name} MaxTokens {getValues('vectorModel').maxToken} 知识库头像 知识库名称 {t('dataset.Agent Model')} ({ label: item.name, value: item.model }))} onchange={(e) => { const agentModel = qaModelList.find((item) => item.model === e); if (!agentModel) return; setValue('agentModel', agentModel); setRefresh((state) => !state); }} /> 标签 { setValue('tags', e.target.value.split(' ').filter(Boolean)); setRefresh(!refresh); }} /> {getValues('tags') .filter(Boolean) .map((item, i) => ( {item} ))} {datasetDetail.isOwner && ( {t('user.Permission')} { setValue('permission', e); setRefresh(!refresh); }} /> )} {datasetDetail.isOwner && ( } aria-label={''} variant={'outline'} size={'sm'} _hover={{ color: 'red.600', borderColor: 'red.600' }} onClick={openConfirm(onclickDelKb)} /> )} ); }; export default forwardRef(Info);