| 'use client' |
|
|
| import { forwardRef, useMemo, useState } from 'react' |
| import { |
| useRouter, |
| useSearchParams, |
| } from 'next/navigation' |
| import { useTranslation } from 'react-i18next' |
| import CreateAppTemplateDialog from '@/app/components/app/create-app-dialog' |
| import CreateAppModal from '@/app/components/app/create-app-modal' |
| import CreateFromDSLModal, { CreateFromDSLModalTab } from '@/app/components/app/create-from-dsl-modal' |
| import { useProviderContext } from '@/context/provider-context' |
| import { FileArrow01, FilePlus01, FilePlus02 } from '@/app/components/base/icons/src/vender/line/files' |
|
|
| export type CreateAppCardProps = { |
| onSuccess?: () => void |
| } |
|
|
| |
| const CreateAppCard = forwardRef<HTMLAnchorElement, CreateAppCardProps>(({ onSuccess }, ref) => { |
| const { t } = useTranslation() |
| const { onPlanInfoChanged } = useProviderContext() |
| const searchParams = useSearchParams() |
| const { replace } = useRouter() |
| const dslUrl = searchParams.get('remoteInstallUrl') || undefined |
|
|
| const [showNewAppTemplateDialog, setShowNewAppTemplateDialog] = useState(false) |
| const [showNewAppModal, setShowNewAppModal] = useState(false) |
| const [showCreateFromDSLModal, setShowCreateFromDSLModal] = useState(!!dslUrl) |
|
|
| const activeTab = useMemo(() => { |
| if (dslUrl) |
| return CreateFromDSLModalTab.FROM_URL |
|
|
| return undefined |
| }, [dslUrl]) |
|
|
| return ( |
| <a |
| ref={ref} |
| className='relative col-span-1 flex flex-col justify-between min-h-[160px] bg-gray-200 rounded-xl border-[0.5px] border-black/5' |
| > |
| <div className='grow p-2 rounded-t-xl'> |
| <div className='px-6 pt-2 pb-1 text-xs font-medium leading-[18px] text-gray-500'>{t('app.createApp')}</div> |
| <div className='flex items-center mb-1 px-6 py-[7px] rounded-lg text-[13px] font-medium leading-[18px] text-gray-600 cursor-pointer hover:text-primary-600 hover:bg-white' onClick={() => setShowNewAppModal(true)}> |
| <FilePlus01 className='shrink-0 mr-2 w-4 h-4' /> |
| {t('app.newApp.startFromBlank')} |
| </div> |
| <div className='flex items-center px-6 py-[7px] rounded-lg text-[13px] font-medium leading-[18px] text-gray-600 cursor-pointer hover:text-primary-600 hover:bg-white' onClick={() => setShowNewAppTemplateDialog(true)}> |
| <FilePlus02 className='shrink-0 mr-2 w-4 h-4' /> |
| {t('app.newApp.startFromTemplate')} |
| </div> |
| </div> |
| <div |
| className='p-2 border-t-[0.5px] border-black/5 rounded-b-xl' |
| onClick={() => setShowCreateFromDSLModal(true)} |
| > |
| <div className='flex items-center px-6 py-[7px] rounded-lg text-[13px] font-medium leading-[18px] text-gray-600 cursor-pointer hover:text-primary-600 hover:bg-white'> |
| <FileArrow01 className='shrink-0 mr-2 w-4 h-4' /> |
| {t('app.importDSL')} |
| </div> |
| </div> |
| <CreateAppModal |
| show={showNewAppModal} |
| onClose={() => setShowNewAppModal(false)} |
| onSuccess={() => { |
| onPlanInfoChanged() |
| if (onSuccess) |
| onSuccess() |
| }} |
| /> |
| <CreateAppTemplateDialog |
| show={showNewAppTemplateDialog} |
| onClose={() => setShowNewAppTemplateDialog(false)} |
| onSuccess={() => { |
| onPlanInfoChanged() |
| if (onSuccess) |
| onSuccess() |
| }} |
| /> |
| <CreateFromDSLModal |
| show={showCreateFromDSLModal} |
| onClose={() => { |
| setShowCreateFromDSLModal(false) |
| |
| if (dslUrl) |
| replace('/') |
| }} |
| activeTab={activeTab} |
| dslUrl={dslUrl} |
| onSuccess={() => { |
| onPlanInfoChanged() |
| if (onSuccess) |
| onSuccess() |
| }} |
| /> |
| </a> |
| ) |
| }) |
|
|
| export default CreateAppCard |
|
|