Spaces:
Paused
Paused
import { useSetModalState, useTranslate } from '@/hooks/common-hooks'; | |
import { | |
useCreateDocument, | |
useFetchDocumentList, | |
useRunDocument, | |
useSaveDocumentName, | |
useSelectRunDocumentLoading, | |
useSetDocumentParser, | |
useUploadDocument, | |
useWebCrawl, | |
} from '@/hooks/document-hooks'; | |
import { useGetKnowledgeSearchParams } from '@/hooks/route-hook'; | |
import { useOneNamespaceEffectsLoading } from '@/hooks/store-hooks'; | |
import { Pagination } from '@/interfaces/common'; | |
import { IChangeParserConfigRequestBody } from '@/interfaces/request/document'; | |
import { getUnSupportedFilesCount } from '@/utils/document-util'; | |
import { PaginationProps, UploadFile } from 'antd'; | |
import { useCallback, useEffect, useMemo, useState } from 'react'; | |
import { useDispatch, useNavigate, useSelector } from 'umi'; | |
import { KnowledgeRouteKey } from './constant'; | |
export const useFetchDocumentListOnMount = () => { | |
const { knowledgeId } = useGetKnowledgeSearchParams(); | |
const fetchDocumentList = useFetchDocumentList(); | |
const dispatch = useDispatch(); | |
useEffect(() => { | |
if (knowledgeId) { | |
fetchDocumentList(); | |
dispatch({ | |
type: 'kFModel/pollGetDocumentList-start', | |
payload: knowledgeId, | |
}); | |
} | |
return () => { | |
dispatch({ | |
type: 'kFModel/pollGetDocumentList-stop', | |
}); | |
}; | |
}, [knowledgeId, dispatch, fetchDocumentList]); | |
return { fetchDocumentList }; | |
}; | |
export const useGetPagination = (fetchDocumentList: () => void) => { | |
const dispatch = useDispatch(); | |
const kFModel = useSelector((state: any) => state.kFModel); | |
const { t } = useTranslate('common'); | |
const setPagination = useCallback( | |
(pageNumber = 1, pageSize?: number) => { | |
const pagination: Pagination = { | |
current: pageNumber, | |
} as Pagination; | |
if (pageSize) { | |
pagination.pageSize = pageSize; | |
} | |
dispatch({ | |
type: 'kFModel/setPagination', | |
payload: pagination, | |
}); | |
}, | |
[dispatch], | |
); | |
const onPageChange: PaginationProps['onChange'] = useCallback( | |
(pageNumber: number, pageSize: number) => { | |
setPagination(pageNumber, pageSize); | |
fetchDocumentList(); | |
}, | |
[fetchDocumentList, setPagination], | |
); | |
const pagination: PaginationProps = useMemo(() => { | |
return { | |
showQuickJumper: true, | |
total: kFModel.total, | |
showSizeChanger: true, | |
current: kFModel.pagination.current, | |
pageSize: kFModel.pagination.pageSize, | |
pageSizeOptions: [1, 2, 10, 20, 50, 100], | |
onChange: onPageChange, | |
showTotal: (total) => `${t('total')} ${total}`, | |
}; | |
}, [kFModel, onPageChange, t]); | |
return { | |
pagination, | |
setPagination, | |
total: kFModel.total, | |
searchString: kFModel.searchString, | |
}; | |
}; | |
export const useSelectDocumentListLoading = () => { | |
return useOneNamespaceEffectsLoading('kFModel', [ | |
'getKfList', | |
'updateDocumentStatus', | |
]); | |
}; | |
export const useNavigateToOtherPage = () => { | |
const navigate = useNavigate(); | |
const { knowledgeId } = useGetKnowledgeSearchParams(); | |
const linkToUploadPage = useCallback(() => { | |
navigate(`/knowledge/dataset/upload?id=${knowledgeId}`); | |
}, [navigate, knowledgeId]); | |
const toChunk = useCallback( | |
(id: string) => { | |
navigate( | |
`/knowledge/${KnowledgeRouteKey.Dataset}/chunk?id=${knowledgeId}&doc_id=${id}`, | |
); | |
}, | |
[navigate, knowledgeId], | |
); | |
return { linkToUploadPage, toChunk }; | |
}; | |
export const useHandleSearchChange = (setPagination: () => void) => { | |
const dispatch = useDispatch(); | |
const { knowledgeId } = useGetKnowledgeSearchParams(); | |
const throttledGetDocumentList = useCallback(() => { | |
dispatch({ | |
type: 'kFModel/throttledGetDocumentList', | |
payload: knowledgeId, | |
}); | |
}, [dispatch, knowledgeId]); | |
const handleInputChange = useCallback( | |
(e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => { | |
const value = e.target.value; | |
dispatch({ type: 'kFModel/setSearchString', payload: value }); | |
setPagination(); | |
throttledGetDocumentList(); | |
}, | |
[setPagination, throttledGetDocumentList, dispatch], | |
); | |
return { handleInputChange }; | |
}; | |
export const useRenameDocument = (documentId: string) => { | |
const saveName = useSaveDocumentName(); | |
const { | |
visible: renameVisible, | |
hideModal: hideRenameModal, | |
showModal: showRenameModal, | |
} = useSetModalState(); | |
const loading = useOneNamespaceEffectsLoading('kFModel', ['document_rename']); | |
const onRenameOk = useCallback( | |
async (name: string) => { | |
const ret = await saveName(documentId, name); | |
if (ret === 0) { | |
hideRenameModal(); | |
} | |
}, | |
[hideRenameModal, saveName, documentId], | |
); | |
return { | |
renameLoading: loading, | |
onRenameOk, | |
renameVisible, | |
hideRenameModal, | |
showRenameModal, | |
}; | |
}; | |
export const useCreateEmptyDocument = () => { | |
const createDocument = useCreateDocument(); | |
const { | |
visible: createVisible, | |
hideModal: hideCreateModal, | |
showModal: showCreateModal, | |
} = useSetModalState(); | |
const loading = useOneNamespaceEffectsLoading('kFModel', ['document_create']); | |
const onCreateOk = useCallback( | |
async (name: string) => { | |
const ret = await createDocument(name); | |
if (ret === 0) { | |
hideCreateModal(); | |
} | |
}, | |
[hideCreateModal, createDocument], | |
); | |
return { | |
createLoading: loading, | |
onCreateOk, | |
createVisible, | |
hideCreateModal, | |
showCreateModal, | |
}; | |
}; | |
export const useChangeDocumentParser = (documentId: string) => { | |
const setDocumentParser = useSetDocumentParser(); | |
const { | |
visible: changeParserVisible, | |
hideModal: hideChangeParserModal, | |
showModal: showChangeParserModal, | |
} = useSetModalState(); | |
const loading = useOneNamespaceEffectsLoading('kFModel', [ | |
'document_change_parser', | |
]); | |
const onChangeParserOk = useCallback( | |
async (parserId: string, parserConfig: IChangeParserConfigRequestBody) => { | |
const ret = await setDocumentParser(parserId, documentId, parserConfig); | |
if (ret === 0) { | |
hideChangeParserModal(); | |
} | |
}, | |
[hideChangeParserModal, setDocumentParser, documentId], | |
); | |
return { | |
changeParserLoading: loading, | |
onChangeParserOk, | |
changeParserVisible, | |
hideChangeParserModal, | |
showChangeParserModal, | |
}; | |
}; | |
export const useGetRowSelection = () => { | |
const [selectedRowKeys, setSelectedRowKeys] = useState<React.Key[]>([]); | |
const rowSelection = { | |
selectedRowKeys, | |
onChange: (newSelectedRowKeys: React.Key[]) => { | |
setSelectedRowKeys(newSelectedRowKeys); | |
}, | |
}; | |
return rowSelection; | |
}; | |
export const useHandleUploadDocument = () => { | |
const { | |
visible: documentUploadVisible, | |
hideModal: hideDocumentUploadModal, | |
showModal: showDocumentUploadModal, | |
} = useSetModalState(); | |
const uploadDocument = useUploadDocument(); | |
const onDocumentUploadOk = useCallback( | |
async (fileList: UploadFile[]): Promise<number | undefined> => { | |
if (fileList.length > 0) { | |
const ret: any = await uploadDocument(fileList); | |
const count = getUnSupportedFilesCount(ret.retmsg); | |
/// 500 error code indicates that some file types are not supported | |
let retcode = ret.retcode; | |
if ( | |
ret.retcode === 0 || | |
(ret.retcode === 500 && count !== fileList.length) // Some files were not uploaded successfully, but some were uploaded successfully. | |
) { | |
retcode = 0; | |
hideDocumentUploadModal(); | |
} | |
return retcode; | |
} | |
}, | |
[uploadDocument, hideDocumentUploadModal], | |
); | |
const loading = useOneNamespaceEffectsLoading('kFModel', ['upload_document']); | |
return { | |
documentUploadLoading: loading, | |
onDocumentUploadOk, | |
documentUploadVisible, | |
hideDocumentUploadModal, | |
showDocumentUploadModal, | |
}; | |
}; | |
export const useHandleWebCrawl = () => { | |
const { | |
visible: webCrawlUploadVisible, | |
hideModal: hideWebCrawlUploadModal, | |
showModal: showWebCrawlUploadModal, | |
} = useSetModalState(); | |
const webCrawl = useWebCrawl(); | |
const onWebCrawlUploadOk = useCallback( | |
async (name: string, url: string) => { | |
const ret = await webCrawl(name, url); | |
if (ret === 0) { | |
hideWebCrawlUploadModal(); | |
return 0; | |
} | |
return -1; | |
}, | |
[webCrawl, hideWebCrawlUploadModal], | |
); | |
const loading = useOneNamespaceEffectsLoading('kFModel', ['web_crawl']); | |
return { | |
webCrawlUploadLoading: loading, | |
onWebCrawlUploadOk, | |
webCrawlUploadVisible, | |
hideWebCrawlUploadModal, | |
showWebCrawlUploadModal, | |
}; | |
}; | |
export const useHandleRunDocumentByIds = (id: string) => { | |
const loading = useSelectRunDocumentLoading(); | |
const runDocumentByIds = useRunDocument(); | |
const [currentId, setCurrentId] = useState<string>(''); | |
const isLoading = loading && currentId !== '' && currentId === id; | |
const handleRunDocumentByIds = async ( | |
documentId: string, | |
knowledgeBaseId: string, | |
isRunning: boolean, | |
) => { | |
if (isLoading) { | |
return; | |
} | |
setCurrentId(documentId); | |
try { | |
await runDocumentByIds({ | |
doc_ids: [documentId], | |
run: isRunning ? 2 : 1, | |
knowledgeBaseId, | |
}); | |
setCurrentId(''); | |
} catch (error) { | |
setCurrentId(''); | |
} | |
}; | |
return { | |
handleRunDocumentByIds, | |
loading: isLoading, | |
}; | |
}; | |