"use client"; import * as fal from "@fal-ai/serverless-client"; import { useState } from "react"; fal.config({ proxyUrl: "/api/fal/proxy", }); type ErrorProps = { error: any; }; function Error(props: ErrorProps) { if (!props.error) { return null; } return (
Error {props.error.message}
); } const DEFAULT_ENDPOINT_ID = "fal-ai/fast-sdxl"; const DEFAULT_INPUT = `{ "prompt": "A beautiful sunset over the ocean" }`; export default function Home() { // Input state const [endpointId, setEndpointId] = useState(DEFAULT_ENDPOINT_ID); const [input, setInput] = useState(DEFAULT_INPUT); // 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); const reset = () => { setLoading(false); setError(null); setResult(null); setLogs([]); setElapsedTime(0); }; const run = async () => { reset(); setLoading(true); const start = Date.now(); try { const result: any = await fal.subscribe(endpointId, { input: JSON.parse(input), logs: true, // mode: "streaming", mode: "polling", pollInterval: 1000, onQueueUpdate(update) { console.log("queue update"); console.log(update); setElapsedTime(Date.now() - start); if ( update.status === "IN_PROGRESS" || update.status === "COMPLETED" ) { if (update.logs && update.logs.length > logs.length) { setLogs((update.logs || []).map((log) => log.message)); } } }, }); setResult(result); } catch (error: any) { setError(error); } finally { setLoading(false); setElapsedTime(Date.now() - start); } }; return (

fal queue

setEndpointId(e.target.value)} />

JSON Result

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

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

Logs

              {logs.join("\n")}
            
); }