"use client"; import { ImageOff, Loader2 } from "lucide-react"; import { useEffect, useRef, useState } from "react"; import { CATALOGUE_ASSET_BASE_PATH } from "@/lib/catalog-assets"; interface ImagePreviewProps { value: string; basePath?: string; height?: number; className?: string; } export function ImagePreview({ value, basePath = CATALOGUE_ASSET_BASE_PATH, height = 60, className, }: ImagePreviewProps) { const [src, setSrc] = useState(""); const [status, setStatus] = useState<"idle" | "loading" | "loaded" | "error">( "idle", ); const [fallback, setFallback] = useState(false); const debounceRef = useRef | null>(null); useEffect(() => { if (!value.trim()) { setSrc(""); setStatus("idle"); setFallback(false); return; } if (debounceRef.current) clearTimeout(debounceRef.current); debounceRef.current = setTimeout(() => { setFallback(false); const url = `${basePath}/${value.trim()}.png`; setSrc(url); setStatus("loading"); }, 300); return () => { if (debounceRef.current) clearTimeout(debounceRef.current); }; }, [value, basePath]); function handleError() { if (!fallback) { // Try .gif as fallback setFallback(true); setSrc(`${basePath}/${value.trim()}.gif`); setStatus("loading"); } else { setStatus("error"); } } if (status === "idle" || !src) { return (
); } return (
{status === "loading" && ( )} setStatus("loaded")} onError={handleError} /> {status === "error" && (
)}
); }