import { useSetModalState, useShowDeleteConfirm, useTranslate, } from '@/hooks/commonHooks'; import { useConnectToKnowledge, useCreateFolder, useFetchFileList, useFetchParentFolderList, useRemoveFile, useRenameFile, useSelectFileList, useSelectParentFolderList, useUploadFile, } from '@/hooks/fileManagerHooks'; import { useOneNamespaceEffectsLoading } from '@/hooks/storeHooks'; import { Pagination } from '@/interfaces/common'; import { IFile } from '@/interfaces/database/file-manager'; import { getFilePathByWebkitRelativePath } from '@/utils/fileUtil'; import { PaginationProps } from 'antd'; import { UploadFile } from 'antd/lib'; import { useCallback, useEffect, useMemo, useState } from 'react'; import { useDispatch, useNavigate, useSearchParams, useSelector } from 'umi'; export const useGetFolderId = () => { const [searchParams] = useSearchParams(); const id = searchParams.get('folderId') as string; return id; }; export const useFetchDocumentListOnMount = () => { const fetchDocumentList = useFetchFileList(); const fileList = useSelectFileList(); const id = useGetFolderId(); const dispatch = useDispatch(); useEffect(() => { fetchDocumentList({ parent_id: id }); }, [dispatch, fetchDocumentList, id]); return { fetchDocumentList, fileList }; }; export const useGetPagination = ( fetchDocumentList: (payload: IFile) => any, ) => { 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 useHandleSearchChange = (setPagination: () => void) => { const dispatch = useDispatch(); const throttledGetDocumentList = useCallback(() => { dispatch({ type: 'kFModel/throttledGetDocumentList', }); }, [dispatch]); const handleInputChange = useCallback( (e: React.ChangeEvent) => { const value = e.target.value; dispatch({ type: 'kFModel/setSearchString', payload: value }); setPagination(); throttledGetDocumentList(); }, [setPagination, throttledGetDocumentList, dispatch], ); return { handleInputChange }; }; export const useGetRowSelection = () => { const [selectedRowKeys, setSelectedRowKeys] = useState([]); const rowSelection = { selectedRowKeys, onChange: (newSelectedRowKeys: React.Key[]) => { setSelectedRowKeys(newSelectedRowKeys); }, }; return rowSelection; }; export const useNavigateToOtherFolder = () => { const navigate = useNavigate(); const navigateToOtherFolder = useCallback( (folderId: string) => { navigate(`/file?folderId=${folderId}`); }, [navigate], ); return navigateToOtherFolder; }; export const useRenameCurrentFile = () => { const [file, setFile] = useState({} as IFile); const { visible: fileRenameVisible, hideModal: hideFileRenameModal, showModal: showFileRenameModal, } = useSetModalState(); const renameFile = useRenameFile(); const onFileRenameOk = useCallback( async (name: string) => { const ret = await renameFile(file.id, name, file.parent_id); if (ret === 0) { hideFileRenameModal(); } }, [renameFile, file, hideFileRenameModal], ); const loading = useOneNamespaceEffectsLoading('fileManager', ['renameFile']); const handleShowFileRenameModal = useCallback( async (record: IFile) => { setFile(record); showFileRenameModal(); }, [showFileRenameModal], ); return { fileRenameLoading: loading, initialFileName: file.name, onFileRenameOk, fileRenameVisible, hideFileRenameModal, showFileRenameModal: handleShowFileRenameModal, }; }; export const useSelectBreadcrumbItems = () => { const parentFolderList = useSelectParentFolderList(); const id = useGetFolderId(); const fetchParentFolderList = useFetchParentFolderList(); useEffect(() => { if (id) { fetchParentFolderList(id); } }, [id, fetchParentFolderList]); return parentFolderList.length === 1 ? [] : parentFolderList.map((x) => ({ title: x.name === '/' ? 'root' : x.name, path: `/file?folderId=${x.id}`, })); }; export const useHandleCreateFolder = () => { const { visible: folderCreateModalVisible, hideModal: hideFolderCreateModal, showModal: showFolderCreateModal, } = useSetModalState(); const createFolder = useCreateFolder(); const id = useGetFolderId(); const onFolderCreateOk = useCallback( async (name: string) => { const ret = await createFolder(id, name); if (ret === 0) { hideFolderCreateModal(); } }, [createFolder, hideFolderCreateModal, id], ); const loading = useOneNamespaceEffectsLoading('fileManager', [ 'createFolder', ]); return { folderCreateLoading: loading, onFolderCreateOk, folderCreateModalVisible, hideFolderCreateModal, showFolderCreateModal, }; }; export const useHandleDeleteFile = (fileIds: string[]) => { const removeDocument = useRemoveFile(); const showDeleteConfirm = useShowDeleteConfirm(); const parentId = useGetFolderId(); const handleRemoveFile = () => { showDeleteConfirm({ onOk: () => { return removeDocument(fileIds, parentId); }, }); }; return { handleRemoveFile }; }; export const useSelectFileListLoading = () => { return useOneNamespaceEffectsLoading('fileManager', ['listFile']); }; export const useHandleUploadFile = () => { const { visible: fileUploadVisible, hideModal: hideFileUploadModal, showModal: showFileUploadModal, } = useSetModalState(); const uploadFile = useUploadFile(); const id = useGetFolderId(); const onFileUploadOk = useCallback( async (fileList: UploadFile[]) => { console.info('fileList', fileList); if (fileList.length > 0) { const ret = await uploadFile( fileList[0], id, getFilePathByWebkitRelativePath(fileList[0] as any), ); if (ret === 0) { hideFileUploadModal(); } } }, [uploadFile, hideFileUploadModal, id], ); const loading = useOneNamespaceEffectsLoading('fileManager', ['uploadFile']); return { fileUploadLoading: loading, onFileUploadOk, fileUploadVisible, hideFileUploadModal, showFileUploadModal, }; }; export const useHandleConnectToKnowledge = () => { const { visible: connectToKnowledgeVisible, hideModal: hideConnectToKnowledgeModal, showModal: showConnectToKnowledgeModal, } = useSetModalState(); const connectToKnowledge = useConnectToKnowledge(); const id = useGetFolderId(); const [fileIds, setFileIds] = useState([]); const onConnectToKnowledgeOk = useCallback( async (knowledgeIds: string[]) => { const ret = await connectToKnowledge({ parentId: id, fileIds, kbIds: knowledgeIds, }); if (ret === 0) { hideConnectToKnowledgeModal(); } }, [connectToKnowledge, hideConnectToKnowledgeModal, id, fileIds], ); const loading = useOneNamespaceEffectsLoading('fileManager', [ 'connectFileToKnowledge', ]); const handleShowConnectToKnowledgeModal = useCallback( (ids: string[]) => { setFileIds(ids); showConnectToKnowledgeModal(); }, [showConnectToKnowledgeModal], ); return { connectToKnowledgeLoading: loading, onConnectToKnowledgeOk, connectToKnowledgeVisible, hideConnectToKnowledgeModal, showConnectToKnowledgeModal: handleShowConnectToKnowledgeModal, }; };