/** * Enhanced Deploy Button with Quick Deploy Option * Contributed by Keoma Wright * * This component provides both authenticated and quick deployment options */ 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 { 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 { useVercelDeploy } from '~/components/deploy/VercelDeploy.client'; import { useNetlifyDeploy } from '~/components/deploy/NetlifyDeploy.client'; import { QuickNetlifyDeploy } from '~/components/deploy/QuickNetlifyDeploy.client'; import * as Dialog from '@radix-ui/react-dialog'; interface EnhancedDeployButtonProps { onVercelDeploy?: () => Promise; onNetlifyDeploy?: () => Promise; } export const EnhancedDeployButton = ({ onVercelDeploy, onNetlifyDeploy }: EnhancedDeployButtonProps) => { const netlifyConn = useStore(netlifyConnection); const vercelConn = useStore(vercelConnection); const [activePreviewIndex] = useState(0); const previews = useStore(workbenchStore.previews); const activePreview = previews[activePreviewIndex]; const [isDeploying, setIsDeploying] = useState(false); const [deployingTo, setDeployingTo] = useState<'netlify' | 'vercel' | 'quick' | null>(null); const [showQuickDeploy, setShowQuickDeploy] = useState(false); const isStreaming = useStore(streamingState); const { handleVercelDeploy } = useVercelDeploy(); const { handleNetlifyDeploy } = useNetlifyDeploy(); 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); } }; return ( <>
{isDeploying ? `Deploying${deployingTo ? ` to ${deployingTo}` : ''}...` : 'Deploy'} {/* Quick Deploy Option - Always Available */} setShowQuickDeploy(true)} >
Netlify Quick Deploy NEW
Quick Deploy to Netlify (No Login)
{/* Authenticated Netlify Deploy */} {!netlifyConn.user ? 'No Netlify Account Connected' : 'Deploy to Netlify'} {netlifyConn.user && } {/* Vercel Deploy */} vercel {!vercelConn.user ? 'No Vercel Account Connected' : 'Deploy to Vercel'} {vercelConn.user && } {/* Cloudflare - Coming Soon */} cloudflare Deploy to Cloudflare (Coming Soon)
{/* Quick Deploy Dialog */}

Quick Deploy to Netlify

); };