balibabu
Feat: Scrolling knowledge base list and set the number of entries per page to 30 #3695 (#3712)
b6c8684
import { useInfiniteFetchKnowledgeList } from '@/hooks/knowledge-hooks'; | |
import { useFetchUserInfo } from '@/hooks/user-setting-hooks'; | |
import { PlusOutlined, SearchOutlined } from '@ant-design/icons'; | |
import { | |
Button, | |
Divider, | |
Empty, | |
Flex, | |
Input, | |
Skeleton, | |
Space, | |
Spin, | |
} from 'antd'; | |
import { useTranslation } from 'react-i18next'; | |
import InfiniteScroll from 'react-infinite-scroll-component'; | |
import { useSaveKnowledge } from './hooks'; | |
import KnowledgeCard from './knowledge-card'; | |
import KnowledgeCreatingModal from './knowledge-creating-modal'; | |
import { useMemo } from 'react'; | |
import styles from './index.less'; | |
const KnowledgeList = () => { | |
const { data: userInfo } = useFetchUserInfo(); | |
const { t } = useTranslation('translation', { keyPrefix: 'knowledgeList' }); | |
const { | |
visible, | |
hideModal, | |
showModal, | |
onCreateOk, | |
loading: creatingLoading, | |
} = useSaveKnowledge(); | |
const { | |
fetchNextPage, | |
data, | |
hasNextPage, | |
searchString, | |
handleInputChange, | |
loading, | |
} = useInfiniteFetchKnowledgeList(); | |
console.log('π ~ KnowledgeList ~ data:', data); | |
const nextList = data?.pages?.flatMap((x) => x.kbs) ?? []; | |
const total = useMemo(() => { | |
return data?.pages.at(-1).total ?? 0; | |
}, [data?.pages]); | |
return ( | |
<Flex className={styles.knowledge} vertical flex={1} id="scrollableDiv"> | |
<div className={styles.topWrapper}> | |
<div> | |
<span className={styles.title}> | |
{t('welcome')}, {userInfo.nickname} | |
</span> | |
<p className={styles.description}>{t('description')}</p> | |
</div> | |
<Space size={'large'}> | |
<Input | |
placeholder={t('searchKnowledgePlaceholder')} | |
value={searchString} | |
style={{ width: 220 }} | |
allowClear | |
onChange={handleInputChange} | |
prefix={<SearchOutlined />} | |
/> | |
<Button | |
type="primary" | |
icon={<PlusOutlined />} | |
onClick={showModal} | |
className={styles.topButton} | |
> | |
{t('createKnowledgeBase')} | |
</Button> | |
</Space> | |
</div> | |
<Spin spinning={loading}> | |
<InfiniteScroll | |
dataLength={nextList?.length ?? 0} | |
next={fetchNextPage} | |
hasMore={hasNextPage} | |
loader={<Skeleton avatar paragraph={{ rows: 1 }} active />} | |
endMessage={total && <Divider plain>{t('noMoreData')} π€</Divider>} | |
scrollableTarget="scrollableDiv" | |
> | |
<Flex | |
gap={'large'} | |
wrap="wrap" | |
className={styles.knowledgeCardContainer} | |
> | |
{nextList?.length > 0 ? ( | |
nextList.map((item: any) => { | |
return ( | |
<KnowledgeCard item={item} key={item.name}></KnowledgeCard> | |
); | |
}) | |
) : ( | |
<Empty className={styles.knowledgeEmpty}></Empty> | |
)} | |
</Flex> | |
</InfiniteScroll> | |
</Spin> | |
<KnowledgeCreatingModal | |
loading={creatingLoading} | |
visible={visible} | |
hideModal={hideModal} | |
onOk={onCreateOk} | |
></KnowledgeCreatingModal> | |
</Flex> | |
); | |
}; | |
export default KnowledgeList; | |