| 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<HTMLInputElement | HTMLTextAreaElement>) => { | |
| 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<React.Key[]>([]); | |
| 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<IFile>({} 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<string[]>([]); | |
| 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, | |
| }; | |
| }; | |