Lou·Ka — tous les logements à louer du Québec, un seul endroit.
HTML 98.9%
Python 0.6%
1// -----------------------------------------------------------------------------2// Lou-Ka — Agrégateur de logements à louer (province de Québec)3// Auteur : Simon-Pierre Boucher — contact@spboucher.ai4// fiche/PropertyDescription.tsx : description — accroche « en bref » du digest,5// sections structurées, texte tronqué à ~200 px avec « Lire la suite »,6// texte original de la source en accordéon.7// -----------------------------------------------------------------------------8import { useState } from "react";9import { Listing } from "../api";10import { Accordion, MoreButton, SectionCard } from "./ui";1112export default function PropertyDescription({ l }: { l: Listing }) {13 const dg = l.digest;14 const [open, setOpen] = useState(false);15 const texte = dg?.texte_nettoye || l.description || "";16 if (!dg && !texte) {17 return (18 <SectionCard id="description" title="Description">19 <p className="lk-fine">La source ne fournit pas de description pour cette annonce.</p>20 </SectionCard>21 );22 }23 const long = (dg ? dg.sections.reduce((n, s) => n + s.texte.length, 0) + (dg.en_bref?.length ?? 0) : texte.length) > 420;24 return (25 <SectionCard id="description" title="Description">26 <div className={`lk-desc ${long && !open ? "clamped" : ""}`}>27 <div className="lk-desc-body">28 {dg ? (29 <>30 {dg.en_bref && <p className="lk-desc-lead">{dg.en_bref}</p>}31 {dg.sections.map((s) => (32 <div key={s.titre}>33 <h4>{s.titre}</h4>34 <p>{s.texte}</p>35 </div>36 ))}37 </>38 ) : (39 <p>{texte}</p>40 )}41 </div>42 </div>43 {long && <MoreButton onClick={() => setOpen(!open)} expanded={open}>{open ? "Réduire" : "Lire la suite"}</MoreButton>}44 {dg && l.description && (45 <div className="lk-desc-orig">46 <Accordion title="Texte original de la source" small>47 <p style={{ whiteSpace: "pre-line" }}>{l.description}</p>48 </Accordion>49 </div>50 )}51 </SectionCard>52 );53}54