import React, { useCallback, useState } from 'react'; import { Box, TableContainer, Table, Thead, Tbody, Tr, Th, Td, IconButton, Flex, Button, useDisclosure, Menu, MenuButton, MenuList, MenuItem } from '@chakra-ui/react'; import type { ModelSchema } from '@/types/mongoSchema'; import type { RedisModelDataItemType } from '@/types/redis'; import { ModelDataStatusMap } from '@/constants/model'; import { usePagination } from '@/hooks/usePagination'; import { getModelDataList, delOneModelData, getModelSplitDataListLen, getExportDataList } from '@/api/model'; import { DeleteIcon, RepeatIcon, EditIcon } from '@chakra-ui/icons'; import { useToast } from '@/hooks/useToast'; import { useLoading } from '@/hooks/useLoading'; import dynamic from 'next/dynamic'; import { useMutation, useQuery } from '@tanstack/react-query'; import type { FormData as InputDataType } from './InputDataModal'; const InputModel = dynamic(() => import('./InputDataModal')); const SelectFileModel = dynamic(() => import('./SelectFileModal')); const SelectUrlModel = dynamic(() => import('./SelectUrlModal')); const SelectJsonModel = dynamic(() => import('./SelectJsonModal')); const ModelDataCard = ({ model }: { model: ModelSchema }) => { const { Loading } = useLoading(); const { data: modelDataList, isLoading, Pagination, total, getData, pageNum } = usePagination({ api: getModelDataList, pageSize: 8, params: { modelId: model._id } }); const [editInputData, setEditInputData] = useState(); const { isOpen: isOpenSelectFileModal, onOpen: onOpenSelectFileModal, onClose: onCloseSelectFileModal } = useDisclosure(); const { isOpen: isOpenSelectUrlModal, onOpen: onOpenSelectUrlModal, onClose: onCloseSelectUrlModal } = useDisclosure(); const { isOpen: isOpenSelectJsonModal, onOpen: onOpenSelectJsonModal, onClose: onCloseSelectJsonModal } = useDisclosure(); const { data: splitDataLen, refetch } = useQuery(['getModelSplitDataList'], () => getModelSplitDataListLen(model._id) ); const refetchData = useCallback( (num = 1) => { getData(num); refetch(); }, [getData, refetch] ); // 获取所有的数据,并导出 json const { mutate: onclickExport, isLoading: isLoadingExport } = useMutation({ mutationFn: () => getExportDataList(model._id), onSuccess(res) { // 导出为文件 const blob = new Blob([res], { type: 'application/json;charset=utf-8' }); // 创建下载链接 const downloadLink = document.createElement('a'); downloadLink.href = window.URL.createObjectURL(blob); downloadLink.download = `data.json`; // 添加链接到页面并触发下载 document.body.appendChild(downloadLink); downloadLink.click(); document.body.removeChild(downloadLink); } }); return ( <> 模型数据: {total}组{' '} (测试版本) } aria-label={'refresh'} variant={'outline'} mr={4} size={'sm'} onClick={() => refetchData(pageNum)} /> 导入 setEditInputData({ text: '', q: '' }) } > 手动输入 文件QA拆分 网站内容QA拆分 JSON导入 {!!(splitDataLen && splitDataLen > 0) && ( {splitDataLen}条数据正在拆分... )} {modelDataList.map((item) => ( ))}
Question Text Status 操作
{item.q} {item.text} {ModelDataStatusMap[item.status]} } variant={'outline'} aria-label={'delete'} size={'sm'} onClick={() => setEditInputData({ dataId: item.id, q: item.q, text: item.text }) } /> } variant={'outline'} colorScheme={'gray'} aria-label={'delete'} size={'sm'} onClick={async () => { await delOneModelData(item.id); refetchData(pageNum); }} />
{editInputData !== undefined && ( setEditInputData(undefined)} onSuccess={refetchData} /> )} {isOpenSelectFileModal && ( )} {isOpenSelectUrlModal && ( )} {isOpenSelectJsonModal && ( )} ); }; export default ModelDataCard;