'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}
);
}
export default function Home() {
// Input state
const [endpointId, setEndpointId] = useState('');
const [input, setInput] = useState('{}');
// 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',
// 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...'}
);
}