index.tsx 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. 'use client'
  2. import React, { useState, useCallback, useEffect } from 'react'
  3. import { useTranslation } from 'react-i18next'
  4. import { useBoolean } from 'ahooks'
  5. import type { DataSet, File, createDocumentResponse } from '@/models/datasets'
  6. import { fetchTenantInfo } from '@/service/common'
  7. import { fetchDataDetail } from '@/service/datasets'
  8. import StepsNavBar from './steps-nav-bar'
  9. import StepOne from './step-one'
  10. import StepTwo from './step-two'
  11. import StepThree from './step-three'
  12. import AccountSetting from '@/app/components/header/account-setting'
  13. import AppUnavailable from '../../base/app-unavailable'
  14. type DatasetUpdateFormProps = {
  15. datasetId?: string;
  16. }
  17. const DatasetUpdateForm = ({ datasetId }: DatasetUpdateFormProps) => {
  18. const { t } = useTranslation()
  19. const [hasSetAPIKEY, setHasSetAPIKEY] = useState(true)
  20. const [isShowSetAPIKey, { setTrue: showSetAPIKey, setFalse: hideSetAPIkey }] = useBoolean()
  21. const [step, setStep] = useState(1)
  22. const [indexingTypeCache, setIndexTypeCache] = useState('')
  23. const [file, setFile] = useState<File | undefined>()
  24. const [result, setResult] = useState<createDocumentResponse | undefined>()
  25. const [hasError, setHasError] = useState(false)
  26. const updateFile = (file?: File) => {
  27. setFile(file)
  28. }
  29. const updateIndexingTypeCache = (type: string) => {
  30. setIndexTypeCache(type)
  31. }
  32. const updateResultCache = (res?: createDocumentResponse) => {
  33. setResult(res)
  34. }
  35. const nextStep = useCallback(() => {
  36. setStep(step + 1)
  37. }, [step, setStep])
  38. const changeStep = useCallback((delta: number) => {
  39. setStep(step + delta)
  40. }, [step, setStep])
  41. const checkAPIKey = async () => {
  42. const data = await fetchTenantInfo({ url: '/info' })
  43. const hasSetKey = data.providers.some(({ is_valid }) => is_valid)
  44. setHasSetAPIKEY(hasSetKey)
  45. }
  46. useEffect(() => {
  47. checkAPIKey()
  48. }, [])
  49. const [detail, setDetail] = useState<DataSet | null>(null)
  50. useEffect(() => {
  51. (async () => {
  52. if (datasetId) {
  53. try {
  54. const detail = await fetchDataDetail(datasetId)
  55. setDetail(detail)
  56. } catch (e) {
  57. setHasError(true)
  58. }
  59. }
  60. })()
  61. }, [datasetId])
  62. if (hasError) {
  63. return <AppUnavailable code={500} unknownReason={t('datasetCreation.error.unavailable') as string} />
  64. }
  65. return (
  66. <div className='flex' style={{ height: 'calc(100vh - 56px)' }}>
  67. <div className="flex flex-col w-56 overflow-y-auto bg-white border-r border-gray-200 shrink-0">
  68. <StepsNavBar step={step} datasetId={datasetId} />
  69. </div>
  70. <div className="grow bg-white">
  71. {step === 1 && <StepOne
  72. datasetId={datasetId}
  73. file={file}
  74. updateFile={updateFile}
  75. onStepChange={nextStep}
  76. />}
  77. {(step === 2 && (!datasetId || (datasetId && !!detail))) && <StepTwo
  78. hasSetAPIKEY={hasSetAPIKEY}
  79. onSetting={showSetAPIKey}
  80. indexingType={detail?.indexing_technique || ''}
  81. datasetId={datasetId}
  82. file={file}
  83. onStepChange={changeStep}
  84. updateIndexingTypeCache={updateIndexingTypeCache}
  85. updateResultCache={updateResultCache}
  86. />}
  87. {step === 3 && <StepThree
  88. datasetId={datasetId}
  89. datasetName={detail?.name}
  90. indexingType={detail?.indexing_technique || indexingTypeCache}
  91. creationCache={result}
  92. />}
  93. </div>
  94. {isShowSetAPIKey && <AccountSetting activeTab="provider" onCancel={async () => {
  95. await checkAPIKey()
  96. hideSetAPIkey()
  97. }} />}
  98. </div>
  99. )
  100. }
  101. export default DatasetUpdateForm