import * as DropdownMenu from '@radix-ui/react-dropdown-menu'; import { useStore } from '@nanostores/react'; import { netlifyConnection } from '~/lib/stores/netlify'; import { vercelConnection } from '~/lib/stores/vercel'; import { cloudflareConnection } from '~/lib/stores/cloudflare'; import { workbenchStore } from '~/lib/stores/workbench'; import { streamingState } from '~/lib/stores/streaming'; import { classNames } from '~/utils/classNames'; import { useState } from 'react'; import { NetlifyDeploymentLink } from '~/components/chat/NetlifyDeploymentLink.client'; import { VercelDeploymentLink } from '~/components/chat/VercelDeploymentLink.client'; import { CloudflareDeploymentLink } from '~/components/chat/CloudflareDeploymentLink.client'; import { useVercelDeploy } from '~/components/deploy/VercelDeploy.client'; import { useNetlifyDeploy } from '~/components/deploy/NetlifyDeploy.client'; import { useCloudflareDeploy } from '~/components/deploy/CloudflareDeploy.client'; interface DeployButtonProps { onVercelDeploy?: () => Promise; onNetlifyDeploy?: () => Promise; } export const DeployButton = ({ onVercelDeploy, onNetlifyDeploy }: DeployButtonProps) => { const netlifyConn = useStore(netlifyConnection); const vercelConn = useStore(vercelConnection); const cloudflareConn = useStore(cloudflareConnection); const [activePreviewIndex] = useState(0); const previews = useStore(workbenchStore.previews); const activePreview = previews[activePreviewIndex]; const [isDeploying, setIsDeploying] = useState(false); const [deployingTo, setDeployingTo] = useState<'netlify' | 'vercel' | 'cloudflare' | null>(null); const isStreaming = useStore(streamingState); const { handleVercelDeploy } = useVercelDeploy(); const { handleNetlifyDeploy } = useNetlifyDeploy(); const { handleCloudflareDeploy } = useCloudflareDeploy(); const handleVercelDeployClick = async () => { setIsDeploying(true); setDeployingTo('vercel'); try { if (onVercelDeploy) { await onVercelDeploy(); } else { await handleVercelDeploy(); } } finally { setIsDeploying(false); setDeployingTo(null); } }; const handleNetlifyDeployClick = async () => { setIsDeploying(true); setDeployingTo('netlify'); try { if (onNetlifyDeploy) { await onNetlifyDeploy(); } else { await handleNetlifyDeploy(); } } finally { setIsDeploying(false); setDeployingTo(null); } }; const handleCloudflareDeployClick = async () => { setIsDeploying(true); setDeployingTo('cloudflare'); try { await handleCloudflareDeploy(); } finally { setIsDeploying(false); setDeployingTo(null); } }; return (
{isDeploying ? `Deploying to ${deployingTo}...` : 'Deploy'} {!netlifyConn.user ? 'No Netlify Account Connected' : 'Deploy to Netlify'} {netlifyConn.user && } vercel {!vercelConn.user ? 'No Vercel Account Connected' : 'Deploy to Vercel'} {vercelConn.user && } cloudflare {!cloudflareConn.token ? 'No Cloudflare Token' : 'Deploy to Cloudflare'} {cloudflareConn.token && cloudflareConn.accountId && }
); };