import React, { useCallback, useMemo, useRef, useState } from 'react'; import { Box, Flex, Grid, useTheme, useDisclosure, Card, IconButton, MenuButton, Image } from '@chakra-ui/react'; import { useRouter } from 'next/router'; import { useDatasetStore } from '@/store/dataset'; import PageContainer from '@/components/PageContainer'; import { useConfirm } from '@/hooks/useConfirm'; import { AddIcon } from '@chakra-ui/icons'; import { useQuery } from '@tanstack/react-query'; import { useToast } from '@/hooks/useToast'; import { delKbById, getKbPaths } from '@/api/plugins/kb'; import { useTranslation } from 'react-i18next'; import Avatar from '@/components/Avatar'; import MyIcon from '@/components/Icon'; import { serviceSideProps } from '@/utils/i18n'; import dynamic from 'next/dynamic'; import { FolderAvatarSrc, KbTypeEnum } from '@/constants/kb'; import Tag from '@/components/Tag'; import MyMenu from '@/components/MyMenu'; import { useRequest } from '@/hooks/useRequest'; import { useGlobalStore } from '@/store/global'; const CreateModal = dynamic(() => import('./component/CreateModal'), { ssr: false }); const EditFolderModal = dynamic(() => import('./component/EditFolderModal'), { ssr: false }); const Kb = () => { const { t } = useTranslation(); const theme = useTheme(); const router = useRouter(); const { parentId } = router.query as { parentId: string }; const { toast } = useToast(); const { setLoading } = useGlobalStore(); const DeleteTipsMap = useRef({ [KbTypeEnum.folder]: t('kb.deleteFolderTips'), [KbTypeEnum.dataset]: t('kb.deleteDatasetTips') }); const { openConfirm, ConfirmModal } = useConfirm({ title: t('common.Delete Warning'), content: '' }); const { myKbList, loadKbList, setKbList } = useDatasetStore(); const { isOpen: isOpenCreateModal, onOpen: onOpenCreateModal, onClose: onCloseCreateModal } = useDisclosure(); const [editFolderData, setEditFolderData] = useState<{ id?: string; name?: string; }>(); /* 点击删除 */ const { mutate: onclickDelKb } = useRequest({ mutationFn: async (id: string) => { setLoading(true); await delKbById(id); return id; }, onSuccess(id: string) { setKbList(myKbList.filter((item) => item._id !== id)); }, onSettled() { setLoading(false); }, successToast: t('common.Delete Success'), errorToast: t('kb.Delete Dataset Error') }); const { data, refetch } = useQuery(['loadKbList', parentId], () => { return Promise.all([loadKbList(parentId), getKbPaths(parentId)]); }); const paths = useMemo( () => [ { parentId: '', parentName: t('kb.My Dataset') }, ...(data?.[1] || []) ], [data, t] ); return ( {/* url path */} {!!parentId ? ( {paths.map((item, i) => ( { router.push({ query: { parentId: item.parentId } }); } })} > {item.parentName} {i !== paths.length - 1 && } ))} ) : ( 我的知识库 )} {t('Create New')} } menuList={[ { child: ( {''} {t('Folder')} ), onClick: () => setEditFolderData({}) }, { child: ( {''} {t('Dataset')} ), onClick: onOpenCreateModal } ]} /> {myKbList.map((kb) => ( { if (kb.type === KbTypeEnum.folder) { router.push({ pathname: '/kb/list', query: { parentId: kb._id } }); } else if (kb.type === KbTypeEnum.dataset) { router.push({ pathname: '/kb/detail', query: { kbId: kb._id } }); } }} > {kb.name} } variant={'base'} borderRadius={'md'} aria-label={'delete'} display={['', 'none']} _hover={{ bg: 'red.100' }} onClick={(e) => { e.stopPropagation(); openConfirm( () => onclickDelKb(kb._id), undefined, DeleteTipsMap.current[kb.type] )(); }} /> {kb.tags.map((tag, i) => ( {tag} ))} {kb.type === KbTypeEnum.folder ? ( {t('Folder')} ) : ( <> {kb.vectorModel.name} )} ))} {myKbList.length === 0 && ( 还没有知识库,快去创建一个吧! )} {isOpenCreateModal && } {!!editFolderData && ( setEditFolderData(undefined)} onSuccess={refetch} parentId={parentId} {...editFolderData} /> )} ); }; export async function getServerSideProps(content: any) { return { props: { ...(await serviceSideProps(content)) } }; } export default Kb;