// ----------------------------------------------------------------------------- // Lou-Ka — Agrégateur de logements à louer (province de Québec) // Auteur : Simon-Pierre Boucher — contact@spboucher.ai // components/SmartImg.tsx : image robuste — miniature WebP optimisée d'abord, // repli sur l'URL originale si la miniature n'est pas (encore) disponible, // puis sur le visuel de secours Lou-Ka. Jamais d'icône d'image cassée. // ----------------------------------------------------------------------------- import { ImgHTMLAttributes, useEffect, useState } from "react"; import { placeholderImage, thumb } from "../api"; type Props = Omit, "src"> & { src: string | null | undefined; // URL originale de la source width_?: 160 | 480 | 800 | 1280; // largeur de miniature souhaitée fallbackLabel?: string; // étiquette du visuel de secours (ex. « 3½ ») original?: boolean; // true = pas de miniature (pleine taille) }; export default function SmartImg({ src, width_ = 480, fallbackLabel, original = false, ...rest }: Props) { const chain = src ? (original ? [src] : [thumb(src, width_), src]) : []; const [step, setStep] = useState(0); useEffect(() => { setStep(0); }, [src, width_]); const url = step < chain.length ? chain[step] : placeholderImage(fallbackLabel); return ( setStep((s) => s + 1)} /> ); }