You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

index.tsx 6.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. 'use client'
  2. import type { FC } from 'react'
  3. import React, { useCallback, useMemo, useState } from 'react'
  4. import { useTranslation } from 'react-i18next'
  5. import s from './index.module.css'
  6. import NoData from './no-data'
  7. import Firecrawl from './firecrawl'
  8. import Watercrawl from './watercrawl'
  9. import JinaReader from './jina-reader'
  10. import cn from '@/utils/classnames'
  11. import { useModalContext } from '@/context/modal-context'
  12. import type { CrawlOptions, CrawlResultItem } from '@/models/datasets'
  13. import { DataSourceProvider } from '@/models/common'
  14. import { ENABLE_WEBSITE_FIRECRAWL, ENABLE_WEBSITE_JINAREADER, ENABLE_WEBSITE_WATERCRAWL } from '@/config'
  15. import type { DataSourceAuth } from '@/app/components/header/account-setting/data-source-page-new/types'
  16. type Props = {
  17. onPreview: (payload: CrawlResultItem) => void
  18. checkedCrawlResult: CrawlResultItem[]
  19. onCheckedCrawlResultChange: (payload: CrawlResultItem[]) => void
  20. onCrawlProviderChange: (provider: DataSourceProvider) => void
  21. onJobIdChange: (jobId: string) => void
  22. crawlOptions: CrawlOptions
  23. onCrawlOptionsChange: (payload: CrawlOptions) => void
  24. authedDataSourceList: DataSourceAuth[]
  25. }
  26. const Website: FC<Props> = ({
  27. onPreview,
  28. checkedCrawlResult,
  29. onCheckedCrawlResultChange,
  30. onCrawlProviderChange,
  31. onJobIdChange,
  32. crawlOptions,
  33. onCrawlOptionsChange,
  34. authedDataSourceList,
  35. }) => {
  36. const { t } = useTranslation()
  37. const { setShowAccountSettingModal } = useModalContext()
  38. const [selectedProvider, setSelectedProvider] = useState<DataSourceProvider>(DataSourceProvider.jinaReader)
  39. const availableProviders = useMemo(() => authedDataSourceList.filter((item) => {
  40. return [
  41. DataSourceProvider.jinaReader,
  42. DataSourceProvider.fireCrawl,
  43. DataSourceProvider.waterCrawl].includes(item.provider as DataSourceProvider) && item.credentials_list.length > 0
  44. }), [authedDataSourceList])
  45. const handleOnConfig = useCallback(() => {
  46. setShowAccountSettingModal({
  47. payload: 'data-source',
  48. })
  49. }, [setShowAccountSettingModal])
  50. const source = availableProviders.find(source => source.provider === selectedProvider)
  51. return (
  52. <div>
  53. <div className='mb-4'>
  54. <div className='system-md-medium mb-2 text-text-secondary'>
  55. {t('datasetCreation.stepOne.website.chooseProvider')}
  56. </div>
  57. <div className='flex space-x-2'>
  58. {ENABLE_WEBSITE_JINAREADER && <button type="button"
  59. className={cn('flex items-center justify-center rounded-lg px-4 py-2',
  60. selectedProvider === DataSourceProvider.jinaReader
  61. ? 'system-sm-medium border-[1.5px] border-components-option-card-option-selected-border bg-components-option-card-option-selected-bg text-text-primary'
  62. : `system-sm-regular border border-components-option-card-option-border bg-components-option-card-option-bg text-text-secondary
  63. hover:border-components-option-card-option-border-hover hover:bg-components-option-card-option-bg-hover hover:shadow-xs hover:shadow-shadow-shadow-3`,
  64. )}
  65. onClick={() => {
  66. setSelectedProvider(DataSourceProvider.jinaReader)
  67. onCrawlProviderChange(DataSourceProvider.jinaReader)
  68. }}
  69. >
  70. <span className={cn(s.jinaLogo, 'mr-2')} />
  71. <span>Jina Reader</span>
  72. </button>}
  73. {ENABLE_WEBSITE_FIRECRAWL && <button type="button"
  74. className={cn('rounded-lg px-4 py-2',
  75. selectedProvider === DataSourceProvider.fireCrawl
  76. ? 'system-sm-medium border-[1.5px] border-components-option-card-option-selected-border bg-components-option-card-option-selected-bg text-text-primary'
  77. : `system-sm-regular border border-components-option-card-option-border bg-components-option-card-option-bg text-text-secondary
  78. hover:border-components-option-card-option-border-hover hover:bg-components-option-card-option-bg-hover hover:shadow-xs hover:shadow-shadow-shadow-3`,
  79. )}
  80. onClick={() => {
  81. setSelectedProvider(DataSourceProvider.fireCrawl)
  82. onCrawlProviderChange(DataSourceProvider.fireCrawl)
  83. }}
  84. >
  85. 🔥 Firecrawl
  86. </button>}
  87. {ENABLE_WEBSITE_WATERCRAWL && <button type="button"
  88. className={cn('flex items-center justify-center rounded-lg px-4 py-2',
  89. selectedProvider === DataSourceProvider.waterCrawl
  90. ? 'system-sm-medium border-[1.5px] border-components-option-card-option-selected-border bg-components-option-card-option-selected-bg text-text-primary'
  91. : `system-sm-regular border border-components-option-card-option-border bg-components-option-card-option-bg text-text-secondary
  92. hover:border-components-option-card-option-border-hover hover:bg-components-option-card-option-bg-hover hover:shadow-xs hover:shadow-shadow-shadow-3`,
  93. )}
  94. onClick={() => {
  95. setSelectedProvider(DataSourceProvider.waterCrawl)
  96. onCrawlProviderChange(DataSourceProvider.waterCrawl)
  97. }}
  98. >
  99. <span className={cn(s.watercrawlLogo, 'mr-2')} />
  100. <span>WaterCrawl</span>
  101. </button>}
  102. </div>
  103. </div>
  104. {source && selectedProvider === DataSourceProvider.fireCrawl && (
  105. <Firecrawl
  106. onPreview={onPreview}
  107. checkedCrawlResult={checkedCrawlResult}
  108. onCheckedCrawlResultChange={onCheckedCrawlResultChange}
  109. onJobIdChange={onJobIdChange}
  110. crawlOptions={crawlOptions}
  111. onCrawlOptionsChange={onCrawlOptionsChange}
  112. />
  113. )}
  114. {source && selectedProvider === DataSourceProvider.waterCrawl && (
  115. <Watercrawl
  116. onPreview={onPreview}
  117. checkedCrawlResult={checkedCrawlResult}
  118. onCheckedCrawlResultChange={onCheckedCrawlResultChange}
  119. onJobIdChange={onJobIdChange}
  120. crawlOptions={crawlOptions}
  121. onCrawlOptionsChange={onCrawlOptionsChange}
  122. />
  123. )}
  124. {source && selectedProvider === DataSourceProvider.jinaReader && (
  125. <JinaReader
  126. onPreview={onPreview}
  127. checkedCrawlResult={checkedCrawlResult}
  128. onCheckedCrawlResultChange={onCheckedCrawlResultChange}
  129. onJobIdChange={onJobIdChange}
  130. crawlOptions={crawlOptions}
  131. onCrawlOptionsChange={onCrawlOptionsChange}
  132. />
  133. )}
  134. {!source && (
  135. <NoData onConfig={handleOnConfig} provider={selectedProvider} />
  136. )}
  137. </div>
  138. )
  139. }
  140. export default React.memo(Website)