// ----------------------------------------------------------------------------- // Lou-Ka — Agrégateur de logements à louer (province de Québec) // Auteur : Simon-Pierre Boucher — contact@spboucher.ai // App.tsx : layout global (header + ticker en direct + footer encre) et routage // ----------------------------------------------------------------------------- import { useEffect, useState } from "react"; import { NavLink, Route, Routes, useLocation } from "react-router-dom"; import { fetchFacets, fetchSources, fetchStats, registerSourceNames, sourceName } from "./api"; import CookieConsent from "./components/CookieConsent"; import Home from "./pages/Home"; import ListingPage from "./pages/Listing"; import BotPage from "./pages/Bot"; import PasserellePage from "./pages/Passerelle"; import PrivacyPage from "./pages/Privacy"; import SourcesPage from "./pages/Sources"; import StatsPage from "./pages/Stats"; function Ticker() { const [items, setItems] = useState([]); useEffect(() => { Promise.all([fetchStats(), fetchFacets(), fetchSources()]) .then(([stats, facets, src]) => { registerSourceNames(src.sources); const parts: string[] = [ `${stats.total} logements actifs`, `Québec ${stats.quebec ?? 0}`, `Lévis ${stats.levis ?? 0}`, ]; if ((stats.montreal ?? 0) > 0) parts.push(`Grand Montréal ${stats.montreal}`); if (stats.avg_price != null) parts.push(`Loyer moyen ${Math.round(stats.avg_price)} $`); for (const s of facets.sources.slice(0, 10)) parts.push(`${sourceName(s.source)} · ${s.n}`); parts.push("Mise à jour automatique"); setItems(parts); }) .catch(() => setItems(["Lou-Ka — logements à louer au Québec"])); }, []); if (items.length === 0) return null; // contenu doublé pour une boucle de défilement continue return ( ); } const NAV_LINKS = [ { to: "/", label: "Logements", icon: "🏠", end: true }, { to: "/?view=carte", label: "Carte", icon: "◈", end: false, force: true }, { to: "/stats", label: "Stats", icon: "📊", end: false }, { to: "/sources", label: "Sources", icon: "🗂", end: false }, { to: "/confidentialite", label: "Confidentialité", icon: "🔒", end: false }, ]; function Header() { const [open, setOpen] = useState(false); const location = useLocation(); // fermer le menu à chaque navigation + verrouiller le défilement en dessous useEffect(() => { setOpen(false); }, [location]); useEffect(() => { document.body.style.overflow = open ? "hidden" : ""; return () => { document.body.style.overflow = ""; }; }, [open]); return ( <>
LouKa Québec · Lévis · Montréal — toujours à jour
{/* menu déroulant mobile */}
{NAV_LINKS.map((l, i) => ( `mm-link ${isActive && !l.force ? "active" : ""}`} onClick={() => setOpen(false)} > {l.label} ))}
Agrégateur indépendant — mis à jour automatiquement, chaque fiche renvoie à l'annonce originale.
{open &&
setOpen(false)} aria-hidden="true" />} ); } function Footer() { return (
LouKa
Agrégateur indépendant de logements à louer dans la province de Québec. Les annonces proviennent des sites publics des gestionnaires immobiliers et sont rafraîchies automatiquement — chaque fiche renvoie vers l'annonce originale.
© {new Date().getFullYear()} Simon-Pierre Boucher — contact@spboucher.ai {" · "} Confidentialité {" · "}
); } export default function App() { return ( <>
} /> } /> } /> } /> } /> } /> } />
🧭

Page introuvable

Le lien demandé n'existe pas.

} />