import React, { useEffect, useState, useRef } from 'react'; import Box from '@mui/material/Box'; import PropagateLoader from 'react-spinners/PropagateLoader'; import { Quote } from 'components/Quote'; import { streamQueryResponse, StreamQueryController } from 'services/streamQueryResponse'; import { connectionBase } from 'utils/Global'; import { BackstoryElementProps } from 'components/BackstoryTab'; import { useUser } from 'components/UserContext'; interface GenerateImageProps extends BackstoryElementProps { prompt: string }; const GenerateImage = (props: GenerateImageProps) => { const { user } = useUser(); const {sessionId, setSnack, prompt} = props; const [processing, setProcessing] = useState(false); const [status, setStatus] = useState(''); const [image, setImage] = useState(''); // Only keep refs that are truly necessary const controllerRef = useRef(null); // Effect to trigger profile generation when user data is ready useEffect(() => { if (controllerRef.current) { console.log("Controller already active, skipping profile generation"); return; } if (!prompt) { return; } setStatus('Starting image generation...'); setProcessing(true); const start = Date.now(); controllerRef.current = streamQueryResponse({ query: { prompt: prompt, agentOptions: { username: user?.username, } }, type: "image", sessionId, connectionBase, onComplete: (msg) => { switch (msg.status) { case "partial": case "done": if (msg.status === "done") { if (!msg.response) { setSnack("Image generation failed", "error"); } else { setImage(msg.response); } setProcessing(false); controllerRef.current = null; } break; case "error": console.log(`Error generating profile: ${msg.response} after ${Date.now() - start}`); setSnack(msg.response || "", "error"); setProcessing(false); controllerRef.current = null; break; default: let data: any = {}; try { data = typeof msg.response === 'string' ? JSON.parse(msg.response) : msg.response; } catch (e) { data = { message: msg.response }; } if (msg.status !== "heartbeat") { console.log(data); } if (data.message) { setStatus(data.message); } break; } } }); }, [user, prompt, sessionId, setSnack]); if (!sessionId) { return <>; } return ( {image !== '' && {prompt}} { prompt && } {processing && { status && Generation status {status} } } ); }; export { GenerateImage };