Archer 1bda5b5e58
fix: next config (#4207)
* reset package

* i18n

* update config

* i18n

* remove log
2025-03-18 13:48:49 +08:00

162 lines
4.9 KiB
TypeScript

import { Box, Flex } from '@chakra-ui/react';
import { SearchDataResponseItemType } from '@fastgpt/global/core/dataset/type';
import MyIcon from '@fastgpt/web/components/common/Icon';
import MyBox from '@fastgpt/web/components/common/MyBox';
import { useTranslation } from 'next-i18next';
import { useRequest2 } from '@fastgpt/web/hooks/useRequest';
import QuoteItem from './QuoteItem';
import { useMemo } from 'react';
import { getSourceNameIcon } from '@fastgpt/global/core/dataset/utils';
import { formatScore } from '@/components/core/dataset/QuoteItem';
import { GetAllQuoteDataProps } from '@/web/core/chat/context/chatItemContext';
import { getQuoteDataList } from '@/web/core/chat/api';
const QuoteReader = ({
rawSearch,
metadata,
onClose
}: {
rawSearch: SearchDataResponseItemType[];
metadata: GetAllQuoteDataProps;
onClose: () => void;
}) => {
const { t } = useTranslation();
const filterRawSearch = useMemo(() => {
return rawSearch.filter((item) => metadata.collectionIdList.includes(item.collectionId));
}, [rawSearch, metadata.collectionIdList]);
const { data: quoteList, loading } = useRequest2(
async () =>
await getQuoteDataList({
datasetDataIdList: filterRawSearch.map((item) => item.id),
collectionIdList: metadata.collectionIdList,
chatItemDataId: metadata.chatItemDataId,
appId: metadata.appId,
chatId: metadata.chatId,
...metadata.outLinkAuthData
}),
{
refreshDeps: [metadata, filterRawSearch],
manual: false
}
);
const formatedDataList = useMemo(() => {
return filterRawSearch
.map((searchItem) => {
const dataItem = quoteList?.find((item) => item._id === searchItem.id);
return {
id: searchItem.id,
q: dataItem?.q || 'Can not find Data',
a: dataItem?.a || '',
score: formatScore(searchItem.score),
sourceName: searchItem?.sourceName || '',
icon: getSourceNameIcon({
sourceId: searchItem.sourceId,
sourceName: searchItem.sourceName
})
};
})
.sort((a, b) => {
return (b.score.primaryScore?.value || 0) - (a.score.primaryScore?.value || 0);
});
}, [quoteList, filterRawSearch]);
return (
<Flex flexDirection={'column'} h={'full'}>
{/* title */}
<Flex
w={'full'}
alignItems={'center'}
px={5}
borderBottom={'1px solid'}
borderColor={'myGray.150'}
>
<Box flex={1} py={4}>
<Flex gap={2} mr={2} mb={1}>
{metadata.sourceId ? (
<>
<MyIcon
name={
getSourceNameIcon({
sourceId: metadata.sourceId,
sourceName: metadata.sourceName || ''
}) as any
}
w={['1rem', '1.25rem']}
color={'primary.600'}
/>
<Box
ml={1}
maxW={['200px', '220px']}
className={'textEllipsis'}
wordBreak={'break-all'}
fontSize={'sm'}
color={'myGray.900'}
fontWeight={'medium'}
>
{metadata.sourceName || t('common:common.UnKnow Source')}
</Box>
</>
) : (
<>
<MyIcon
name={'core/chat/quoteFill'}
w={['1rem', '1.25rem']}
color={'primary.600'}
/>
<Box
maxW={['200px', '300px']}
className={'textEllipsis'}
wordBreak={'break-all'}
color={'myGray.900'}
fontWeight={'medium'}
>
{t('common:core.chat.Quote Amount', { amount: filterRawSearch.length })}
</Box>
</>
)}
</Flex>
<Box fontSize={'mini'} color={'myGray.500'}>
{t('common:core.chat.quote.Quote Tip')}
</Box>
</Box>
<Box
cursor={'pointer'}
borderRadius={'sm'}
p={1}
_hover={{
bg: 'myGray.100'
}}
onClick={onClose}
>
<MyIcon name="common/closeLight" color={'myGray.900'} w={6} />
</Box>
</Flex>
{/* quote list */}
<MyBox flex={'1 0 0'} mt={2} px={5} py={1} overflow={'auto'} isLoading={loading}>
{!loading && (
<Flex flexDir={'column'} gap={3}>
{formatedDataList?.map((item, index) => (
<QuoteItem
key={item.id}
index={index}
icon={item.icon}
sourceName={item.sourceName}
score={item.score}
q={item.q}
a={item.a}
/>
))}
</Flex>
)}
</MyBox>
</Flex>
);
};
export default QuoteReader;