"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..."}
);
}