// Copyright (C) 2026 billisdead — Licence EUPL-1.2 import React from "react"; import { Switch, Route, Router as WouterRouter, Link, useLocation } from "wouter"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { Toaster } from "@/components/ui/toaster"; import { TooltipProvider } from "@/components/ui/tooltip"; import NotFound from "@/pages/not-found"; import Home from "@/pages/home"; import About from "@/pages/about"; import Transparence from "@/pages/transparence"; import Flyer from "@/pages/flyer"; import Admin from "@/pages/admin"; import LegalNotice from "@/pages/legal-notice"; import PrivacyPolicy from "@/pages/privacy-policy"; import ContributionsBrutes from "@/pages/contributions-brutes"; import ConsultationPage from "@/pages/consultation"; import { AccessibilityProvider } from "@/hooks/use-accessibility"; import { AccessibilityPanel } from "@/components/accessibility-panel"; import { setVisitorId } from "@workspace/api-client-react"; import FingerprintJS from "@fingerprintjs/fingerprintjs"; const queryClient = new QueryClient({ defaultOptions: { queries: { retry: false, refetchOnWindowFocus: false, }, }, }); function Navbar() { return (
La Voix du Peuple
); } function Footer() { return ( ); } function Router() { const [location] = useLocation(); return (
{/* Lien d'évitement pour lecteurs d'écran */} Aller au contenu principal
{/* Pied de page masqué sur la page d'accueil (layout plein-écran) */} {location !== "/" &&
); } function App() { // Initialise FingerprintJS une seule fois au chargement // L'identifiant de visite est envoyé sur chaque appel API (header X-Visitor-Id) // Il est hashé côté serveur avant stockage — aucune donnée PII conservée React.useEffect(() => { FingerprintJS.load() .then((fp) => fp.get()) .then((result) => setVisitorId(result.visitorId)) .catch(() => { // Dégradation silencieuse si FingerprintJS indisponible }); }, []); return ( ); } export default App;