import * as fal from '@fal-ai/serverless-client'; import { withNextProxy } from '@fal-ai/serverless-nextjs'; import { useMemo, useState } from 'react'; // @snippet:start(client.config) fal.config({ requestMiddleware: withNextProxy(), }); // @snippet:end // @snippet:start(client.result.type) type Image = { url: string; file_name: string; file_size: number; }; type Result = { images: Image[]; }; // @snippet:end function Error(props) { if (!props.error) { return null; } return (
Error {props.error.message}
); } const DEFAULT_PROMPT = "a city landscape of a cyberpunk metropolis, raining, purple, pink and teal neon lights, highly detailed, uhd"; export function Index() { // @snippet:start(client.ui.state) // Input state const [prompt, setPrompt] = useState(DEFAULT_PROMPT); // Result state const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [result, setResult] = useState(null); const [logs, setLogs] = useState([]); const [elapsedTime, setElapsedTime] = useState(0); // @snippet:end const image = useMemo(() => { if (!result) { return null; } return result.images[0]; }, [result]); const reset = () => { setLoading(false); setError(null); setResult(null); setLogs([]); setElapsedTime(0); }; const handleOnClick = async (e) => { e.preventDefault(); reset(); // @snippet:start(client.queue.subscribe) setLoading(true); const start = Date.now(); try { const result: Result = await fal.queue.subscribe('110602490-lora', { input: { prompt, model_name: 'stabilityai/stable-diffusion-xl-base-1.0', image_size: 'square_hd', }, onQueueUpdate(status) { setElapsedTime(Date.now() - start); if (status.status === 'IN_PROGRESS') { setLogs(status.logs.map((log) => log.message)); } }, }); setResult(result); } catch (error) { setError(error); } finally { setLoading(false); setElapsedTime(Date.now() - start); } // @snippet:end }; return (

Hello fal

setPrompt(e.target.value)} onBlur={(e) => setPrompt(e.target.value.trim())} />
{image && ( // eslint-disable-next-line @next/next/no-img-element )}

JSON Result

{`Elapsed Time (seconds): ${(elapsedTime / 1000).toFixed(2)}`}

              {result
                ? JSON.stringify(result, null, 2)
                : '// result pending...'}
            

Logs

              {logs.filter(Boolean).join('\n')}
            
); } export default Index;