index.tsx 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. 'use client'
  2. import React, { useState } from 'react'
  3. import { useTranslation } from 'react-i18next'
  4. import cn from 'classnames'
  5. import FilePreview from '../file-preview'
  6. import FileUploader from '../file-uploader'
  7. import NotionPagePreview from '../notion-page-preview'
  8. import EmptyDatasetCreationModal from '../empty-dataset-creation-modal'
  9. import s from './index.module.css'
  10. import type { File } from '@/models/datasets'
  11. import type { DataSourceNotionPage } from '@/models/common'
  12. import { DataSourceType } from '@/models/datasets'
  13. import Button from '@/app/components/base/button'
  14. import { NotionPageSelector } from '@/app/components/base/notion-page-selector'
  15. import { useDatasetDetailContext } from '@/context/dataset-detail'
  16. type IStepOneProps = {
  17. datasetId?: string
  18. dataSourceType?: DataSourceType
  19. dataSourceTypeDisable: Boolean
  20. hasConnection: boolean
  21. onSetting: () => void
  22. file?: File
  23. updateFile: (file?: File) => void
  24. notionPages?: any[]
  25. updateNotionPages: (value: any[]) => void
  26. onStepChange: () => void
  27. changeType: (type: DataSourceType) => void
  28. }
  29. type Page = DataSourceNotionPage & { workspace_id: string }
  30. type NotionConnectorProps = {
  31. onSetting: () => void
  32. }
  33. export const NotionConnector = ({ onSetting }: NotionConnectorProps) => {
  34. const { t } = useTranslation()
  35. return (
  36. <div className={s.notionConnectionTip}>
  37. <span className={s.notionIcon}/>
  38. <div className={s.title}>{t('datasetCreation.stepOne.notionSyncTitle')}</div>
  39. <div className={s.tip}>{t('datasetCreation.stepOne.notionSyncTip')}</div>
  40. <Button className='h-8' type='primary' onClick={onSetting}>{t('datasetCreation.stepOne.connect')}</Button>
  41. </div>
  42. )
  43. }
  44. const StepOne = ({
  45. datasetId,
  46. dataSourceType,
  47. dataSourceTypeDisable,
  48. changeType,
  49. hasConnection,
  50. onSetting,
  51. onStepChange,
  52. file,
  53. updateFile,
  54. notionPages = [],
  55. updateNotionPages,
  56. }: IStepOneProps) => {
  57. const { dataset } = useDatasetDetailContext()
  58. const [showModal, setShowModal] = useState(false)
  59. const [showFilePreview, setShowFilePreview] = useState(true)
  60. const [currentNotionPage, setCurrentNotionPage] = useState<Page | undefined>()
  61. const { t } = useTranslation()
  62. const hidePreview = () => setShowFilePreview(false)
  63. const modalShowHandle = () => setShowModal(true)
  64. const modalCloseHandle = () => setShowModal(false)
  65. const updateCurrentPage = (page: Page) => {
  66. setCurrentNotionPage(page)
  67. }
  68. const hideNotionPagePreview = () => {
  69. setCurrentNotionPage(undefined)
  70. }
  71. const shouldShowDataSourceTypeList = !datasetId || (datasetId && !dataset?.data_source_type)
  72. return (
  73. <div className='flex w-full h-full'>
  74. <div className='grow overflow-y-auto relative'>
  75. {
  76. shouldShowDataSourceTypeList && (
  77. <div className={s.stepHeader}>{t('datasetCreation.steps.one')}</div>
  78. )
  79. }
  80. <div className={s.form}>
  81. {
  82. shouldShowDataSourceTypeList && (
  83. <div className={s.dataSourceTypeList}>
  84. <div
  85. className={cn(
  86. s.dataSourceItem,
  87. dataSourceType === DataSourceType.FILE && s.active,
  88. dataSourceTypeDisable && dataSourceType !== DataSourceType.FILE && s.disabled,
  89. )}
  90. onClick={() => {
  91. if (dataSourceTypeDisable)
  92. return
  93. changeType(DataSourceType.FILE)
  94. hidePreview()
  95. }}
  96. >
  97. <span className={cn(s.datasetIcon)} />
  98. {t('datasetCreation.stepOne.dataSourceType.file')}
  99. </div>
  100. <div
  101. className={cn(
  102. s.dataSourceItem,
  103. dataSourceType === DataSourceType.NOTION && s.active,
  104. dataSourceTypeDisable && dataSourceType !== DataSourceType.NOTION && s.disabled,
  105. )}
  106. onClick={() => {
  107. if (dataSourceTypeDisable)
  108. return
  109. changeType(DataSourceType.NOTION)
  110. hidePreview()
  111. }}
  112. >
  113. <span className={cn(s.datasetIcon, s.notion)} />
  114. {t('datasetCreation.stepOne.dataSourceType.notion')}
  115. </div>
  116. <div
  117. className={cn(s.dataSourceItem, s.disabled, dataSourceType === DataSourceType.WEB && s.active)}
  118. // onClick={() => changeType(DataSourceType.WEB)}
  119. >
  120. <span className={s.comingTag}>Coming soon</span>
  121. <span className={cn(s.datasetIcon, s.web)} />
  122. {t('datasetCreation.stepOne.dataSourceType.web')}
  123. </div>
  124. </div>
  125. )
  126. }
  127. {dataSourceType === DataSourceType.FILE && (
  128. <>
  129. <FileUploader onFileUpdate={updateFile} file={file} titleClassName={(!shouldShowDataSourceTypeList) ? 'mt-[30px] !mb-[44px] !text-lg !font-semibold !text-gray-900' : undefined} />
  130. <Button disabled={!file} className={s.submitButton} type='primary' onClick={onStepChange}>{t('datasetCreation.stepOne.button')}</Button>
  131. </>
  132. )}
  133. {dataSourceType === DataSourceType.NOTION && (
  134. <>
  135. {!hasConnection && <NotionConnector onSetting={onSetting} />}
  136. {hasConnection && (
  137. <>
  138. <div className='mb-8 w-[640px]'>
  139. <NotionPageSelector value={notionPages.map(page => page.page_id)} onSelect={updateNotionPages} onPreview={updateCurrentPage} />
  140. </div>
  141. <Button disabled={!notionPages.length} className={s.submitButton} type='primary' onClick={onStepChange}>{t('datasetCreation.stepOne.button')}</Button>
  142. </>
  143. )}
  144. </>
  145. )}
  146. {!datasetId && (
  147. <>
  148. <div className={s.dividerLine} />
  149. <div onClick={modalShowHandle} className={s.OtherCreationOption}>{t('datasetCreation.stepOne.emptyDatasetCreation')}</div>
  150. </>
  151. )}
  152. </div>
  153. <EmptyDatasetCreationModal show={showModal} onHide={modalCloseHandle} />
  154. </div>
  155. {file && showFilePreview && <FilePreview file={file} hidePreview={hidePreview} />}
  156. {currentNotionPage && <NotionPagePreview currentPage={currentNotionPage} hidePreview={hideNotionPagePreview} />}
  157. </div>
  158. )
  159. }
  160. export default StepOne