import { useShowDeleteConfirm } from '@/hooks/commonHooks'; import { IKnowledge } from '@/interfaces/database/knowledge'; import { useCallback, useEffect, useMemo } from 'react'; import { useDispatch, useSearchParams, useSelector } from 'umi'; import { useGetKnowledgeSearchParams } from './routeHook'; import { useOneNamespaceEffectsLoading } from './storeHooks'; export const useKnowledgeBaseId = (): string => { const [searchParams] = useSearchParams(); const knowledgeBaseId = searchParams.get('id'); return knowledgeBaseId || ''; }; export const useDeleteDocumentById = (): { removeDocument: (documentId: string) => Promise; } => { const dispatch = useDispatch(); const knowledgeBaseId = useKnowledgeBaseId(); const showDeleteConfirm = useShowDeleteConfirm(); const removeDocument = (documentId: string) => () => { return dispatch({ type: 'kFModel/document_rm', payload: { doc_id: documentId, kb_id: knowledgeBaseId, }, }); }; const onRmDocument = (documentId: string): Promise => { return showDeleteConfirm({ onOk: removeDocument(documentId) }); }; return { removeDocument: onRmDocument, }; }; export const useFetchKnowledgeDetail = () => { const dispatch = useDispatch(); const { knowledgeId } = useGetKnowledgeSearchParams(); const fetchKnowledgeDetail = useCallback( (knowledgeId: string) => { dispatch({ type: 'knowledgeModel/getKnowledgeDetail', payload: { kb_id: knowledgeId }, }); }, [dispatch], ); useEffect(() => { fetchKnowledgeDetail(knowledgeId); }, [fetchKnowledgeDetail, knowledgeId]); return fetchKnowledgeDetail; }; export const useSelectKnowledgeDetail = () => { const knowledge: IKnowledge = useSelector( (state: any) => state.knowledgeModel.knowledge, ); return knowledge; }; export const useGetDocumentDefaultParser = () => { const item = useSelectKnowledgeDetail(); return { defaultParserId: item?.parser_id ?? '', parserConfig: item?.parser_config ?? '', }; }; export const useDeleteChunkByIds = (): { removeChunk: (chunkIds: string[], documentId: string) => Promise; } => { const dispatch = useDispatch(); const showDeleteConfirm = useShowDeleteConfirm(); const removeChunk = useCallback( (chunkIds: string[], documentId: string) => () => { return dispatch({ type: 'chunkModel/rm_chunk', payload: { chunk_ids: chunkIds, doc_id: documentId, }, }); }, [dispatch], ); const onRemoveChunk = useCallback( (chunkIds: string[], documentId: string): Promise => { return showDeleteConfirm({ onOk: removeChunk(chunkIds, documentId) }); }, [removeChunk, showDeleteConfirm], ); return { removeChunk: onRemoveChunk, }; }; export const useFetchKnowledgeBaseConfiguration = () => { const dispatch = useDispatch(); const knowledgeBaseId = useKnowledgeBaseId(); const fetchKnowledgeBaseConfiguration = useCallback(() => { dispatch({ type: 'kSModel/getKbDetail', payload: { kb_id: knowledgeBaseId, }, }); }, [dispatch, knowledgeBaseId]); useEffect(() => { fetchKnowledgeBaseConfiguration(); }, [fetchKnowledgeBaseConfiguration]); }; export const useSelectKnowledgeList = () => { const knowledgeModel = useSelector((state) => state.knowledgeModel); const { data = [] } = knowledgeModel; return data; }; export const useFetchKnowledgeList = ( shouldFilterListWithoutDocument: boolean = false, ) => { const dispatch = useDispatch(); const loading = useOneNamespaceEffectsLoading('knowledgeModel', ['getList']); const knowledgeModel = useSelector((state) => state.knowledgeModel); const { data = [] } = knowledgeModel; const list: IKnowledge[] = useMemo(() => { return shouldFilterListWithoutDocument ? data.filter((x: IKnowledge) => x.chunk_num > 0) : data; }, [data, shouldFilterListWithoutDocument]); const fetchList = useCallback(() => { dispatch({ type: 'knowledgeModel/getList', }); }, [dispatch]); useEffect(() => { fetchList(); }, [fetchList]); return { list, loading, fetchList }; }; export const useSelectFileThumbnails = () => { const fileThumbnails: Record = useSelector( (state: any) => state.kFModel.fileThumbnails, ); return fileThumbnails; }; export const useFetchFileThumbnails = (docIds?: Array) => { const dispatch = useDispatch(); const fileThumbnails = useSelectFileThumbnails(); const fetchFileThumbnails = useCallback( (docIds: Array) => { dispatch({ type: 'kFModel/fetch_document_thumbnails', payload: { doc_ids: docIds.join(',') }, }); }, [dispatch], ); useEffect(() => { if (docIds) { fetchFileThumbnails(docIds); } }, [docIds, fetchFileThumbnails]); return { fileThumbnails, fetchFileThumbnails }; }; //#region knowledge configuration export const useUpdateKnowledge = () => { const dispatch = useDispatch(); const saveKnowledgeConfiguration = useCallback( (payload: any) => { dispatch({ type: 'kSModel/updateKb', payload, }); }, [dispatch], ); return saveKnowledgeConfiguration; }; export const useSelectKnowledgeDetails = () => { const knowledgeDetails: IKnowledge = useSelector( (state: any) => state.kSModel.knowledgeDetails, ); return knowledgeDetails; }; //#endregion //#region Retrieval testing export const useTestChunkRetrieval = () => { const dispatch = useDispatch(); const knowledgeBaseId = useKnowledgeBaseId(); const testChunk = useCallback( (values: any) => { dispatch({ type: 'testingModel/testDocumentChunk', payload: { ...values, kb_id: knowledgeBaseId, }, }); }, [dispatch, knowledgeBaseId], ); return testChunk; }; //#endregion