### What problem does this PR solve? feat: Use Spin to wrap the chunk list on the search page #2247 ### Type of change - [ ] Bug Fix (non-breaking change which fixes an issue) - [x] New Feature (non-breaking change which adds functionality) - [ ] Documentation Update - [ ] Refactoring - [ ] Performance Improvement - [ ] Other (please describe):tags/v0.11.0
| const [isFirstRender, setIsFirstRender] = useState(true); | const [isFirstRender, setIsFirstRender] = useState(true); | ||||
| const [selectedDocumentIds, setSelectedDocumentIds] = useState<string[]>([]); | const [selectedDocumentIds, setSelectedDocumentIds] = useState<string[]>([]); | ||||
| const { pagination } = useGetPaginationWithRouter(); | |||||
| const { pagination, setPagination } = useGetPaginationWithRouter(); | |||||
| const sendQuestion = useCallback( | const sendQuestion = useCallback( | ||||
| (question: string) => { | (question: string) => { | ||||
| const q = trim(question); | const q = trim(question); | ||||
| if (isEmpty(q)) return; | if (isEmpty(q)) return; | ||||
| setPagination({ page: 1 }); | |||||
| setIsFirstRender(false); | setIsFirstRender(false); | ||||
| setCurrentAnswer({} as IAnswer); | setCurrentAnswer({} as IAnswer); | ||||
| setSendingLoading(true); | setSendingLoading(true); | ||||
| send({ kb_ids: kbIds, question: q }); | send({ kb_ids: kbIds, question: q }); | ||||
| testChunk({ kb_id: kbIds, highlight: true, question: q }); | |||||
| testChunk({ | |||||
| kb_id: kbIds, | |||||
| highlight: true, | |||||
| question: q, | |||||
| page: 1, | |||||
| size: pagination.pageSize, | |||||
| }); | |||||
| fetchMindMap({ | fetchMindMap({ | ||||
| question: q, | question: q, | ||||
| kb_ids: kbIds, | kb_ids: kbIds, | ||||
| }); | }); | ||||
| fetchRelatedQuestions(q); | fetchRelatedQuestions(q); | ||||
| }, | }, | ||||
| [send, testChunk, kbIds, fetchRelatedQuestions, fetchMindMap], | |||||
| [ | |||||
| send, | |||||
| testChunk, | |||||
| kbIds, | |||||
| fetchRelatedQuestions, | |||||
| fetchMindMap, | |||||
| setPagination, | |||||
| pagination.pageSize, | |||||
| ], | |||||
| ); | ); | ||||
| const handleSearchStrChange: ChangeEventHandler<HTMLInputElement> = | const handleSearchStrChange: ChangeEventHandler<HTMLInputElement> = |
| background-size: cover; | background-size: cover; | ||||
| .card { | .card { | ||||
| width: 100%; | width: 100%; | ||||
| cursor: pointer; | |||||
| :global(.ant-card-body) { | :global(.ant-card-body) { | ||||
| padding: 14px; | padding: 14px; | ||||
| } | } |
| Popover, | Popover, | ||||
| Skeleton, | Skeleton, | ||||
| Space, | Space, | ||||
| Spin, | |||||
| Tag, | Tag, | ||||
| } from 'antd'; | } from 'antd'; | ||||
| import { useMemo, useState } from 'react'; | import { useMemo, useState } from 'react'; | ||||
| onTesting={handleTestChunk} | onTesting={handleTestChunk} | ||||
| ></RetrievalDocuments> | ></RetrievalDocuments> | ||||
| <Divider></Divider> | <Divider></Divider> | ||||
| {chunks.length > 0 && ( | |||||
| <List | |||||
| dataSource={chunks} | |||||
| loading={loading} | |||||
| className={styles.chunks} | |||||
| renderItem={(item) => ( | |||||
| <List.Item> | |||||
| <Card | |||||
| className={styles.card} | |||||
| onClick={() => | |||||
| clickDocumentButton(item.doc_id, item as any) | |||||
| } | |||||
| > | |||||
| <Space> | |||||
| <ImageWithPopover | |||||
| id={item.img_id} | |||||
| ></ImageWithPopover> | |||||
| <Popover | |||||
| content={ | |||||
| <div className={styles.popupMarkdown}> | |||||
| <Spin spinning={loading}> | |||||
| {chunks.length > 0 && ( | |||||
| <List | |||||
| dataSource={chunks} | |||||
| className={styles.chunks} | |||||
| renderItem={(item) => ( | |||||
| <List.Item> | |||||
| <Card | |||||
| className={styles.card} | |||||
| onClick={() => | |||||
| clickDocumentButton(item.doc_id, item as any) | |||||
| } | |||||
| > | |||||
| <Space> | |||||
| <ImageWithPopover | |||||
| id={item.img_id} | |||||
| ></ImageWithPopover> | |||||
| <Popover | |||||
| content={ | |||||
| <div className={styles.popupMarkdown}> | |||||
| <HightLightMarkdown> | |||||
| {item.content_with_weight} | |||||
| </HightLightMarkdown> | |||||
| </div> | |||||
| } | |||||
| > | |||||
| <div> | |||||
| <HightLightMarkdown> | <HightLightMarkdown> | ||||
| {item.content_with_weight} | |||||
| {item.highlight} | |||||
| </HightLightMarkdown> | </HightLightMarkdown> | ||||
| </div> | </div> | ||||
| } | |||||
| > | |||||
| <div> | |||||
| <HightLightMarkdown> | |||||
| {item.highlight} | |||||
| </HightLightMarkdown> | |||||
| </div> | |||||
| </Popover> | |||||
| </Space> | |||||
| </Card> | |||||
| </List.Item> | |||||
| )} | |||||
| /> | |||||
| )} | |||||
| </Popover> | |||||
| </Space> | |||||
| </Card> | |||||
| </List.Item> | |||||
| )} | |||||
| /> | |||||
| )} | |||||
| </Spin> | |||||
| {relatedQuestions?.length > 0 && ( | {relatedQuestions?.length > 0 && ( | ||||
| <Card title={t('chat.relatedQuestion')}> | <Card title={t('chat.relatedQuestion')}> | ||||
| <Flex wrap="wrap" gap={'10px 0'}> | <Flex wrap="wrap" gap={'10px 0'}> |