import React, { useCallback, useMemo } from 'react'; import { useRouter } from 'next/router'; import { Box, Flex, IconButton, useTheme, Progress } from '@chakra-ui/react'; import { useToast } from '@/web/common/hooks/useToast'; import { useQuery } from '@tanstack/react-query'; import { getErrText } from '@fastgpt/global/common/error/utils'; import { useSystemStore } from '@/web/common/system/useSystemStore'; import Tabs from '@/components/Tabs'; import dynamic from 'next/dynamic'; import MyIcon from '@fastgpt/web/components/common/Icon'; import SideTabs from '@/components/SideTabs'; import PageContainer from '@/components/PageContainer'; import Avatar from '@/components/Avatar'; import Info from './components/Info'; import { serviceSideProps } from '@/web/common/utils/i18n'; import { useTranslation } from 'next-i18next'; import { getTrainingQueueLen } from '@/web/core/dataset/api'; import MyTooltip from '@/components/MyTooltip'; import { QuestionOutlineIcon } from '@chakra-ui/icons'; import { feConfigs } from '@/web/common/system/staticData'; import Script from 'next/script'; import CollectionCard from './components/CollectionCard'; import { useDatasetStore } from '@/web/core/dataset/store/dataset'; import { useUserStore } from '@/web/support/user/useUserStore'; import { DatasetStatusEnum, DatasetTypeEnum, DatasetTypeMap } from '@fastgpt/global/core/dataset/constant'; import { useConfirm } from '@/web/common/hooks/useConfirm'; import { useRequest } from '@/web/common/hooks/useRequest'; const DataCard = dynamic(() => import('./components/DataCard'), { ssr: false }); const Test = dynamic(() => import('./components/Test'), { ssr: false }); export enum TabEnum { dataCard = 'dataCard', collectionCard = 'collectionCard', test = 'test', info = 'info' } const Detail = ({ datasetId, currentTab }: { datasetId: string; currentTab: `${TabEnum}` }) => { const theme = useTheme(); const { t } = useTranslation(); const { toast } = useToast(); const router = useRouter(); const { isPc } = useSystemStore(); const { datasetDetail, loadDatasetDetail, startWebsiteSync } = useDatasetStore(); const { userInfo } = useUserStore(); const tabList = [ { label: t('core.dataset.Dataset'), id: TabEnum.collectionCard, icon: 'common/overviewLight' }, { label: t('core.dataset.test.Search Test'), id: TabEnum.test, icon: 'kbTest' }, ...(userInfo?.team.canWrite && datasetDetail.isOwner ? [{ label: t('common.Config'), id: TabEnum.info, icon: 'common/settingLight' }] : []) ]; const { ConfirmModal: ConfirmSyncModal, openConfirm: openConfirmSync } = useConfirm({ type: 'common' }); const { mutate: onUpdateDatasetWebsiteConfig, isLoading: isUpdating } = useRequest({ mutationFn: () => startWebsiteSync(), errorToast: t('common.Update Failed') }); const setCurrentTab = useCallback( (tab: `${TabEnum}`) => { router.replace({ query: { datasetId, currentTab: tab } }); }, [datasetId, router] ); useQuery([datasetId], () => loadDatasetDetail(datasetId), { onError(err: any) { router.replace(`/dataset/list`); toast({ title: getErrText(err, t('common.Load Failed')), status: 'error' }); } }); const { data: { vectorTrainingCount = 0, agentTrainingCount = 0 } = {} } = useQuery( ['getTrainingQueueLen'], () => getTrainingQueueLen({ vectorModel: datasetDetail.vectorModel.model, agentModel: datasetDetail.agentModel.model }), { refetchInterval: 10000 } ); const { vectorTrainingMap, agentTrainingMap } = useMemo(() => { const vectorTrainingMap = (() => { if (vectorTrainingCount < 1000) return { colorSchema: 'green', tip: t('core.dataset.training.Leisure') }; if (vectorTrainingCount < 10000) return { colorSchema: 'yellow', tip: t('core.dataset.training.Waiting') }; return { colorSchema: 'red', tip: t('core.dataset.training.Full') }; })(); const agentTrainingMap = (() => { if (agentTrainingCount < 100) return { colorSchema: 'green', tip: t('core.dataset.training.Leisure') }; if (agentTrainingCount < 1000) return { colorSchema: 'yellow', tip: t('core.dataset.training.Waiting') }; return { colorSchema: 'red', tip: t('core.dataset.training.Full') }; })(); return { vectorTrainingMap, agentTrainingMap }; }, [agentTrainingCount, t, vectorTrainingCount]); return ( <> {isPc ? ( {datasetDetail.name} {DatasetTypeMap[datasetDetail.type] && ( {t(DatasetTypeMap[datasetDetail.type]?.label)} {datasetDetail.type === DatasetTypeEnum.websiteDataset && datasetDetail.status === DatasetStatusEnum.active && ( openConfirmSync( onUpdateDatasetWebsiteConfig, undefined, t('core.dataset.website.Confirm Create Tips') )() } /> )} )} { setCurrentTab(e); }} /> {t('core.dataset.training.Agent queue')}({agentTrainingMap.tip}) {t('core.dataset.training.Vector queue')}({vectorTrainingMap.tip}) router.replace('/dataset/list')} > } bg={'white'} boxShadow={'1px 1px 9px rgba(0,0,0,0.15)'} size={'smSquare'} borderRadius={'50%'} aria-label={''} /> {t('core.dataset.All Dataset')} ) : ( ({ id: item.id, label: item.label }))} activeId={currentTab} onChange={(e: any) => setCurrentTab(e)} /> )} {!!datasetDetail._id && ( {currentTab === TabEnum.collectionCard && } {currentTab === TabEnum.dataCard && } {currentTab === TabEnum.test && } {currentTab === TabEnum.info && } )} ); }; export async function getServerSideProps(context: any) { const currentTab = context?.query?.currentTab || TabEnum.collectionCard; const datasetId = context?.query?.datasetId; return { props: { currentTab, datasetId, ...(await serviceSideProps(context)) } }; } export default React.memo(Detail);