'use client' import * as React from 'react' import { useEffect, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import { useContextSelector } from 'use-context-selector' import { CreateFromDSLModalTab } from '@/app/components/app/create-from-dsl-modal' import { FileArrow01, FilePlus01, FilePlus02 } from '@/app/components/base/icons/src/vender/line/files' import AppListContext from '@/context/app-list-context' import { useProviderContext } from '@/context/provider-context' import dynamic from '@/next/dynamic' import { useRouter, useSearchParams, } from '@/next/navigation' import { cn } from '@/utils/classnames' const CreateAppModal = dynamic(() => import('@/app/components/app/create-app-modal'), { ssr: false, }) const CreateAppTemplateDialog = dynamic(() => import('@/app/components/app/create-app-dialog'), { ssr: false, }) const CreateFromDSLModal = dynamic(() => import('@/app/components/app/create-from-dsl-modal'), { ssr: false, }) export type CreateAppCardProps = { className?: string isLoading?: boolean onSuccess?: () => void ref: React.RefObject selectedAppType?: string } const CreateAppCard = ({ ref, className, isLoading = false, onSuccess, selectedAppType, }: CreateAppCardProps) => { 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]) const controlHideCreateFromTemplatePanel = useContextSelector(AppListContext, ctx => ctx.controlHideCreateFromTemplatePanel) useEffect(() => { if (controlHideCreateFromTemplatePanel > 0) // eslint-disable-next-line react-hooks-extra/no-direct-set-state-in-use-effect setShowNewAppTemplateDialog(false) }, [controlHideCreateFromTemplatePanel]) return (
{t('createApp', { ns: 'app' })}
{showNewAppModal && ( setShowNewAppModal(false)} onSuccess={() => { onPlanInfoChanged() if (onSuccess) onSuccess() }} onCreateFromTemplate={() => { setShowNewAppTemplateDialog(true) setShowNewAppModal(false) }} defaultAppMode={selectedAppType !== 'all' ? selectedAppType as any : undefined} /> )} {showNewAppTemplateDialog && ( setShowNewAppTemplateDialog(false)} onSuccess={() => { onPlanInfoChanged() if (onSuccess) onSuccess() }} onCreateFromBlank={() => { setShowNewAppModal(true) setShowNewAppTemplateDialog(false) }} /> )} {showCreateFromDSLModal && ( { setShowCreateFromDSLModal(false) if (dslUrl) replace('/') }} activeTab={activeTab} dslUrl={dslUrl} onSuccess={() => { onPlanInfoChanged() if (onSuccess) onSuccess() }} /> )}
) } CreateAppCard.displayName = 'CreateAppCard' export default React.memo(CreateAppCard)