import React, { useCallback, useState, useRef, useMemo } from 'react'; import { Box, Card, IconButton, Flex, Grid, Button } from '@chakra-ui/react'; import { usePagination } from '@/web/common/hooks/usePagination'; import { getDatasetDataList, delOneDatasetDataById, getDatasetCollectionById } from '@/web/core/dataset/api'; import { DeleteIcon } from '@chakra-ui/icons'; import { useQuery } from '@tanstack/react-query'; import { useToast } from '@/web/common/hooks/useToast'; import { debounce } from 'lodash'; import { getErrText } from '@fastgpt/global/common/error/utils'; import { useConfirm } from '@/web/common/hooks/useConfirm'; import { useTranslation } from 'react-i18next'; import { useRouter } from 'next/router'; import MyIcon from '@/components/Icon'; import MyInput from '@/components/MyInput'; import { useLoading } from '@/web/common/hooks/useLoading'; import InputDataModal, { RawSourceText, type InputDataType } from '../components/InputDataModal'; import type { DatasetDataListItemType } from '@/global/core/dataset/response.d'; import { TabEnum } from '..'; import { useUserStore } from '@/web/support/user/useUserStore'; import { TeamMemberRoleEnum } from '@fastgpt/global/support/user/team/constant'; const DataCard = () => { const BoxRef = useRef(null); const lastSearch = useRef(''); const router = useRouter(); const { userInfo } = useUserStore(); const { collectionId = '' } = router.query as { collectionId: string }; const { Loading, setIsLoading } = useLoading({ defaultLoading: true }); const { t } = useTranslation(); const [searchText, setSearchText] = useState(''); const { toast } = useToast(); const { openConfirm, ConfirmModal } = useConfirm({ content: t('dataset.Confirm to delete the data') }); const { data: datasetDataList, Pagination, total, getData, pageNum, pageSize } = usePagination({ api: getDatasetDataList, pageSize: 24, params: { collectionId, searchText }, onChange() { setIsLoading(false); if (BoxRef.current) { BoxRef.current.scrollTop = 0; } } }); const [editInputData, setEditInputData] = useState(); // get first page data const getFirstData = useCallback( debounce(() => { getData(1); lastSearch.current = searchText; }, 300), [] ); // get file info const { data: collection } = useQuery(['getDatasetCollectionById', collectionId], () => getDatasetCollectionById(collectionId) ); const canWrite = useMemo( () => userInfo?.team?.role !== TeamMemberRoleEnum.visitor && !!collection?.canWrite, [collection?.canWrite, userInfo?.team?.role] ); return ( } bg={'white'} boxShadow={'1px 1px 9px rgba(0,0,0,0.15)'} size={'sm'} borderRadius={'50%'} aria-label={''} onClick={() => router.replace({ query: { datasetId: router.query.datasetId, parentId: router.query.parentId, currentTab: TabEnum.collectionCard } }) } /> 文件ID:{' '} {collection?._id} {canWrite && ( )} {total}组 } w={['200px', '300px']} placeholder="根据匹配知识,预期答案和来源进行搜索" value={searchText} onChange={(e) => { setSearchText(e.target.value); getFirstData(); }} onBlur={() => { if (searchText === lastSearch.current) return; getFirstData(); }} onKeyDown={(e) => { if (searchText === lastSearch.current) return; if (e.key === 'Enter') { getFirstData(); } }} /> {datasetDataList.map((item) => ( { if (!collection) return; setEditInputData({ id: item.id, collectionId: collection._id, q: item.q, a: item.a, sourceId: collection.metadata?.fileId || collection.metadata?.rawLink, sourceName: collection.name }); }} > {item.q} {item.a} ID:{item.id} {canWrite && ( } variant={'base'} colorScheme={'gray'} aria-label={'delete'} size={'xs'} borderRadius={'md'} _hover={{ color: 'red.600' }} onClick={(e) => { e.stopPropagation(); openConfirm(async () => { try { setIsLoading(true); await delOneDatasetDataById(item.id); getData(pageNum); } catch (error) { toast({ title: getErrText(error), status: 'error' }); } setIsLoading(false); })(); }} /> )} ))} {total > pageSize && ( )} {total === 0 && ( 内容空空的,快创建一个吧! )} {editInputData !== undefined && collection && ( setEditInputData(undefined)} onSuccess={() => getData(pageNum)} canWrite={canWrite} /> )} ); }; export default React.memo(DataCard);