NewAppCard.tsx 4.1 KB

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