import React, { useState, useMemo } from 'react'; import { Box, Card, IconButton, Flex, Button, useTheme } from '@chakra-ui/react'; import { getDatasetDataList, delOneDatasetDataById, getDatasetCollectionById } from '@/web/core/dataset/api'; import { useQuery } from '@tanstack/react-query'; import { useToast } from '@fastgpt/web/hooks/useToast'; import { getErrText } from '@fastgpt/global/common/error/utils'; import { useConfirm } from '@fastgpt/web/hooks/useConfirm'; import { useTranslation } from 'next-i18next'; import { useRouter } from 'next/router'; import MyIcon from '@fastgpt/web/components/common/Icon'; import MyInput from '@/components/MyInput'; import InputDataModal from '../components/InputDataModal'; import RawSourceBox from '@/components/core/dataset/RawSourceBox'; import { usePagination } from '@fastgpt/web/hooks/usePagination'; import { getCollectionSourceData } from '@fastgpt/global/core/dataset/collection/utils'; import EmptyTip from '@fastgpt/web/components/common/EmptyTip'; import { DatasetPageContext } from '@/web/core/dataset/context/datasetPageContext'; import { useContextSelector } from 'use-context-selector'; import MyTag from '@fastgpt/web/components/common/Tag/index'; import MyBox from '@fastgpt/web/components/common/MyBox'; import { useSystem } from '@fastgpt/web/hooks/useSystem'; import TagsPopOver from './CollectionCard/TagsPopOver'; import { useSystemStore } from '@/web/common/system/useSystemStore'; import MyDivider from '@fastgpt/web/components/common/MyDivider'; import Markdown from '@/components/Markdown'; import { DatasetDataListItemType } from '@/global/core/dataset/type'; const DataCard = () => { const theme = useTheme(); const router = useRouter(); const { isPc } = useSystem(); const { collectionId = '', datasetId } = router.query as { collectionId: string; datasetId: string; }; const datasetDetail = useContextSelector(DatasetPageContext, (v) => v.datasetDetail); const { feConfigs } = useSystemStore(); const { t } = useTranslation(); const [searchText, setSearchText] = useState(''); const { toast } = useToast(); const { openConfirm, ConfirmModal } = useConfirm({ content: t('common:dataset.Confirm to delete the data'), type: 'delete' }); const scrollParams = useMemo( () => ({ collectionId, searchText }), [collectionId, searchText] ); const { data: datasetDataList, ScrollData, total, isLoading, refresh, setData: setDatasetDataList } = usePagination({ api: getDatasetDataList, pageSize: 10, type: 'scroll', params: scrollParams, refreshDeps: [searchText, collectionId] }); const [editDataId, setEditDataId] = useState(); // get file info const { data: collection } = useQuery( ['getDatasetCollectionById', collectionId], () => getDatasetCollectionById(collectionId), { onError: () => { router.replace({ query: { datasetId } }); } } ); const canWrite = useMemo(() => datasetDetail.permission.hasWritePer, [datasetDetail]); return ( {/* Header */} {collection?._id && ( )} {feConfigs?.isPlus && !!collection?.tags?.length && ( )} {canWrite && ( )} {t('common:core.dataset.data.Total Amount', { total })} } bg={'myGray.25'} borderColor={'myGray.200'} color={'myGray.500'} w={['200px', '300px']} placeholder={t('common:core.dataset.data.Search data placeholder')} value={searchText} onChange={(e) => { setSearchText(e.target.value); }} /> {/* data */} {datasetDataList.map((item, index) => ( { e.stopPropagation(); if (!collection) return; setEditDataId(item._id); }} > {/* Data tag */} #{item.chunkIndex ?? '-'} ID:{item._id} {/* Data content */} {!!item.a && ( <> )} {/* Mask */} {item.q.length + (item.a?.length || 0)} {canWrite && ( } variant={'whiteDanger'} size={'xsSquare'} onClick={(e) => { e.stopPropagation(); openConfirm(async () => { try { await delOneDatasetDataById(item._id); setDatasetDataList((prev) => { return prev.filter((data) => data._id !== item._id); }); toast({ title: t('common:common.Delete Success'), status: 'success' }); } catch (error) { toast({ title: getErrText(error), status: 'error' }); } })(); }} aria-label={''} /> )} ))} {total === 0 && !isLoading && ( )} {editDataId !== undefined && collection && ( setEditDataId(undefined)} onSuccess={(data) => { if (editDataId === '') { refresh(); return; } setDatasetDataList((prev) => { return prev.map((item) => { if (item._id === editDataId) { return { ...item, ...data }; } return item; }); }); }} /> )} ); }; export default React.memo(DataCard);