import { Box, Flex, HStack } from '@chakra-ui/react'; import { SearchDataResponseItemType } from '@fastgpt/global/core/dataset/type'; import { getSourceNameIcon } from '@fastgpt/global/core/dataset/utils'; import MyIcon from '@fastgpt/web/components/common/Icon'; import { useRouter } from 'next/router'; import { useTranslation } from 'react-i18next'; import DownloadButton from './DownloadButton'; import { useRequest2 } from '@fastgpt/web/hooks/useRequest'; import { downloadFetch } from '@/web/common/system/utils'; import { useMemo, useState } from 'react'; import { getDatasetDataPermission } from '@/web/core/dataset/api'; import ScoreTag from './ScoreTag'; import { formatScore } from '@/components/core/dataset/QuoteItem'; import NavButton from './NavButton'; import { useLinkedScroll } from '@fastgpt/web/hooks/useLinkedScroll'; import CollectionQuoteItem from './CollectionQuoteItem'; import { GetCollectionQuoteDataProps } from '@/web/core/chat/context/chatItemContext'; import { useUserStore } from '@/web/support/user/useUserStore'; import { getCollectionQuote } from '@/web/core/chat/api'; import MyIconButton from '@fastgpt/web/components/common/Icon/button'; import MyBox from '@fastgpt/web/components/common/MyBox'; import { getCollectionSourceAndOpen } from '@/web/core/dataset/hooks/readCollectionSource'; import { QuoteDataItemType } from '@/service/core/chat/constants'; const CollectionReader = ({ rawSearch, metadata, onClose }: { rawSearch: SearchDataResponseItemType[]; metadata: GetCollectionQuoteDataProps; onClose: () => void; }) => { const { t } = useTranslation(); const router = useRouter(); const { userInfo } = useUserStore(); const { collectionId, datasetId, chatItemDataId, sourceId, sourceName } = metadata; const [quoteIndex, setQuoteIndex] = useState(0); // Get dataset permission const { data: datasetData } = useRequest2(async () => await getDatasetDataPermission(datasetId), { manual: !userInfo || !datasetId, refreshDeps: [datasetId, userInfo] }); const filterResults = useMemo(() => { setQuoteIndex(0); return rawSearch .filter((item) => item.collectionId === collectionId) .sort((a, b) => (a.chunkIndex || 0) - (b.chunkIndex || 0)); }, [collectionId, rawSearch]); const currentQuoteItem = useMemo(() => { const item = filterResults[quoteIndex]; if (item) { return { id: item.id, index: item.chunkIndex, score: item.score }; } }, [filterResults, quoteIndex]); // Get quote list const params = useMemo( () => ({ collectionId, chatItemDataId, chatId: metadata.chatId, appId: metadata.appId, ...metadata.outLinkAuthData }), [metadata] ); const { dataList: datasetDataList, isLoading, ScrollData, itemRefs, loadInitData } = useLinkedScroll(getCollectionQuote, { params, currentData: currentQuoteItem }); const isDeleted = useMemo( () => !isLoading && !datasetDataList.find((item) => item._id === currentQuoteItem?.id), [datasetDataList, currentQuoteItem?.id, isLoading] ); const formatedDataList = useMemo( () => datasetDataList.map((item: QuoteDataItemType) => { const isCurrentSelected = currentQuoteItem?.id === item._id; const quoteIndex = filterResults.findIndex((res) => res.id === item._id); return { ...item, isCurrentSelected, quoteIndex }; }), [currentQuoteItem?.id, datasetDataList, filterResults] ); const { runAsync: handleDownload } = useRequest2(async () => { await downloadFetch({ url: '/api/core/dataset/collection/export', filename: 'data.csv', body: { collectionId: collectionId, chatItemDataId } }); }); const handleRead = getCollectionSourceAndOpen(metadata); return ( {/* title */} {/* name */} { router.push( `/dataset/detail?datasetId=${datasetId}¤tTab=dataCard&collectionId=${collectionId}` ); } })} > {sourceName || t('common:common.UnKnow Source')} {datasetData?.permission?.hasReadPer && ( { router.push(`/dataset/detail?datasetId=${datasetId}`); } } : {})} > {t('chat:data_source', { name: datasetData.datasetName })} )} {/* header control */} {datasetDataList.length > 0 && ( {/* 引用序号 */} {t('common:core.chat.Quote')} {quoteIndex + 1} / {filterResults.length} {/* 检索分数 */} {currentQuoteItem?.score ? ( ) : isDeleted ? ( {t('chat:chat.quote.deleted')} ) : null} {/* 检索按钮 */} setQuoteIndex(quoteIndex - 1)} /> setQuoteIndex(quoteIndex + 1)} /> {t('common:core.chat.quote.Quote Tip')} )} {/* quote list */} {isLoading || datasetDataList.length > 0 ? ( {formatedDataList.map((item, index) => ( } quoteIndex={item.quoteIndex} setQuoteIndex={setQuoteIndex} refreshList={() => loadInitData(false, true)} updated={item.updated} isCurrentSelected={item.isCurrentSelected} q={item.q} a={item.a} dataId={item._id} collectionId={collectionId} canEdit={!!userInfo && !!datasetData?.permission?.hasWritePer} /> ))} ) : ( {t('chat:chat.quote.No Data')} )} ); }; export default CollectionReader;