import { useStore } from '@nanostores/react'; import * as Dialog from '@radix-ui/react-dialog'; import { motion } from 'framer-motion'; import { useEffect, useState } from 'react'; import VercelConnection from '~/.client/components/header/connections/VercelConnection'; import { useChatDeployment } from '~/.client/hooks/useChatDeployment'; import { vercelConnection } from '~/.client/stores/vercel'; import { DeploymentPlatformEnum } from '~/types/deployment'; interface DeployToVercelDialogProps { isOpen: boolean; deploying: boolean; onClose: () => void; onDeploy: () => Promise; } export function DeployToVercelDialog({ deploying, isOpen, onClose, onDeploy }: DeployToVercelDialogProps) { const { getDeploymentByPlatform } = useChatDeployment(); const connection = useStore(vercelConnection); const [isVercelConnected, setIsVercelConnected] = useState(false); const [showConnectionForm, setShowConnectionForm] = useState(false); useEffect(() => { if (connection.user) { setIsVercelConnected(true); if (isOpen && !isVercelConnected && !showConnectionForm) { setShowConnectionForm(false); } } else { setIsVercelConnected(false); if (isOpen && !showConnectionForm) { setShowConnectionForm(true); } } }, [connection.user, isOpen, isVercelConnected]); const checkVercelConnection = () => { if (connection.user) { setIsVercelConnected(true); } }; const handleDeploy = async () => { if (!connection.user) { return; } onDeploy(); }; const handleClose = () => { if (!deploying) { onClose(); setShowConnectionForm(false); } }; const deploymentInfo = getDeploymentByPlatform(DeploymentPlatformEnum.VERCEL); return ( !open && handleClose()}>
部署到 Vercel

{connection.user ? '部署到 Vercel' : '连接 Vercel 账户'}

{isVercelConnected ? '您的项目将被部署到 Vercel。点击"部署"按钮开始部署。' : '需要连接 Vercel 账户才能部署项目。请在此页面完成连接。'}

{!isVercelConnected ? ( { checkVercelConnection(); setTimeout(checkVercelConnection, 500); }} className="px-4 py-2 rounded-lg bg-upage-elements-item-backgroundAccent text-upage-elements-item-contentAccent text-sm hover:bg-upage-elements-item-backgroundAccent/90 inline-flex items-center gap-2" whileHover={{ scale: 1.02 }} whileTap={{ scale: 0.98 }} >
刷新连接状态 ) : ( {deploying ? ( <>
部署中... ) : ( <>
{!!deploymentInfo?.id ? '覆盖已有网站' : '部署到 Vercel'} )} )}
); }