mirror of
https://github.com/infiniflow/ragflow.git
synced 2026-07-26 02:13:29 +08:00
This commit is contained in:
@@ -2,11 +2,17 @@ import message from '@/components/ui/message';
|
||||
import { PaginationProps } from '@/interfaces/antd-compat';
|
||||
import {
|
||||
IFetchFileListResult,
|
||||
IFile,
|
||||
IFolder,
|
||||
} from '@/interfaces/database/file-manager';
|
||||
import { IConnectRequestBody } from '@/interfaces/request/file-manager';
|
||||
import {
|
||||
ConnectFileToKnowledgeMode,
|
||||
IConnectRequestBody,
|
||||
} from '@/interfaces/request/file-manager';
|
||||
import fileManagerService from '@/services/file-manager-service';
|
||||
import api from '@/utils/api';
|
||||
import { downloadFileFromBlob } from '@/utils/file-util';
|
||||
import request from '@/utils/request';
|
||||
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
|
||||
import { useDebounce } from 'ahooks';
|
||||
import { useCallback } from 'react';
|
||||
@@ -294,12 +300,49 @@ export const useConnectToKnowledge = () => {
|
||||
mutateAsync,
|
||||
} = useMutation({
|
||||
mutationKey: [FileApiAction.ConnectFileToKnowledge],
|
||||
mutationFn: async (params: IConnectRequestBody) => {
|
||||
const { data } = await fileManagerService.connectFileToKnowledge(params);
|
||||
mutationFn: async (
|
||||
params: IConnectRequestBody & {
|
||||
mode: ConnectFileToKnowledgeMode;
|
||||
kbsInfo: IFile['kbs_info'];
|
||||
},
|
||||
) => {
|
||||
const { data } = await request.post(api.connectFileToKnowledge, {
|
||||
data: { fileIds: params.fileIds, kbIds: params.kbIds },
|
||||
params: { mode: params.mode },
|
||||
});
|
||||
if (data.code === 0) {
|
||||
message.success(t('message.operated'));
|
||||
const fileIdSet = new Set(params.fileIds);
|
||||
queryClient.setQueriesData<IFetchFileListResult>(
|
||||
{
|
||||
queryKey: [FileApiAction.FetchFileList],
|
||||
},
|
||||
(oldData) => {
|
||||
if (!oldData?.files) return oldData;
|
||||
return {
|
||||
...oldData,
|
||||
files: oldData.files.map((file) => {
|
||||
if (!fileIdSet.has(file.id)) return file;
|
||||
const kbsInfo =
|
||||
params.mode === 'replace'
|
||||
? params.kbsInfo
|
||||
: [
|
||||
...(file.kbs_info ?? []),
|
||||
...params.kbsInfo.filter(
|
||||
(kb) =>
|
||||
!(file.kbs_info ?? []).some(
|
||||
(item) => item.kb_id === kb.kb_id,
|
||||
),
|
||||
),
|
||||
];
|
||||
return { ...file, kbs_info: kbsInfo };
|
||||
}),
|
||||
};
|
||||
},
|
||||
);
|
||||
queryClient.invalidateQueries({
|
||||
queryKey: [FileApiAction.FetchFileList],
|
||||
refetchType: 'none',
|
||||
});
|
||||
}
|
||||
return data.code;
|
||||
|
||||
@@ -8,3 +8,5 @@ export interface IConnectRequestBody {
|
||||
fileIds: string[];
|
||||
kbIds: string[];
|
||||
}
|
||||
|
||||
export type ConnectFileToKnowledgeMode = 'add' | 'replace';
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
import { useSetModalState } from '@/hooks/common-hooks';
|
||||
import { useConnectToKnowledge, useRenameFile } from '@/hooks/use-file-request';
|
||||
import { useSelectKnowledgeOptions } from '@/hooks/use-knowledge-request';
|
||||
import { TableRowSelection } from '@/interfaces/antd-compat';
|
||||
import { IFile } from '@/interfaces/database/file-manager';
|
||||
import { ConnectFileToKnowledgeMode } from '@/interfaces/request/file-manager';
|
||||
import { useCallback, useMemo, useState } from 'react';
|
||||
import { useNavigate, useSearchParams } from 'react-router';
|
||||
|
||||
@@ -83,6 +85,8 @@ export const useHandleConnectToKnowledge = () => {
|
||||
useConnectToKnowledge();
|
||||
const [record, setRecord] = useState<IFile>({} as IFile);
|
||||
const [documentIds, setDocumentIds] = useState<string[]>([]);
|
||||
const [mode, setMode] = useState<ConnectFileToKnowledgeMode>('replace');
|
||||
const knowledgeOptions = useSelectKnowledgeOptions();
|
||||
|
||||
const initialValue = useMemo(() => {
|
||||
return Array.isArray(record?.kbs_info)
|
||||
@@ -90,11 +94,25 @@ export const useHandleConnectToKnowledge = () => {
|
||||
: [];
|
||||
}, [record?.kbs_info]);
|
||||
|
||||
const knowledgeNameMap = useMemo(() => {
|
||||
return new Map(
|
||||
knowledgeOptions?.map((option) => [
|
||||
option.value,
|
||||
typeof option.label === 'string' ? option.label : String(option.label),
|
||||
]) ?? [],
|
||||
);
|
||||
}, [knowledgeOptions]);
|
||||
|
||||
const onConnectToKnowledgeOk = useCallback(
|
||||
async (knowledgeIds: string[]) => {
|
||||
const ret = await connectToKnowledge({
|
||||
fileIds: documentIds,
|
||||
kbIds: knowledgeIds,
|
||||
mode,
|
||||
kbsInfo: knowledgeIds.map((id) => ({
|
||||
kb_id: id,
|
||||
kb_name: knowledgeNameMap.get(id) ?? id,
|
||||
})),
|
||||
});
|
||||
|
||||
if (ret === 0) {
|
||||
@@ -102,7 +120,13 @@ export const useHandleConnectToKnowledge = () => {
|
||||
}
|
||||
return ret;
|
||||
},
|
||||
[connectToKnowledge, hideConnectToKnowledgeModal, documentIds],
|
||||
[
|
||||
connectToKnowledge,
|
||||
hideConnectToKnowledgeModal,
|
||||
documentIds,
|
||||
mode,
|
||||
knowledgeNameMap,
|
||||
],
|
||||
);
|
||||
|
||||
const handleShowConnectToKnowledgeModal = useCallback(
|
||||
@@ -110,9 +134,11 @@ export const useHandleConnectToKnowledge = () => {
|
||||
if (Array.isArray(documents)) {
|
||||
setDocumentIds(documents);
|
||||
setRecord({} as IFile);
|
||||
setMode('add');
|
||||
} else {
|
||||
setRecord(documents);
|
||||
setDocumentIds([documents.id]);
|
||||
setMode('replace');
|
||||
}
|
||||
|
||||
showConnectToKnowledgeModal();
|
||||
|
||||
Reference in New Issue
Block a user