import React, { useState, useEffect, useRef } from 'react' import axios from 'axios' import { ImagePlus, Sparkles } from 'lucide-react' export default function GeneratorForm({ setJobId, setStatus, setSplatUrl }) { const [prompt, setPrompt] = useState('') const [file, setFile] = useState(null) const [isSubmitting, setIsSubmitting] = useState(false) const intervalRef = useRef(null) useEffect(() => { return () => { if (intervalRef.current) clearInterval(intervalRef.current) } }, []) const handleSubmit = async (e) => { e.preventDefault() if (!prompt) return setIsSubmitting(true) setStatus('PENDING') setSplatUrl(null) const formData = new FormData() formData.append('prompt', prompt) if (file) { formData.append('image', file) } try { const response = await axios.post('/api/generate', formData, { headers: { 'Content-Type': 'multipart/form-data' } }) const newJobId = response.data.job_id setJobId(newJobId) pollStatus(newJobId) } catch (err) { console.error(err) setStatus('FAILED') setIsSubmitting(false) } } const pollStatus = async (id) => { if (intervalRef.current) clearInterval(intervalRef.current) intervalRef.current = setInterval(async () => { try { const res = await axios.get(`/api/status/${id}`) const state = res.data.status setStatus(state) if (state === 'READY') { clearInterval(intervalRef.current) setSplatUrl(res.data.ply_url) setIsSubmitting(false) } else if (state === 'FAILED' || state === 'NOT_FOUND') { clearInterval(intervalRef.current) setIsSubmitting(false) setStatus('FAILED') } } catch (err) { console.error(err) clearInterval(intervalRef.current) setIsSubmitting(false) setStatus('FAILED') } }, 2000) } return (
) }