'use client' import React, { useState } from 'react' import { useTranslation } from 'react-i18next' import Modal from '@/app/components/base/modal' import Button from '@/app/components/base/button' import Toast from '@/app/components/base/toast' import AppIcon from '@/app/components/base/app-icon' import EmojiPicker from '@/app/components/base/emoji-picker' import { useProviderContext } from '@/context/provider-context' import AppsFull from '@/app/components/billing/apps-full-in-dialog' import { XClose } from '@/app/components/base/icons/src/vender/line/general' export type CreateAppModalProps = { show: boolean isEditModal?: boolean appName: string appDescription: string appIcon: string appIconBackground: string onConfirm: (info: { name: string icon: string icon_background: string description: string }) => Promise onHide: () => void } const CreateAppModal = ({ show = false, isEditModal = false, appIcon, appIconBackground, appName, appDescription, onConfirm, onHide, }: CreateAppModalProps) => { const { t } = useTranslation() const [name, setName] = React.useState(appName) const [showEmojiPicker, setShowEmojiPicker] = useState(false) const [emoji, setEmoji] = useState({ icon: appIcon, icon_background: appIconBackground }) const [description, setDescription] = useState(appDescription || '') const { plan, enableBilling } = useProviderContext() const isAppsFull = (enableBilling && plan.usage.buildApps >= plan.total.buildApps) const submit = () => { if (!name.trim()) { Toast.notify({ type: 'error', message: t('explore.appCustomize.nameRequired') }) return } onConfirm({ name, ...emoji, description, }) onHide() } return ( <> {}} wrapperClassName='z-40' className='relative !max-w-[480px] px-8' >
{isEditModal && (
{t('app.editAppTitle')}
)} {!isEditModal && (
{t('explore.appCustomize.title', { name: appName })}
)}
{/* icon & name */}
{t('app.newApp.captionName')}
{ setShowEmojiPicker(true) }} className='cursor-pointer' icon={emoji.icon} background={emoji.icon_background} /> setName(e.target.value)} placeholder={t('app.newApp.appNamePlaceholder') || ''} className='grow h-10 px-3 text-sm font-normal bg-gray-100 rounded-lg border border-transparent outline-none appearance-none caret-primary-600 placeholder:text-gray-400 hover:bg-gray-50 hover:border hover:border-gray-300 focus:bg-gray-50 focus:border focus:border-gray-300 focus:shadow-xs' />
{/* description */}
{t('app.newApp.captionDescription')}