Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import React, { useCallback, useMemo, useState } from 'react'
  2. import Item from './item'
  3. import { RiAddCircleFill, RiFileUploadLine } from '@remixicon/react'
  4. import Modal from '@/app/components/base/modal'
  5. import CreateFromScratch from './create-from-scratch'
  6. import { useRouter, useSearchParams } from 'next/navigation'
  7. import CreateFromDSLModal, { CreateFromDSLModalTab } from './create-from-dsl-modal'
  8. import { useProviderContextSelector } from '@/context/provider-context'
  9. import { useTranslation } from 'react-i18next'
  10. const CreateOptions = () => {
  11. const { t } = useTranslation()
  12. const [showCreateModal, setShowCreateModal] = useState(false)
  13. const [showImportModal, setShowImportModal] = useState(false)
  14. const onPlanInfoChanged = useProviderContextSelector(state => state.onPlanInfoChanged)
  15. const searchParams = useSearchParams()
  16. const { replace } = useRouter()
  17. const dslUrl = searchParams.get('remoteInstallUrl') || undefined
  18. const activeTab = useMemo(() => {
  19. if (dslUrl)
  20. return CreateFromDSLModalTab.FROM_URL
  21. return undefined
  22. }, [dslUrl])
  23. const openCreateFromScratch = useCallback(() => {
  24. setShowCreateModal(true)
  25. }, [])
  26. const closeCreateFromScratch = useCallback(() => {
  27. setShowCreateModal(false)
  28. }, [])
  29. const handleCreateFromScratch = useCallback(() => {
  30. setShowCreateModal(false)
  31. }, [])
  32. const openImportFromDSL = useCallback(() => {
  33. setShowImportModal(true)
  34. }, [])
  35. const onCloseImportModal = useCallback(() => {
  36. setShowImportModal(false)
  37. if (dslUrl)
  38. replace('/datasets/create-from-pipeline')
  39. }, [dslUrl, replace])
  40. const onImportFromDSLSuccess = useCallback(() => {
  41. onPlanInfoChanged()
  42. }, [onPlanInfoChanged])
  43. return (
  44. <div className='flex items-center gap-x-3 px-16 py-2'>
  45. <Item
  46. Icon={RiAddCircleFill}
  47. title={t('datasetPipeline.creation.createFromScratch.title')}
  48. description={t('datasetPipeline.creation.createFromScratch.description')}
  49. onClick={openCreateFromScratch}
  50. />
  51. <Item
  52. Icon={RiFileUploadLine}
  53. title={t('datasetPipeline.creation.ImportDSL.title')}
  54. description={t('datasetPipeline.creation.ImportDSL.description')}
  55. onClick={openImportFromDSL}
  56. />
  57. <Modal
  58. isShow={showCreateModal}
  59. onClose={closeCreateFromScratch}
  60. className='max-w-[520px] p-0'
  61. >
  62. <CreateFromScratch
  63. onClose={closeCreateFromScratch}
  64. onCreate={handleCreateFromScratch}
  65. />
  66. </Modal>
  67. <CreateFromDSLModal
  68. show={showImportModal}
  69. onClose={onCloseImportModal}
  70. activeTab={activeTab}
  71. dslUrl={dslUrl}
  72. onSuccess={onImportFromDSLSuccess}
  73. />
  74. </div>
  75. )
  76. }
  77. export default React.memo(CreateOptions)