| | "use client"; |
| | import { LoadingIcon } from "@/components/LoadingIcon"; |
| | import { Skeleton } from "@/components/ui/skeleton"; |
| | import { cn } from "@/lib/utils"; |
| | import { checkStatus } from "@/server/generate"; |
| | import { useEffect, useState } from "react"; |
| |
|
| | export function ImageGenerationResult({ |
| | runId, |
| | className |
| | }: { runId: string } & React.ComponentProps<"div">) { |
| | const [image, setImage] = useState(""); |
| | const [status, setStatus] = useState<string>("preparing"); |
| | const [loading, setLoading] = useState(true); |
| |
|
| | |
| | useEffect(() => { |
| | if (!runId) return; |
| | const interval = setInterval(() => { |
| | checkStatus(runId).then((res) => { |
| | if (res) setStatus(res.status); |
| | if (res && res.status === "success") { |
| | console.log(res.outputs[0]?.data); |
| | setImage(res.outputs[0]?.data?.images[0].url); |
| | setLoading(false); |
| | clearInterval(interval); |
| | } |
| | }); |
| | }, 2000); |
| | return () => clearInterval(interval); |
| | }, [runId]); |
| |
|
| | return ( |
| | <div className={cn("border border-gray-200 w-full aspect-[512/768] rounded-lg relative", className)}> |
| | {!loading && image && ( |
| | <img |
| | className="w-full h-full object-contain" |
| | src={image} |
| | alt="Generated image" |
| | ></img> |
| | )} |
| | {!image && status && ( |
| | <div className="absolute top-0 left-0 w-full h-full flex items-center justify-center gap-2"> |
| | {status} <LoadingIcon /> |
| | </div> |
| | )} |
| | {loading && <Skeleton className="w-full h-full" />} |
| | </div> |
| | ); |
| | } |
| |
|