balibabu
feat: Dynamically change the background image on the search homepage every day #2247 (#2338)
17c457d
| import HightLightMarkdown from '@/components/highlight-markdown'; | |
| import { ImageWithPopover } from '@/components/image'; | |
| import IndentedTree from '@/components/indented-tree/indented-tree'; | |
| import { useSelectTestingResult } from '@/hooks/knowledge-hooks'; | |
| import { IReference } from '@/interfaces/database/chat'; | |
| import { | |
| Card, | |
| Divider, | |
| Flex, | |
| Input, | |
| Layout, | |
| List, | |
| Skeleton, | |
| Space, | |
| Tag, | |
| } from 'antd'; | |
| import { useState } from 'react'; | |
| import MarkdownContent from '../chat/markdown-content'; | |
| import { useFetchBackgroundImage, useSendQuestion } from './hooks'; | |
| import SearchSidebar from './sidebar'; | |
| import PdfDrawer from '@/components/pdf-drawer'; | |
| import { useClickDrawer } from '@/components/pdf-drawer/hooks'; | |
| import RetrievalDocuments from '@/components/retrieval-documents'; | |
| import { useTranslation } from 'react-i18next'; | |
| import styles from './index.less'; | |
| const { Content } = Layout; | |
| const { Search } = Input; | |
| const SearchPage = () => { | |
| const { t } = useTranslation(); | |
| const [checkedList, setCheckedList] = useState<string[]>([]); | |
| const list = useSelectTestingResult(); | |
| // const appConf = useFetchAppConf(); | |
| const { | |
| sendQuestion, | |
| handleClickRelatedQuestion, | |
| handleSearchStrChange, | |
| handleTestChunk, | |
| answer, | |
| sendingLoading, | |
| relatedQuestions, | |
| mindMap, | |
| mindMapLoading, | |
| searchStr, | |
| loading, | |
| isFirstRender, | |
| } = useSendQuestion(checkedList); | |
| const { visible, hideModal, documentId, selectedChunk, clickDocumentButton } = | |
| useClickDrawer(); | |
| const imgUrl = useFetchBackgroundImage(); | |
| const InputSearch = ( | |
| <Search | |
| value={searchStr} | |
| onChange={handleSearchStrChange} | |
| placeholder={t('header.search')} | |
| allowClear | |
| enterButton | |
| onSearch={sendQuestion} | |
| size="large" | |
| loading={sendingLoading} | |
| disabled={checkedList.length === 0} | |
| className={isFirstRender ? styles.globalInput : styles.partialInput} | |
| /> | |
| ); | |
| return ( | |
| <> | |
| <Layout className={styles.searchPage}> | |
| <SearchSidebar | |
| checkedList={checkedList} | |
| setCheckedList={setCheckedList} | |
| ></SearchSidebar> | |
| <Layout> | |
| <Content> | |
| {isFirstRender ? ( | |
| <Flex | |
| justify="center" | |
| align="center" | |
| className={styles.firstRenderContent} | |
| style={{ backgroundImage: `url(${imgUrl})` }} | |
| > | |
| <Flex vertical align="center" gap={'large'}> | |
| {/* <Space size={30}> | |
| <img src="/logo.svg" alt="" className={styles.appIcon} /> | |
| <span className={styles.appName}>{appConf.appName}</span> | |
| </Space> */} | |
| {InputSearch} | |
| </Flex> | |
| </Flex> | |
| ) : ( | |
| <Flex className={styles.content}> | |
| <section className={styles.main}> | |
| {InputSearch} | |
| {answer.answer && ( | |
| <div className={styles.answerWrapper}> | |
| <MarkdownContent | |
| loading={sendingLoading} | |
| content={answer.answer} | |
| reference={answer.reference ?? ({} as IReference)} | |
| clickDocumentButton={clickDocumentButton} | |
| ></MarkdownContent> | |
| </div> | |
| )} | |
| <Divider></Divider> | |
| <RetrievalDocuments | |
| selectedDocumentIdsLength={0} | |
| onTesting={handleTestChunk} | |
| ></RetrievalDocuments> | |
| <Divider></Divider> | |
| {list.chunks.length > 0 && ( | |
| <List | |
| dataSource={list.chunks} | |
| loading={loading} | |
| renderItem={(item) => ( | |
| <List.Item> | |
| <Card className={styles.card}> | |
| <Space> | |
| <ImageWithPopover | |
| id={item.img_id} | |
| ></ImageWithPopover> | |
| <HightLightMarkdown> | |
| {item.highlight} | |
| </HightLightMarkdown> | |
| </Space> | |
| </Card> | |
| </List.Item> | |
| )} | |
| /> | |
| )} | |
| {relatedQuestions?.length > 0 && ( | |
| <Card> | |
| <Flex wrap="wrap" gap={'10px 0'}> | |
| {relatedQuestions?.map((x, idx) => ( | |
| <Tag | |
| key={idx} | |
| className={styles.tag} | |
| onClick={handleClickRelatedQuestion(x)} | |
| > | |
| {x} | |
| </Tag> | |
| ))} | |
| </Flex> | |
| </Card> | |
| )} | |
| </section> | |
| <section className={styles.graph}> | |
| {mindMapLoading ? ( | |
| <Skeleton active /> | |
| ) : ( | |
| <IndentedTree | |
| data={mindMap} | |
| show | |
| style={{ width: '100%', height: '100%' }} | |
| ></IndentedTree> | |
| )} | |
| </section> | |
| </Flex> | |
| )} | |
| </Content> | |
| </Layout> | |
| </Layout> | |
| <PdfDrawer | |
| visible={visible} | |
| hideModal={hideModal} | |
| documentId={documentId} | |
| chunk={selectedChunk} | |
| ></PdfDrawer> | |
| </> | |
| ); | |
| }; | |
| export default SearchPage; | |