Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

new-app-card.tsx 4.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. 'use client'
  2. import React, { useMemo, useState } from 'react'
  3. import {
  4. useRouter,
  5. useSearchParams,
  6. } from 'next/navigation'
  7. import { useTranslation } from 'react-i18next'
  8. import { CreateFromDSLModalTab } from '@/app/components/app/create-from-dsl-modal'
  9. import { useProviderContext } from '@/context/provider-context'
  10. import { FileArrow01, FilePlus01, FilePlus02 } from '@/app/components/base/icons/src/vender/line/files'
  11. import cn from '@/utils/classnames'
  12. import dynamic from 'next/dynamic'
  13. const CreateAppModal = dynamic(() => import('@/app/components/app/create-app-modal'), {
  14. ssr: false,
  15. })
  16. const CreateAppTemplateDialog = dynamic(() => import('@/app/components/app/create-app-dialog'), {
  17. ssr: false,
  18. })
  19. const CreateFromDSLModal = dynamic(() => import('@/app/components/app/create-from-dsl-modal'), {
  20. ssr: false,
  21. })
  22. export type CreateAppCardProps = {
  23. className?: string
  24. onSuccess?: () => void
  25. ref: React.RefObject<HTMLDivElement | null>
  26. selectedAppType?: string
  27. }
  28. const CreateAppCard = ({
  29. ref,
  30. className,
  31. onSuccess,
  32. selectedAppType,
  33. }: CreateAppCardProps) => {
  34. const { t } = useTranslation()
  35. const { onPlanInfoChanged } = useProviderContext()
  36. const searchParams = useSearchParams()
  37. const { replace } = useRouter()
  38. const dslUrl = searchParams.get('remoteInstallUrl') || undefined
  39. const [showNewAppTemplateDialog, setShowNewAppTemplateDialog] = useState(false)
  40. const [showNewAppModal, setShowNewAppModal] = useState(false)
  41. const [showCreateFromDSLModal, setShowCreateFromDSLModal] = useState(!!dslUrl)
  42. const activeTab = useMemo(() => {
  43. if (dslUrl)
  44. return CreateFromDSLModalTab.FROM_URL
  45. return undefined
  46. }, [dslUrl])
  47. return (
  48. <div
  49. ref={ref}
  50. className={cn('relative col-span-1 inline-flex h-[160px] flex-col justify-between rounded-xl border-[0.5px] border-components-card-border bg-components-card-bg', className)}
  51. >
  52. <div className='grow rounded-t-xl p-2'>
  53. <div className='px-6 pb-1 pt-2 text-xs font-medium leading-[18px] text-text-tertiary'>{t('app.createApp')}</div>
  54. <button type="button" className='mb-1 flex w-full cursor-pointer items-center rounded-lg px-6 py-[7px] text-[13px] font-medium leading-[18px] text-text-tertiary hover:bg-state-base-hover hover:text-text-secondary' onClick={() => setShowNewAppModal(true)}>
  55. <FilePlus01 className='mr-2 h-4 w-4 shrink-0' />
  56. {t('app.newApp.startFromBlank')}
  57. </button>
  58. <button type="button" className='flex w-full cursor-pointer items-center rounded-lg px-6 py-[7px] text-[13px] font-medium leading-[18px] text-text-tertiary hover:bg-state-base-hover hover:text-text-secondary' onClick={() => setShowNewAppTemplateDialog(true)}>
  59. <FilePlus02 className='mr-2 h-4 w-4 shrink-0' />
  60. {t('app.newApp.startFromTemplate')}
  61. </button>
  62. <button
  63. type="button"
  64. onClick={() => setShowCreateFromDSLModal(true)}
  65. className='flex w-full cursor-pointer items-center rounded-lg px-6 py-[7px] text-[13px] font-medium leading-[18px] text-text-tertiary hover:bg-state-base-hover hover:text-text-secondary'>
  66. <FileArrow01 className='mr-2 h-4 w-4 shrink-0' />
  67. {t('app.importDSL')}
  68. </button>
  69. </div>
  70. {showNewAppModal && (
  71. <CreateAppModal
  72. show={showNewAppModal}
  73. onClose={() => setShowNewAppModal(false)}
  74. onSuccess={() => {
  75. onPlanInfoChanged()
  76. if (onSuccess)
  77. onSuccess()
  78. }}
  79. onCreateFromTemplate={() => {
  80. setShowNewAppTemplateDialog(true)
  81. setShowNewAppModal(false)
  82. }}
  83. defaultAppMode={selectedAppType !== 'all' ? selectedAppType as any : undefined}
  84. />
  85. )}
  86. {showNewAppTemplateDialog && (
  87. <CreateAppTemplateDialog
  88. show={showNewAppTemplateDialog}
  89. onClose={() => setShowNewAppTemplateDialog(false)}
  90. onSuccess={() => {
  91. onPlanInfoChanged()
  92. if (onSuccess)
  93. onSuccess()
  94. }}
  95. onCreateFromBlank={() => {
  96. setShowNewAppModal(true)
  97. setShowNewAppTemplateDialog(false)
  98. }}
  99. />
  100. )}
  101. {showCreateFromDSLModal && (
  102. <CreateFromDSLModal
  103. show={showCreateFromDSLModal}
  104. onClose={() => {
  105. setShowCreateFromDSLModal(false)
  106. if (dslUrl)
  107. replace('/')
  108. }}
  109. activeTab={activeTab}
  110. dslUrl={dslUrl}
  111. onSuccess={() => {
  112. onPlanInfoChanged()
  113. if (onSuccess)
  114. onSuccess()
  115. }}
  116. />
  117. )}
  118. </div>
  119. )
  120. }
  121. CreateAppCard.displayName = 'CreateAppCard'
  122. export default React.memo(CreateAppCard)