您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. import { useTranslation } from 'react-i18next'
  2. import { AddDocumentsStep } from './types'
  3. import type { DataSourceOption } from '@/app/components/rag-pipeline/components/panel/test-run/types'
  4. import { useCallback, useMemo, useState } from 'react'
  5. import { BlockEnum, type Node } from '@/app/components/workflow/types'
  6. import type { DataSourceNodeType } from '@/app/components/workflow/nodes/data-source/types'
  7. import { useDataSourceStore, useDataSourceStoreWithSelector } from './data-source/store'
  8. import type { DataSourceNotionPageMap, DataSourceNotionWorkspace } from '@/models/common'
  9. import { useShallow } from 'zustand/react/shallow'
  10. import { CrawlStep } from '@/models/datasets'
  11. export const useAddDocumentsSteps = () => {
  12. const { t } = useTranslation()
  13. const [currentStep, setCurrentStep] = useState(1)
  14. const handleNextStep = useCallback(() => {
  15. setCurrentStep(preStep => preStep + 1)
  16. }, [])
  17. const handleBackStep = useCallback(() => {
  18. setCurrentStep(preStep => preStep - 1)
  19. }, [])
  20. const steps = [
  21. {
  22. label: t('datasetPipeline.addDocuments.steps.chooseDatasource'),
  23. value: AddDocumentsStep.dataSource,
  24. },
  25. {
  26. label: t('datasetPipeline.addDocuments.steps.processDocuments'),
  27. value: AddDocumentsStep.processDocuments,
  28. },
  29. {
  30. label: t('datasetPipeline.addDocuments.steps.processingDocuments'),
  31. value: AddDocumentsStep.processingDocuments,
  32. },
  33. ]
  34. return {
  35. steps,
  36. currentStep,
  37. handleNextStep,
  38. handleBackStep,
  39. }
  40. }
  41. export const useDatasourceOptions = (pipelineNodes: Node<DataSourceNodeType>[]) => {
  42. const datasourceNodes = pipelineNodes.filter(node => node.data.type === BlockEnum.DataSource)
  43. const options = useMemo(() => {
  44. const options: DataSourceOption[] = []
  45. datasourceNodes.forEach((node) => {
  46. const label = node.data.title
  47. options.push({
  48. label,
  49. value: node.id,
  50. data: node.data,
  51. })
  52. })
  53. return options
  54. }, [datasourceNodes])
  55. return options
  56. }
  57. export const useLocalFile = () => {
  58. const {
  59. localFileList,
  60. currentLocalFile,
  61. } = useDataSourceStoreWithSelector(useShallow(state => ({
  62. localFileList: state.localFileList,
  63. currentLocalFile: state.currentLocalFile,
  64. })))
  65. const dataSourceStore = useDataSourceStore()
  66. const allFileLoaded = useMemo(() => (localFileList.length > 0 && localFileList.every(file => file.file.id)), [localFileList])
  67. const hidePreviewLocalFile = useCallback(() => {
  68. const { setCurrentLocalFile } = dataSourceStore.getState()
  69. setCurrentLocalFile(undefined)
  70. }, [dataSourceStore])
  71. return {
  72. localFileList,
  73. allFileLoaded,
  74. currentLocalFile,
  75. hidePreviewLocalFile,
  76. }
  77. }
  78. export const useOnlineDocument = () => {
  79. const {
  80. documentsData,
  81. onlineDocuments,
  82. currentDocument,
  83. } = useDataSourceStoreWithSelector(useShallow(state => ({
  84. documentsData: state.documentsData,
  85. onlineDocuments: state.onlineDocuments,
  86. currentDocument: state.currentDocument,
  87. })))
  88. const dataSourceStore = useDataSourceStore()
  89. const currentWorkspace = documentsData[0]
  90. const PagesMapAndSelectedPagesId: DataSourceNotionPageMap = useMemo(() => {
  91. const pagesMap = (documentsData || []).reduce((prev: DataSourceNotionPageMap, next: DataSourceNotionWorkspace) => {
  92. next.pages.forEach((page) => {
  93. prev[page.page_id] = {
  94. ...page,
  95. workspace_id: next.workspace_id,
  96. }
  97. })
  98. return prev
  99. }, {})
  100. return pagesMap
  101. }, [documentsData])
  102. const hidePreviewOnlineDocument = useCallback(() => {
  103. const { setCurrentDocument } = dataSourceStore.getState()
  104. setCurrentDocument(undefined)
  105. }, [dataSourceStore])
  106. const clearOnlineDocumentData = useCallback(() => {
  107. const {
  108. setDocumentsData,
  109. setSearchValue,
  110. setSelectedPagesId,
  111. setOnlineDocuments,
  112. setCurrentDocument,
  113. } = dataSourceStore.getState()
  114. setDocumentsData([])
  115. setSearchValue('')
  116. setSelectedPagesId(new Set())
  117. setOnlineDocuments([])
  118. setCurrentDocument(undefined)
  119. }, [dataSourceStore])
  120. return {
  121. currentWorkspace,
  122. onlineDocuments,
  123. currentDocument,
  124. PagesMapAndSelectedPagesId,
  125. hidePreviewOnlineDocument,
  126. clearOnlineDocumentData,
  127. }
  128. }
  129. export const useWebsiteCrawl = () => {
  130. const {
  131. websitePages,
  132. currentWebsite,
  133. } = useDataSourceStoreWithSelector(useShallow(state => ({
  134. websitePages: state.websitePages,
  135. currentWebsite: state.currentWebsite,
  136. })))
  137. const dataSourceStore = useDataSourceStore()
  138. const hideWebsitePreview = useCallback(() => {
  139. const { setCurrentWebsite, setPreviewIndex } = dataSourceStore.getState()
  140. setCurrentWebsite(undefined)
  141. setPreviewIndex(-1)
  142. }, [dataSourceStore])
  143. const clearWebsiteCrawlData = useCallback(() => {
  144. const {
  145. setStep,
  146. setCrawlResult,
  147. setWebsitePages,
  148. setPreviewIndex,
  149. setCurrentWebsite,
  150. } = dataSourceStore.getState()
  151. setStep(CrawlStep.init)
  152. setCrawlResult(undefined)
  153. setCurrentWebsite(undefined)
  154. setWebsitePages([])
  155. setPreviewIndex(-1)
  156. }, [dataSourceStore])
  157. return {
  158. websitePages,
  159. currentWebsite,
  160. hideWebsitePreview,
  161. clearWebsiteCrawlData,
  162. }
  163. }
  164. export const useOnlineDrive = () => {
  165. const {
  166. onlineDriveFileList,
  167. selectedFileIds,
  168. } = useDataSourceStoreWithSelector(useShallow(state => ({
  169. onlineDriveFileList: state.onlineDriveFileList,
  170. selectedFileIds: state.selectedFileIds,
  171. })))
  172. const dataSourceStore = useDataSourceStore()
  173. const selectedOnlineDriveFileList = useMemo(() => {
  174. return selectedFileIds.map(key => onlineDriveFileList.find(item => item.id === key)!)
  175. }, [onlineDriveFileList, selectedFileIds])
  176. const clearOnlineDriveData = useCallback(() => {
  177. const {
  178. setOnlineDriveFileList,
  179. setBucket,
  180. setPrefix,
  181. setKeywords,
  182. setSelectedFileIds,
  183. } = dataSourceStore.getState()
  184. setOnlineDriveFileList([])
  185. setBucket('')
  186. setPrefix([])
  187. setKeywords('')
  188. setSelectedFileIds([])
  189. }, [dataSourceStore])
  190. return {
  191. onlineDriveFileList,
  192. selectedFileIds,
  193. selectedOnlineDriveFileList,
  194. clearOnlineDriveData,
  195. }
  196. }