import { useState, useEffect } from 'react' import { createFileRoute } from '@tanstack/react-router' import { ImageIcon, Loader2, Download } from 'lucide-react' const SIZES = ['1024x1024', '1536x1024', '1024x1536', 'auto'] interface GeneratedImage { url?: string b64Json?: string revisedPrompt?: string } function ImagePage() { const [prompt, setPrompt] = useState( 'A cute baby sea otter wearing a beret and glasses, sitting at a small cafe table, sipping a cappuccino', ) const [size, setSize] = useState('1024x1024') const [numberOfImages, setNumberOfImages] = useState(1) const [images, setImages] = useState>([]) const [isLoading, setIsLoading] = useState(false) const [error, setError] = useState(null) const handleGenerate = async () => { setIsLoading(true) setError(null) setImages([]) try { const response = await fetch('/demo/api/ai/image', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ prompt, size, numberOfImages }), }) const data = await response.json() if (!response.ok) { throw new Error(data.error || 'Failed to generate image') } setImages(data.images) } catch (err: any) { setError(err.message) } finally { setIsLoading(false) } } const getImageSrc = (image: GeneratedImage) => { if (image.url) return image.url if (image.b64Json) return `data:image/png;base64,${image.b64Json}` return '' } const handleDownload = async (image: GeneratedImage, index: number) => { const src = getImageSrc(image) if (!src) return try { const response = await fetch(src) const blob = await response.blob() const url = URL.createObjectURL(blob) const a = document.createElement('a') a.href = url a.download = `generated-image-${index + 1}.png` document.body.appendChild(a) a.click() document.body.removeChild(a) URL.revokeObjectURL(url) } catch (err) { // Failed to download image } } return (

Image Generation

setNumberOfImages( Math.max(1, Math.min(4, parseInt(e.target.value) || 1)), ) } min={1} max={4} disabled={isLoading} className="demo-input text-sm" />