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 3.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. import { useTranslation } from 'react-i18next'
  2. import type { DataSourceOption } from './types'
  3. import { TestRunStep } from './types'
  4. import { useNodes } from 'reactflow'
  5. import { BlockEnum } from '@/app/components/workflow/types'
  6. import type { DataSourceNodeType } from '@/app/components/workflow/nodes/data-source/types'
  7. import { useCallback, useMemo, useState } from 'react'
  8. import type { CrawlResult } from '@/models/datasets'
  9. import { type CrawlResultItem, CrawlStep, type FileItem } from '@/models/datasets'
  10. import produce from 'immer'
  11. import type { NotionPage } from '@/models/common'
  12. export const useTestRunSteps = () => {
  13. const { t } = useTranslation()
  14. const [currentStep, setCurrentStep] = useState(1)
  15. const handleNextStep = useCallback(() => {
  16. setCurrentStep(preStep => preStep + 1)
  17. }, [])
  18. const handleBackStep = useCallback(() => {
  19. setCurrentStep(preStep => preStep - 1)
  20. }, [])
  21. const steps = [
  22. {
  23. label: t('datasetPipeline.testRun.steps.dataSource'),
  24. value: TestRunStep.dataSource,
  25. },
  26. {
  27. label: t('datasetPipeline.testRun.steps.documentProcessing'),
  28. value: TestRunStep.documentProcessing,
  29. },
  30. ]
  31. return {
  32. steps,
  33. currentStep,
  34. handleNextStep,
  35. handleBackStep,
  36. }
  37. }
  38. export const useDatasourceOptions = () => {
  39. const nodes = useNodes<DataSourceNodeType>()
  40. const datasourceNodes = nodes.filter(node => node.data.type === BlockEnum.DataSource)
  41. const options = useMemo(() => {
  42. const options: DataSourceOption[] = []
  43. datasourceNodes.forEach((node) => {
  44. const label = node.data.title
  45. options.push({
  46. label,
  47. value: node.id,
  48. data: node.data,
  49. })
  50. })
  51. if (process.env.NODE_ENV === 'development') {
  52. // todo: delete mock data
  53. options.push({
  54. label: 'Google Drive',
  55. value: '123456',
  56. // @ts-expect-error mock data
  57. data: {
  58. datasource_parameters: {},
  59. datasource_configurations: {},
  60. type: BlockEnum.DataSource,
  61. title: 'Google Drive',
  62. plugin_id: 'langgenius/google-drive',
  63. provider_type: 'online_drive',
  64. provider_name: 'google_drive',
  65. datasource_name: 'google-drive',
  66. datasource_label: 'Google Drive',
  67. selected: false,
  68. },
  69. })
  70. }
  71. return options
  72. }, [datasourceNodes])
  73. return options
  74. }
  75. export const useLocalFile = () => {
  76. const [fileList, setFileList] = useState<FileItem[]>([])
  77. const allFileLoaded = useMemo(() => (fileList.length > 0 && fileList.every(file => file.file.id)), [fileList])
  78. const updateFile = (fileItem: FileItem, progress: number, list: FileItem[]) => {
  79. const newList = produce(list, (draft) => {
  80. const targetIndex = draft.findIndex(file => file.fileID === fileItem.fileID)
  81. draft[targetIndex] = {
  82. ...draft[targetIndex],
  83. progress,
  84. }
  85. })
  86. setFileList(newList)
  87. }
  88. const updateFileList = (preparedFiles: FileItem[]) => {
  89. setFileList(preparedFiles)
  90. }
  91. return {
  92. fileList,
  93. allFileLoaded,
  94. updateFile,
  95. updateFileList,
  96. }
  97. }
  98. export const useOnlineDocuments = () => {
  99. const [onlineDocuments, setOnlineDocuments] = useState<NotionPage[]>([])
  100. const updateOnlineDocuments = (value: NotionPage[]) => {
  101. setOnlineDocuments(value)
  102. }
  103. return {
  104. onlineDocuments,
  105. updateOnlineDocuments,
  106. }
  107. }
  108. export const useWebsiteCrawl = () => {
  109. const [websitePages, setWebsitePages] = useState<CrawlResultItem[]>([])
  110. const [crawlResult, setCrawlResult] = useState<CrawlResult | undefined>()
  111. const [step, setStep] = useState<CrawlStep>(CrawlStep.init)
  112. return {
  113. crawlResult,
  114. setCrawlResult,
  115. websitePages,
  116. setWebsitePages,
  117. step,
  118. setStep,
  119. }
  120. }