'use client' import { useEffect, useState } from 'react' import { useRouter } from 'next/navigation' import { useContext } from 'use-context-selector' import { useTranslation } from 'react-i18next' import { RiCloseLine } from '@remixicon/react' import AppIconPicker from '../../base/app-icon-picker' import s from './style.module.css' import cn from '@/utils/classnames' import Checkbox from '@/app/components/base/checkbox' import Button from '@/app/components/base/button' import Input from '@/app/components/base/input' import Modal from '@/app/components/base/modal' import Confirm from '@/app/components/base/confirm' import { ToastContext } from '@/app/components/base/toast' import { deleteApp, switchApp } from '@/service/apps' import { useAppContext } from '@/context/app-context' import { useProviderContext } from '@/context/provider-context' import AppsFull from '@/app/components/billing/apps-full-in-dialog' import { NEED_REFRESH_APP_LIST_KEY } from '@/config' import { getRedirection } from '@/utils/app-redirection' import type { App } from '@/types/app' import { AlertTriangle } from '@/app/components/base/icons/src/vender/solid/alertsAndFeedback' import AppIcon from '@/app/components/base/app-icon' import { useStore as useAppStore } from '@/app/components/app/store' type SwitchAppModalProps = { show: boolean appDetail: App onSuccess?: () => void onClose: () => void inAppDetail?: boolean } const SwitchAppModal = ({ show, appDetail, inAppDetail = false, onSuccess, onClose }: SwitchAppModalProps) => { const { push, replace } = useRouter() const { t } = useTranslation() const { notify } = useContext(ToastContext) const setAppDetail = useAppStore(s => s.setAppDetail) const { isCurrentWorkspaceEditor } = useAppContext() const { plan, enableBilling } = useProviderContext() const isAppsFull = (enableBilling && plan.usage.buildApps >= plan.total.buildApps) const [showAppIconPicker, setShowAppIconPicker] = useState(false) const [appIcon, setAppIcon] = useState( appDetail.icon_type === 'image' ? { type: 'image' as const, url: appDetail.icon_url, fileId: appDetail.icon } : { type: 'emoji' as const, icon: appDetail.icon, background: appDetail.icon_background }, ) const [name, setName] = useState(`${appDetail.name}(copy)`) const [removeOriginal, setRemoveOriginal] = useState(false) const [showConfirmDelete, setShowConfirmDelete] = useState(false) const goStart = async () => { try { const { new_app_id: newAppID } = await switchApp({ appID: appDetail.id, name, icon_type: appIcon.type, icon: appIcon.type === 'emoji' ? appIcon.icon : appIcon.fileId, icon_background: appIcon.type === 'emoji' ? appIcon.background : undefined, }) if (onSuccess) onSuccess() if (onClose) onClose() notify({ type: 'success', message: t('app.newApp.appCreated') }) if (inAppDetail) setAppDetail() if (removeOriginal) await deleteApp(appDetail.id) localStorage.setItem(NEED_REFRESH_APP_LIST_KEY, '1') getRedirection( isCurrentWorkspaceEditor, { id: newAppID, mode: appDetail.mode === 'completion' ? 'workflow' : 'advanced-chat', }, removeOriginal ? replace : push, ) } catch (e) { notify({ type: 'error', message: t('app.newApp.appCreateFailed') }) } } useEffect(() => { if (removeOriginal) setShowConfirmDelete(true) }, [removeOriginal]) return ( <> { }} >
{t('app.switch')}
{t('app.switchTipStart')} {t('app.switchTip')} {t('app.switchTipEnd')}
{t('app.switchLabel')}
{ setShowAppIconPicker(true) }} className='cursor-pointer' iconType={appIcon.type} icon={appIcon.type === 'image' ? appIcon.fileId : appIcon.icon} background={appIcon.type === 'image' ? undefined : appIcon.background} imageUrl={appIcon.type === 'image' ? appIcon.url : undefined} /> setName(e.target.value)} placeholder={t('app.newApp.appNamePlaceholder') || ''} className='grow h-10' />
{showAppIconPicker && { setAppIcon(payload) setShowAppIconPicker(false) }} onClose={() => { setAppIcon(appDetail.icon_type === 'image' ? { type: 'image' as const, url: appDetail.icon_url, fileId: appDetail.icon } : { type: 'emoji' as const, icon: appDetail.icon, background: appDetail.icon_background }) setShowAppIconPicker(false) }} />}
{isAppsFull && }
setRemoveOriginal(!removeOriginal)} />
setRemoveOriginal(!removeOriginal)}>{t('app.removeOriginal')}
{showConfirmDelete && ( setShowConfirmDelete(false)} onCancel={() => { setShowConfirmDelete(false) setRemoveOriginal(false) }} /> )} ) } export default SwitchAppModal