import { useState, useMemo } from 'react'; import { useNavigate } from 'react-router-dom'; import { useAuth } from '@persona-community-3/auth'; import { useMediaGeneration } from '@persona-community-3/realtime'; import { Card, CardHeader, CardTitle, CardDescription, CardContent, Button, FormField, Select, SelectTrigger, SelectValue, SelectContent, SelectItem, ImageGrid, VideoGrid, GenerationProgress, ProviderBadge, Loader2, } from '@persona-community-3/ui'; type GenerateMode = 'image' | 'video'; interface ImageResult { images: Array<{ data: string; isUrl: boolean; seed?: number }>; provider: string; latencyMs: number; } interface VideoResult { videos: Array<{ data: string; isUrl: boolean; mimeType: string }>; provider: string; latencyMs: number; } export function GeneratePage() { const { user, getToken } = useAuth(); const navigate = useNavigate(); const [mode, setMode] = useState('image'); const [prompt, setPrompt] = useState(''); const [aspectRatio, setAspectRatio] = useState('1:1'); const [count, setCount] = useState(1); const [duration, setDuration] = useState('5s'); const apiPrefix = import.meta.env.VITE_API_URL || ''; const authHeaders = useMemo(() => { const token = getToken(); return token ? { Authorization: `Bearer ${token}` } : undefined; }, [getToken]); const imageGen = useMediaGeneration({ endpoint: `${apiPrefix}/api/{{SERVICE_NAME}}/generate/image`, sseEndpoint: `${apiPrefix}/api/{{SERVICE_NAME}}/events`, userId: user?.id || 'anonymous', headers: authHeaders, }); const videoGen = useMediaGeneration({ endpoint: `${apiPrefix}/api/{{SERVICE_NAME}}/generate/video`, sseEndpoint: `${apiPrefix}/api/{{SERVICE_NAME}}/events`, userId: user?.id || 'anonymous', headers: authHeaders, }); const gen = mode === 'image' ? imageGen : videoGen; const isGenerating = gen.status === 'pending' || gen.status === 'generating'; const handleGenerate = async () => { if (!prompt.trim()) return; gen.reset(); const request = mode === 'image' ? { prompt, count, aspectRatio } : { prompt, aspectRatio, duration }; await gen.generate(request); }; return (
AI Generation Generate images and videos using AI (Gemini / LaoZhang) {/* Mode toggle */}
setPrompt(e.target.value)} placeholder={ mode === 'image' ? 'A serene mountain landscape at sunset...' : 'A cat playing piano in a jazz club...' } />
{mode === 'image' ? (
) : (
)}
{isGenerating && (
{gen.message || 'Starting...'} {gen.progress}%
{gen.sseState !== 'connected' && (

SSE {gen.sseState} — events may be delayed

)}
)} {gen.status === 'failed' && gen.error && ( {gen.error} )} {gen.status === 'complete' && imageGen.result && mode === 'image' && ( Results
{imageGen.result.provider && }
({ src: img.isUrl ? img.data : `data:image/png;base64,${img.data}`, alt: prompt, }))} columns={imageGen.result.images.length > 1 ? 2 : 1} />
)} {gen.status === 'complete' && videoGen.result && mode === 'video' && ( Results
{videoGen.result.provider && }
({ src: vid.isUrl ? vid.data : `data:${vid.mimeType};base64,${vid.data}`, mimeType: vid.mimeType, alt: prompt, }))} />
)}
); }