import React, { useEffect, useState } from 'react'; import { Box, Flex, Input } from '@chakra-ui/react'; import { useSelectFile } from '@/web/common/file/hooks/useSelectFile'; import { useConfirm } from '@fastgpt/web/hooks/useConfirm'; import { useForm } from 'react-hook-form'; import { compressImgFileAndUpload } from '@/web/common/file/controller'; import type { DatasetItemType } from '@fastgpt/global/core/dataset/type.d'; import Avatar from '@fastgpt/web/components/common/Avatar'; import { useTranslation } from 'next-i18next'; import { useSystemStore } from '@/web/common/system/useSystemStore'; import { useRequest2 } from '@fastgpt/web/hooks/useRequest'; import { MongoImageTypeEnum } from '@fastgpt/global/common/file/image/constants'; import AIModelSelector from '@/components/Select/AIModelSelector'; import { postRebuildEmbedding } from '@/web/core/dataset/api'; import type { VectorModelItemType } from '@fastgpt/global/core/ai/model.d'; import { useContextSelector } from 'use-context-selector'; import { DatasetPageContext } from '@/web/core/dataset/context/datasetPageContext'; import MyDivider from '@fastgpt/web/components/common/MyDivider/index'; import { DatasetTypeEnum, DatasetTypeMap } from '@fastgpt/global/core/dataset/constants'; import QuestionTip from '@fastgpt/web/components/common/MyTooltip/QuestionTip'; import FormLabel from '@fastgpt/web/components/common/MyBox/FormLabel'; import MyIcon from '@fastgpt/web/components/common/Icon'; import { DatasetPermissionList } from '@fastgpt/global/support/permission/dataset/constant'; import MemberManager from '../../component/MemberManager'; import { getCollaboratorList, postUpdateDatasetCollaborators, deleteDatasetCollaborators } from '@/web/core/dataset/api/collaborator'; import DatasetTypeTag from '@/components/core/dataset/DatasetTypeTag'; import dynamic from 'next/dynamic'; import { EditResourceInfoFormType } from '@/components/common/Modal/EditResourceModal'; const EditResourceModal = dynamic(() => import('@/components/common/Modal/EditResourceModal')); const Info = ({ datasetId }: { datasetId: string }) => { const [openBaseConfig, setOpenBaseConfig] = useState(true); const [openPermissionConfig, setOpenPermissionConfig] = useState(true); const { t } = useTranslation(); const { datasetDetail, loadDatasetDetail, updateDataset, rebuildingCount, trainingCount } = useContextSelector(DatasetPageContext, (v) => v); const [editedDataset, setEditedDataset] = useState(); const refetchDatasetTraining = useContextSelector( DatasetPageContext, (v) => v.refetchDatasetTraining ); const { setValue, register, handleSubmit, watch, reset } = useForm({ defaultValues: datasetDetail }); const vectorModel = watch('vectorModel'); const agentModel = watch('agentModel'); const { datasetModelList, vectorModelList } = useSystemStore(); const { ConfirmModal: ConfirmDelModal } = useConfirm({ content: t('common:core.dataset.Delete Confirm'), type: 'delete' }); const { openConfirm: onOpenConfirmRebuild, ConfirmModal: ConfirmRebuildModal } = useConfirm({ title: t('common:common.confirm.Common Tip'), content: t('dataset:confirm_to_rebuild_embedding_tip'), type: 'delete' }); const { File } = useSelectFile({ fileType: '.jpg,.png', multiple: false }); const { runAsync: onSave } = useRequest2( (data: DatasetItemType) => { return updateDataset({ id: datasetId, agentModel: data.agentModel, externalReadUrl: data.externalReadUrl }); }, { successToast: t('common:common.Update Success'), errorToast: t('common:common.Update Failed') } ); const { runAsync: onSelectFile } = useRequest2( (e: File[]) => { const file = e[0]; if (!file) return Promise.resolve(null); return compressImgFileAndUpload({ type: MongoImageTypeEnum.datasetAvatar, file, maxW: 300, maxH: 300 }); }, { onSuccess(src: string | null) { if (src) { setValue('avatar', src); } }, errorToast: t('common:common.avatar.Select Failed') } ); const { runAsync: onRebuilding } = useRequest2( (vectorModel: VectorModelItemType) => { return postRebuildEmbedding({ datasetId, vectorModel: vectorModel.model }); }, { onSuccess() { refetchDatasetTraining(); loadDatasetDetail(datasetId); }, successToast: t('dataset:rebuild_embedding_start_tip'), errorToast: t('common:common.Update Failed') } ); const { runAsync: onEditBaseInfo } = useRequest2(updateDataset, { onSuccess() { setEditedDataset(undefined); }, successToast: t('common:common.Update Success'), errorToast: t('common:common.Update Failed') }); useEffect(() => { reset(datasetDetail); }, [datasetDetail._id]); return ( {datasetDetail.name} setEditedDataset({ id: datasetDetail._id, name: datasetDetail.name, avatar: datasetDetail.avatar, intro: datasetDetail.intro }) } /> {DatasetTypeMap[datasetDetail.type] && ( )} {datasetDetail.intro || t('common:core.dataset.Intro Placeholder')} {t('common:common.base_config')} { e.preventDefault(); setOpenBaseConfig(!openBaseConfig); }} /> {t('common:core.dataset.Dataset ID')} {datasetDetail._id} {t('common:core.ai.model.Vector Model')} 0 || trainingCount > 0 ? t( 'dataset:the_knowledge_base_has_indexes_that_are_being_trained_or_being_rebuilt' ) : undefined } list={vectorModelList.map((item) => ({ label: item.name, value: item.model }))} onchange={(e) => { const vectorModel = vectorModelList.find((item) => item.model === e); if (!vectorModel) return; return onOpenConfirmRebuild(async () => { await onRebuilding(vectorModel); setValue('vectorModel', vectorModel); })(); }} /> {t('common:core.Max Token')} {vectorModel.maxToken} {t('common:core.ai.model.Dataset Agent Model')} ({ label: item.name, value: item.model }))} fontSize={'mini'} onchange={(e) => { const agentModel = datasetModelList.find((item) => item.model === e); if (!agentModel) return; setValue('agentModel', agentModel); return handleSubmit((data) => onSave({ ...data, agentModel: agentModel }))(); }} /> {/* */} {datasetDetail.type === DatasetTypeEnum.externalFile && ( <> {t('dataset:external_read_url')} onSave(data))} /> )} {datasetDetail.permission.hasManagePer && ( <> {t('common:permission.Permission config')} setOpenPermissionConfig(!openPermissionConfig)} /> {t('common:permission.Default permission')} getCollaboratorList(datasetId), permissionList: DatasetPermissionList, onUpdateCollaborators: (body) => postUpdateDatasetCollaborators({ ...body, datasetId }), onDelOneCollaborator: async ({ groupId, tmbId }) => { if (tmbId) { return deleteDatasetCollaborators({ datasetId, tmbId }); } else if (groupId) { return deleteDatasetCollaborators({ datasetId, groupId }); } } }} /> )} {editedDataset && ( setEditedDataset(undefined)} onEdit={(data) => onEditBaseInfo({ id: editedDataset.id, name: data.name, intro: data.intro, avatar: data.avatar }) } /> )} ); }; export default React.memo(Info);