import { useState, useEffect, useRef, useCallback } from 'react'; import { motion, AnimatePresence } from "framer-motion"; import { useI18n } from '@/hooks/useI18n'; import { LanguageSelector } from '@/components/deploy/LanguageSelector'; import { DeployForm } from '@/components/deploy/DeployForm'; import { DeployProgress } from '@/components/deploy/DeployProgress'; import { DeploySuccess } from '@/components/deploy/DeploySuccess'; import { DeployError } from '@/components/deploy/DeployError'; import { CanvasRevealEffect } from '@/components/ui/sign-in-flow-1'; type DeployState = 'form' | 'progress' | 'success' | 'error'; interface ProgressData { progress: number; message: string; } export default function DeployPage() { const { lang, setLang, t } = useI18n(); const [state, setState] = useState('form'); const [stackName, setStackName] = useState(''); const [deploymentUrl, setDeploymentUrl] = useState(''); const [progressData, setProgressData] = useState({ progress: 0, message: '' }); const [logs, setLogs] = useState([]); const [errorMessage, setErrorMessage] = useState(''); const eventSourceRef = useRef(null); const handleDeploy = useCallback(async (name: string) => { setStackName(name); setProgressData({ progress: 0, message: t('initializing') }); setLogs([]); try { const response = await fetch('/api/deploy', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ name }), }); const data = await response.json(); if (!response.ok || !data.success) { throw new Error(data.error || 'Deployment failed'); } setDeploymentUrl(data.url); setState('progress'); const es = new EventSource(`/api/status/${data.deploymentId}`); eventSourceRef.current = es; es.addEventListener('progress', (event) => { const eventData = JSON.parse(event.data); setProgressData({ progress: eventData.progress, message: eventData.currentStep || eventData.message, }); setLogs((prev) => [ ...prev, `[${new Date().toLocaleTimeString()}] ${eventData.currentStep || eventData.message}`, ]); }); es.addEventListener('complete', () => { es.close(); setState('success'); }); es.addEventListener('error', (event) => { const eventData = (event as MessageEvent).data ? JSON.parse((event as MessageEvent).data) : { message: 'Unknown error' }; es.close(); setErrorMessage(eventData.message); setState('error'); }); es.onerror = () => { es.close(); setErrorMessage(t('connectionLost')); setState('error'); }; } catch (err) { setErrorMessage(err instanceof Error ? err.message : 'Deployment failed'); setState('error'); } }, [t]); const handleReset = useCallback(() => { if (eventSourceRef.current) { eventSourceRef.current.close(); eventSourceRef.current = null; } setStackName(''); setDeploymentUrl(''); setProgressData({ progress: 0, message: '' }); setLogs([]); setErrorMessage(''); setState('form'); }, []); useEffect(() => { return () => { if (eventSourceRef.current) { eventSourceRef.current.close(); } }; }, []); return (
{t('title')} {t('subtitle')}
{state === 'form' && ( )} {state === 'progress' && ( )} {state === 'success' && ( )} {state === 'error' && ( )}

{t('poweredBy')}{' '} FLEXINIT {' '} • FlexAI Assistant

); }