SPB Git forge

spb/house-ka

Public
18commits 1branches 0releases
1.9 MBsize
maindefault branch
19 days agolast push
Python 67% TypeScript 18.2% CSS 14.4%
1.8 KB · 46 lines tsx
Raw Blame History
1// -----------------------------------------------------------------------------2// Immo-Ka — Agrégateur de propriétés à vendre (province de Québec)3// Auteur : Simon-Pierre Boucher — contact@spboucher.ai4// components/PropertyImg.tsx : image de propriété robuste5//   · <TypeFallback/> : image de secours élégante PAR TYPE DE BIEN aux couleurs6//     Immo-Ka — jamais d'icône d'image cassée ni de vide gris.7//   · <PropertyImg/> : <img> avec repli automatique si l'URL ne charge pas.8// -----------------------------------------------------------------------------9import { useState } from "react";10import { Ico } from "./Icons";1112const TYPE_ICONS: Record<string, string> = {13  "Maison": "home", "Maison mobile": "home", "Maison de ville": "home",14  "Jumelé": "home", "Chalet": "tree", "Condo": "building",15  "Duplex": "building", "Triplex": "building", "Multiplex": "building",16  "Terrain": "land", "Fermette/Agricole": "leaf", "Commercial": "cart",17};1819/** Image de secours par type de bien (gradient cerise + icône + libellé). */20export function TypeFallback({ type, label = true }: { type?: string; label?: boolean }) {21  const ico = TYPE_ICONS[type ?? ""] ?? "home";22  return (23    <div className="type-fallback" aria-label={type || "Propriété"}>24      <Ico name={ico} size={40} />25      {label && <span>{type || "Photos à venir"}</span>}26    </div>27  );28}2930/** <img> qui bascule sur l'image de secours du type si le chargement échoue. */31export default function PropertyImg({32  src, alt, type, eager = false,33}: { src?: string | null; alt: string; type?: string; eager?: boolean }) {34  const [broken, setBroken] = useState(false);35  if (!src || broken) return <TypeFallback type={type} />;36  return (37    <img38      src={src}39      alt={alt}40      loading={eager ? "eager" : "lazy"}41      decoding="async"42      onError={() => setBroken(true)}43    />44  );45}46