Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. import {
  2. useMutation,
  3. useQuery,
  4. } from '@tanstack/react-query'
  5. import { del, get, patch } from '../base'
  6. import { useInvalid } from '../use-base'
  7. import type { MetadataType, SortType } from '../datasets'
  8. import { pauseDocIndexing, resumeDocIndexing } from '../datasets'
  9. import type { DocumentDetailResponse, DocumentListResponse, UpdateDocumentBatchParams } from '@/models/datasets'
  10. import { DocumentActionType } from '@/models/datasets'
  11. import type { CommonResponse } from '@/models/common'
  12. // Download document with authentication (sends Authorization header)
  13. import Toast from '@/app/components/base/toast'
  14. const NAME_SPACE = 'knowledge/document'
  15. export const useDocumentListKey = [NAME_SPACE, 'documentList']
  16. export const useDocumentList = (payload: {
  17. datasetId: string
  18. query: {
  19. keyword: string
  20. page: number
  21. limit: number
  22. sort?: SortType
  23. },
  24. refetchInterval?: number | false
  25. }) => {
  26. const { query, datasetId, refetchInterval } = payload
  27. const { keyword, page, limit, sort } = query
  28. return useQuery<DocumentListResponse>({
  29. queryKey: [...useDocumentListKey, datasetId, keyword, page, limit, sort],
  30. queryFn: () => get<DocumentListResponse>(`/datasets/${datasetId}/documents`, {
  31. params: query,
  32. }),
  33. refetchInterval,
  34. })
  35. }
  36. export const useInvalidDocumentList = (datasetId?: string) => {
  37. return useInvalid(datasetId ? [...useDocumentListKey, datasetId] : useDocumentListKey)
  38. }
  39. const useAutoDisabledDocumentKey = [NAME_SPACE, 'autoDisabledDocument']
  40. export const useAutoDisabledDocuments = (datasetId: string) => {
  41. return useQuery({
  42. queryKey: [...useAutoDisabledDocumentKey, datasetId],
  43. queryFn: () => get<{ document_ids: string[] }>(`/datasets/${datasetId}/auto-disable-logs`),
  44. })
  45. }
  46. export const useInvalidDisabledDocument = () => {
  47. return useInvalid(useAutoDisabledDocumentKey)
  48. }
  49. const toBatchDocumentsIdParams = (documentIds: string[] | string) => {
  50. const ids = Array.isArray(documentIds) ? documentIds : [documentIds]
  51. return ids.map(id => `document_id=${id}`).join('&')
  52. }
  53. export const useDocumentBatchAction = (action: DocumentActionType) => {
  54. return useMutation({
  55. mutationFn: ({ datasetId, documentIds, documentId }: UpdateDocumentBatchParams) => {
  56. return patch<CommonResponse>(`/datasets/${datasetId}/documents/status/${action}/batch?${toBatchDocumentsIdParams(documentId || documentIds!)}`)
  57. },
  58. })
  59. }
  60. export const useDocumentEnable = () => {
  61. return useDocumentBatchAction(DocumentActionType.enable)
  62. }
  63. export const useDocumentDisable = () => {
  64. return useDocumentBatchAction(DocumentActionType.disable)
  65. }
  66. export const useDocumentArchive = () => {
  67. return useDocumentBatchAction(DocumentActionType.archive)
  68. }
  69. export const useDocumentUnArchive = () => {
  70. return useDocumentBatchAction(DocumentActionType.unArchive)
  71. }
  72. export const useDocumentDelete = () => {
  73. return useMutation({
  74. mutationFn: ({ datasetId, documentIds, documentId }: UpdateDocumentBatchParams) => {
  75. return del<CommonResponse>(`/datasets/${datasetId}/documents?${toBatchDocumentsIdParams(documentId || documentIds!)}`)
  76. },
  77. })
  78. }
  79. export const useSyncDocument = () => {
  80. return useMutation({
  81. mutationFn: ({ datasetId, documentId }: UpdateDocumentBatchParams) => {
  82. return get<CommonResponse>(`/datasets/${datasetId}/documents/${documentId}/notion/sync`)
  83. },
  84. })
  85. }
  86. // Download document with authentication (sends Authorization header)
  87. export const useDocumentDownload = () => {
  88. return useMutation({
  89. mutationFn: async ({ datasetId, documentId }: { datasetId: string; documentId: string }) => {
  90. // The get helper automatically adds the Authorization header from localStorage
  91. return get<CommonResponse>(`/datasets/${datasetId}/documents/${documentId}/upload-file`)
  92. },
  93. onError: (error: any) => {
  94. // Show a toast notification if download fails
  95. const message = error?.message || 'Download failed.'
  96. Toast.notify({ type: 'error', message })
  97. },
  98. })
  99. }
  100. export const useSyncWebsite = () => {
  101. return useMutation({
  102. mutationFn: ({ datasetId, documentId }: UpdateDocumentBatchParams) => {
  103. return get<CommonResponse>(`/datasets/${datasetId}/documents/${documentId}/website-sync`)
  104. },
  105. })
  106. }
  107. const useDocumentDetailKey = [NAME_SPACE, 'documentDetail', 'withoutMetaData']
  108. export const useDocumentDetail = (payload: {
  109. datasetId: string
  110. documentId: string
  111. params: { metadata: MetadataType }
  112. }) => {
  113. const { datasetId, documentId, params } = payload
  114. return useQuery<DocumentDetailResponse>({
  115. queryKey: [...useDocumentDetailKey, 'withoutMetaData', datasetId, documentId],
  116. queryFn: () => get<DocumentDetailResponse>(`/datasets/${datasetId}/documents/${documentId}`, { params }),
  117. })
  118. }
  119. export const useDocumentMetadata = (payload: {
  120. datasetId: string
  121. documentId: string
  122. params: { metadata: MetadataType }
  123. }) => {
  124. const { datasetId, documentId, params } = payload
  125. return useQuery<DocumentDetailResponse>({
  126. queryKey: [...useDocumentDetailKey, 'onlyMetaData', datasetId, documentId],
  127. queryFn: () => get<DocumentDetailResponse>(`/datasets/${datasetId}/documents/${documentId}`, { params }),
  128. })
  129. }
  130. export const useInvalidDocumentDetailKey = () => {
  131. return useInvalid(useDocumentDetailKey)
  132. }
  133. export const useDocumentPause = () => {
  134. return useMutation({
  135. mutationFn: ({ datasetId, documentId }: UpdateDocumentBatchParams) => {
  136. if (!datasetId || !documentId)
  137. throw new Error('datasetId and documentId are required')
  138. return pauseDocIndexing({ datasetId, documentId }) as Promise<CommonResponse>
  139. },
  140. })
  141. }
  142. export const useDocumentResume = () => {
  143. return useMutation({
  144. mutationFn: ({ datasetId, documentId }: UpdateDocumentBatchParams) => {
  145. if (!datasetId || !documentId)
  146. throw new Error('datasetId and documentId are required')
  147. return resumeDocIndexing({ datasetId, documentId }) as Promise<CommonResponse>
  148. },
  149. })
  150. }