SPB Git

spb/lou-ka

Public

Lou·Ka — tous les logements à louer du Québec, un seul endroit.

3.2 KB · 82 lines tsx
1// -----------------------------------------------------------------------------2// Lou-Ka — Agrégateur de logements à louer (province de Québec)3// Auteur : Simon-Pierre Boucher — contact@spboucher.ai4// components/HydroEstimation.tsx : bloc « Coût d'électricité » (fiche)5//   Estimation Hydro-Québec du coût annuel d'électricité à l'adresse6//   (louka/hydro.py). Les annonces récentes sont pré-calculées et mises en7//   cache : le bloc s'affiche alors automatiquement. Sinon un bouton permet8//   de lancer le calcul à la demande (une résolution de captcha par appel).9// -----------------------------------------------------------------------------10import { useEffect, useState } from "react";11import { fetchHydro, fmtPrice, HydroEstimate } from "../api";1213export default function HydroEstimation({ adresse, uid, lat, lng }:14    { adresse: string | null; uid?: string;15      lat?: number | null; lng?: number | null }) {16  const [d, setD] = useState<HydroEstimate | null>(null);17  const [loading, setLoading] = useState(false);18  const [masque, setMasque] = useState(false);1920  // au montage : lecture du cache uniquement (aucun captcha, aucun coût)21  useEffect(() => {22    setD(null);23    if (!adresse) return;24    fetchHydro(adresse, { uid, lat, lng }, false)25      .then((r) => {26        if (r.disponible || r.en_attente) setD(r);27        else if (/captcha|configuré|incomplète/.test(r.raison || ""))28          setMasque(true);          // service off ou adresse inexploitable29        else setD(r);30      })31      .catch(() => setMasque(true));32  }, [adresse, uid, lat, lng]);3334  if (masque || !adresse || !d) return null;3536  const lancer = () => {37    setLoading(true);38    fetchHydro(adresse, { uid, lat, lng }, true)39      .then((r) => {40        if (!r.disponible && /captcha|configuré/.test(r.raison || ""))41          setMasque(true);42        else setD(r);43      })44      .catch(() => setMasque(true))45      .finally(() => setLoading(false));46  };4748  return (49    <section className="f-bloc f-hydro" id="hydro">50      <h2>Coût d'électricité</h2>51      {d.disponible ? (52        <>53          <div className="hydro-montant">54            {fmtPrice(d.cout_mensuel!)} <small>/ mois</small>55            <span className="hydro-an">soit ~{fmtPrice(d.cout_annuel!)} / an</span>56          </div>57          <p className="fine">58            Estimation Hydro-Québec pour {d.adresse}59            {d.kwh_annuel ? ` — ${d.kwh_annuel.toLocaleString("fr-CA")} kWh/an` : ""},60            fondée sur la consommation réelle du logement. Le montant réel61            varie selon l'occupation et les habitudes.62          </p>63        </>64      ) : d.en_attente ? (65        <>66          <p className="hydro-intro">67            Obtenez une estimation du coût annuel d'électricité pour ce68            logement, calculée par Hydro-Québec d'après sa consommation réelle.69          </p>70          <button className="hydro-btn" onClick={lancer} disabled={loading}>71            {loading ? "Estimation en cours…" : "Estimer le coût d'électricité"}72          </button>73        </>74      ) : (75        <p className="hydro-vide">76          Hydro-Québec n'a pas d'estimation pour cette adresse.77        </p>78      )}79    </section>80  );81}82
Files · c330834860f734c0ffde4c391f09b87e0908de3d
Menu

Theme