// ----------------------------------------------------------------------------- // Food-Ka — Agrégateur de produits d'épicerie (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, fmtPrice, registerSourceNames, sourceName } from "./api"; import CookieConsent from "./components/CookieConsent"; import Home from "./pages/Home"; import ProductPage from "./pages/Product"; 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} produits suivis`, `${stats.sources} bannières`, `${stats.on_sale} soldes actifs`, ]; if (stats.avg_price != null) parts.push(`Prix moyen ${fmtPrice(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(["Food·Ka — tous les prix d'épicerie du Québec"])); }, []); if (items.length === 0) return null; // contenu doublé pour une boucle de défilement continue return ( ); } const NAV_LINKS = [ { to: "/", label: "Produits", icon: "🛒", end: true }, { to: "/aubaines", label: "Aubaines", icon: "🔥", end: false }, { to: "/sources", label: "Sources", icon: "🗂", end: false }, { to: "/stats", label: "Stats", 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 ( <>
FoodKa Épicerie — tout le Québec, toujours à jour
{/* menu déroulant mobile */}
{NAV_LINKS.map((l, i) => ( `mm-link ${isActive ? "active" : ""}`} onClick={() => setOpen(false)} > {l.label} ))}
Agrégateur indépendant — mis à jour automatiquement, chaque fiche renvoie à la page produit originale.
{open &&
setOpen(false)} aria-hidden="true" />} ); } function Footer() { return (
FoodKa
Agrégateur indépendant de produits d'épicerie de la province de Québec. Les prix proviennent des sites publics des bannières et sont rafraîchis automatiquement — chaque fiche renvoie vers la page produit originale.
© {new Date().getFullYear()} Simon-Pierre Boucher — contact@spboucher.ai {" · "} www.food-ka.com {" · "} Confidentialité {" · "}
); } export default function App() { return ( <>
} /> } /> } /> } /> } /> } />
🧭

Page introuvable

Le lien demandé n'existe pas.

} />