Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

hooks.ts 7.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. import { useSetModalState, useShowDeleteConfirm } from '@/hooks/common-hooks';
  2. import {
  3. useConnectToKnowledge,
  4. useCreateFolder,
  5. useDeleteFile,
  6. useFetchParentFolderList,
  7. useMoveFile,
  8. useRenameFile,
  9. useUploadFile,
  10. } from '@/hooks/file-manager-hooks';
  11. import { IFile } from '@/interfaces/database/file-manager';
  12. import { TableRowSelection } from 'antd/es/table/interface';
  13. import { UploadFile } from 'antd/lib';
  14. import { useCallback, useMemo, useState } from 'react';
  15. import { useNavigate, useSearchParams } from 'umi';
  16. export const useGetFolderId = () => {
  17. const [searchParams] = useSearchParams();
  18. const id = searchParams.get('folderId') as string;
  19. return id ?? '';
  20. };
  21. export const useGetRowSelection = () => {
  22. const [selectedRowKeys, setSelectedRowKeys] = useState<React.Key[]>([]);
  23. const rowSelection: TableRowSelection<IFile> = {
  24. selectedRowKeys,
  25. getCheckboxProps: (record) => {
  26. return { disabled: record.source_type === 'knowledgebase' };
  27. },
  28. onChange: (newSelectedRowKeys: React.Key[]) => {
  29. setSelectedRowKeys(newSelectedRowKeys);
  30. },
  31. };
  32. return { rowSelection, setSelectedRowKeys };
  33. };
  34. export const useNavigateToOtherFolder = () => {
  35. const navigate = useNavigate();
  36. const navigateToOtherFolder = useCallback(
  37. (folderId: string) => {
  38. navigate(`/file?folderId=${folderId}`);
  39. },
  40. [navigate],
  41. );
  42. return navigateToOtherFolder;
  43. };
  44. export const useRenameCurrentFile = () => {
  45. const [file, setFile] = useState<IFile>({} as IFile);
  46. const {
  47. visible: fileRenameVisible,
  48. hideModal: hideFileRenameModal,
  49. showModal: showFileRenameModal,
  50. } = useSetModalState();
  51. const { renameFile, loading } = useRenameFile();
  52. const onFileRenameOk = useCallback(
  53. async (name: string) => {
  54. const ret = await renameFile({
  55. fileId: file.id,
  56. name,
  57. });
  58. if (ret === 0) {
  59. hideFileRenameModal();
  60. }
  61. },
  62. [renameFile, file, hideFileRenameModal],
  63. );
  64. const handleShowFileRenameModal = useCallback(
  65. async (record: IFile) => {
  66. setFile(record);
  67. showFileRenameModal();
  68. },
  69. [showFileRenameModal],
  70. );
  71. return {
  72. fileRenameLoading: loading,
  73. initialFileName: file.name,
  74. onFileRenameOk,
  75. fileRenameVisible,
  76. hideFileRenameModal,
  77. showFileRenameModal: handleShowFileRenameModal,
  78. };
  79. };
  80. export const useSelectBreadcrumbItems = () => {
  81. const parentFolderList = useFetchParentFolderList();
  82. return parentFolderList.length === 1
  83. ? []
  84. : parentFolderList.map((x) => ({
  85. title: x.name === '/' ? 'root' : x.name,
  86. path: `/file?folderId=${x.id}`,
  87. }));
  88. };
  89. export const useHandleCreateFolder = () => {
  90. const {
  91. visible: folderCreateModalVisible,
  92. hideModal: hideFolderCreateModal,
  93. showModal: showFolderCreateModal,
  94. } = useSetModalState();
  95. const { createFolder, loading } = useCreateFolder();
  96. const id = useGetFolderId();
  97. const onFolderCreateOk = useCallback(
  98. async (name: string) => {
  99. const ret = await createFolder({ parentId: id, name });
  100. if (ret === 0) {
  101. hideFolderCreateModal();
  102. }
  103. },
  104. [createFolder, hideFolderCreateModal, id],
  105. );
  106. return {
  107. folderCreateLoading: loading,
  108. onFolderCreateOk,
  109. folderCreateModalVisible,
  110. hideFolderCreateModal,
  111. showFolderCreateModal,
  112. };
  113. };
  114. export const useHandleDeleteFile = (
  115. fileIds: string[],
  116. setSelectedRowKeys: (keys: string[]) => void,
  117. ) => {
  118. const { deleteFile: removeDocument } = useDeleteFile();
  119. const showDeleteConfirm = useShowDeleteConfirm();
  120. const parentId = useGetFolderId();
  121. const handleRemoveFile = () => {
  122. showDeleteConfirm({
  123. onOk: async () => {
  124. const code = await removeDocument({ fileIds, parentId });
  125. if (code === 0) {
  126. setSelectedRowKeys([]);
  127. }
  128. return;
  129. },
  130. });
  131. };
  132. return { handleRemoveFile };
  133. };
  134. export const useHandleUploadFile = () => {
  135. const {
  136. visible: fileUploadVisible,
  137. hideModal: hideFileUploadModal,
  138. showModal: showFileUploadModal,
  139. } = useSetModalState();
  140. const { uploadFile, loading } = useUploadFile();
  141. const id = useGetFolderId();
  142. const onFileUploadOk = useCallback(
  143. async (fileList: UploadFile[]): Promise<number | undefined> => {
  144. if (fileList.length > 0) {
  145. const ret: number = await uploadFile({ fileList, parentId: id });
  146. if (ret === 0) {
  147. hideFileUploadModal();
  148. }
  149. return ret;
  150. }
  151. },
  152. [uploadFile, hideFileUploadModal, id],
  153. );
  154. return {
  155. fileUploadLoading: loading,
  156. onFileUploadOk,
  157. fileUploadVisible,
  158. hideFileUploadModal,
  159. showFileUploadModal,
  160. };
  161. };
  162. export const useHandleConnectToKnowledge = () => {
  163. const {
  164. visible: connectToKnowledgeVisible,
  165. hideModal: hideConnectToKnowledgeModal,
  166. showModal: showConnectToKnowledgeModal,
  167. } = useSetModalState();
  168. const { connectFileToKnowledge: connectToKnowledge, loading } =
  169. useConnectToKnowledge();
  170. const [record, setRecord] = useState<IFile>({} as IFile);
  171. const initialValue = useMemo(() => {
  172. return Array.isArray(record?.kbs_info)
  173. ? record?.kbs_info?.map((x) => x.kb_id)
  174. : [];
  175. }, [record?.kbs_info]);
  176. const onConnectToKnowledgeOk = useCallback(
  177. async (knowledgeIds: string[]) => {
  178. const ret = await connectToKnowledge({
  179. fileIds: [record.id],
  180. kbIds: knowledgeIds,
  181. });
  182. if (ret === 0) {
  183. hideConnectToKnowledgeModal();
  184. }
  185. return ret;
  186. },
  187. [connectToKnowledge, hideConnectToKnowledgeModal, record.id],
  188. );
  189. const handleShowConnectToKnowledgeModal = useCallback(
  190. (record: IFile) => {
  191. setRecord(record);
  192. showConnectToKnowledgeModal();
  193. },
  194. [showConnectToKnowledgeModal],
  195. );
  196. return {
  197. initialValue,
  198. connectToKnowledgeLoading: loading,
  199. onConnectToKnowledgeOk,
  200. connectToKnowledgeVisible,
  201. hideConnectToKnowledgeModal,
  202. showConnectToKnowledgeModal: handleShowConnectToKnowledgeModal,
  203. };
  204. };
  205. export const useHandleBreadcrumbClick = () => {
  206. const navigate = useNavigate();
  207. const handleBreadcrumbClick = useCallback(
  208. (path?: string) => {
  209. if (path) {
  210. navigate(path);
  211. }
  212. },
  213. [navigate],
  214. );
  215. return { handleBreadcrumbClick };
  216. };
  217. export const useHandleMoveFile = (
  218. setSelectedRowKeys: (keys: string[]) => void,
  219. ) => {
  220. const {
  221. visible: moveFileVisible,
  222. hideModal: hideMoveFileModal,
  223. showModal: showMoveFileModal,
  224. } = useSetModalState();
  225. const { moveFile, loading } = useMoveFile();
  226. const [sourceFileIds, setSourceFileIds] = useState<string[]>([]);
  227. const onMoveFileOk = useCallback(
  228. async (targetFolderId: string) => {
  229. const ret = await moveFile({
  230. src_file_ids: sourceFileIds,
  231. dest_file_id: targetFolderId,
  232. });
  233. if (ret === 0) {
  234. setSelectedRowKeys([]);
  235. hideMoveFileModal();
  236. }
  237. return ret;
  238. },
  239. [moveFile, hideMoveFileModal, sourceFileIds, setSelectedRowKeys],
  240. );
  241. const handleShowMoveFileModal = useCallback(
  242. (ids: string[]) => {
  243. setSourceFileIds(ids);
  244. showMoveFileModal();
  245. },
  246. [showMoveFileModal],
  247. );
  248. return {
  249. initialValue: '',
  250. moveFileLoading: loading,
  251. onMoveFileOk,
  252. moveFileVisible,
  253. hideMoveFileModal,
  254. showMoveFileModal: handleShowMoveFileModal,
  255. };
  256. };