Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

hooks.ts 5.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  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, useRef, 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 type { CrawlResult, CrawlResultItem, DocumentItem, FileItem } from '@/models/datasets'
  8. import { CrawlStep } from '@/models/datasets'
  9. import produce from 'immer'
  10. import type { NotionPage } from '@/models/common'
  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. if (process.env.NODE_ENV === 'development') {
  54. // todo: delete mock data
  55. options.push({
  56. label: 'Google Drive',
  57. value: '123456',
  58. // @ts-expect-error mock data
  59. data: {
  60. datasource_parameters: {},
  61. datasource_configurations: {},
  62. type: BlockEnum.DataSource,
  63. title: 'Google Drive',
  64. plugin_id: 'langgenius/google-drive',
  65. provider_type: 'online_drive',
  66. provider_name: 'google_drive',
  67. datasource_name: 'google-drive',
  68. datasource_label: 'Google Drive',
  69. selected: false,
  70. },
  71. })
  72. }
  73. return options
  74. }, [datasourceNodes])
  75. return options
  76. }
  77. export const useLocalFile = () => {
  78. const [fileList, setFileList] = useState<FileItem[]>([])
  79. const [currentFile, setCurrentFile] = useState<File | undefined>()
  80. const previewFile = useRef<DocumentItem>()
  81. const allFileLoaded = useMemo(() => (fileList.length > 0 && fileList.every(file => file.file.id)), [fileList])
  82. const updateFile = (fileItem: FileItem, progress: number, list: FileItem[]) => {
  83. const newList = produce(list, (draft) => {
  84. const targetIndex = draft.findIndex(file => file.fileID === fileItem.fileID)
  85. draft[targetIndex] = {
  86. ...draft[targetIndex],
  87. progress,
  88. }
  89. })
  90. setFileList(newList)
  91. previewFile.current = newList[0].file as DocumentItem
  92. }
  93. const updateFileList = useCallback((preparedFiles: FileItem[]) => {
  94. setFileList(preparedFiles)
  95. }, [])
  96. const updateCurrentFile = useCallback((file: File) => {
  97. setCurrentFile(file)
  98. }, [])
  99. const hideFilePreview = useCallback(() => {
  100. setCurrentFile(undefined)
  101. }, [])
  102. return {
  103. fileList,
  104. previewFile,
  105. allFileLoaded,
  106. updateFile,
  107. updateFileList,
  108. currentFile,
  109. updateCurrentFile,
  110. hideFilePreview,
  111. }
  112. }
  113. export const useOnlineDocuments = () => {
  114. const [onlineDocuments, setOnlineDocuments] = useState<NotionPage[]>([])
  115. const [currentDocument, setCurrentDocument] = useState<NotionPage | undefined>()
  116. const previewOnlineDocument = useRef<NotionPage>(onlineDocuments[0])
  117. const updateOnlineDocuments = (value: NotionPage[]) => {
  118. setOnlineDocuments(value)
  119. }
  120. const updateCurrentPage = useCallback((page: NotionPage) => {
  121. setCurrentDocument(page)
  122. }, [])
  123. const hideOnlineDocumentPreview = useCallback(() => {
  124. setCurrentDocument(undefined)
  125. }, [])
  126. return {
  127. onlineDocuments,
  128. previewOnlineDocument,
  129. updateOnlineDocuments,
  130. currentDocument,
  131. updateCurrentPage,
  132. hideOnlineDocumentPreview,
  133. }
  134. }
  135. export const useWebsiteCrawl = () => {
  136. const [websitePages, setWebsitePages] = useState<CrawlResultItem[]>([])
  137. const [currentWebsite, setCurrentWebsite] = useState<CrawlResultItem | undefined>()
  138. const [crawlResult, setCrawlResult] = useState<CrawlResult | undefined>()
  139. const [step, setStep] = useState<CrawlStep>(CrawlStep.init)
  140. const [previewIndex, setPreviewIndex] = useState<number>(-1)
  141. const previewWebsitePage = useRef<CrawlResultItem>(websitePages[0])
  142. const updateCurrentWebsite = useCallback((website: CrawlResultItem, index: number) => {
  143. setCurrentWebsite(website)
  144. setPreviewIndex(index)
  145. }, [])
  146. const hideWebsitePreview = useCallback(() => {
  147. setCurrentWebsite(undefined)
  148. setPreviewIndex(-1)
  149. }, [])
  150. const updataCheckedCrawlResultChange = useCallback((checkedCrawlResult: CrawlResultItem[]) => {
  151. setWebsitePages(checkedCrawlResult)
  152. previewWebsitePage.current = checkedCrawlResult[0]
  153. }, [])
  154. return {
  155. websitePages,
  156. crawlResult,
  157. setCrawlResult,
  158. step,
  159. setStep,
  160. previewWebsitePage,
  161. updataCheckedCrawlResultChange,
  162. currentWebsite,
  163. updateCurrentWebsite,
  164. previewIndex,
  165. hideWebsitePreview,
  166. }
  167. }