import React, { useEffect, useState } from 'react'; import './App.css'; import { applyPolyfills, defineCustomElements } from 'wcs-core/loader'; import Departs from './pages/Departs'; import Arrivees from './pages/Arrivees'; import Displays from './pages/Displays'; import ClassiquesDeparts from './pages/afficheurs/classiques/ClassiquesDeparts'; import ClassiquesArrivees from './pages/afficheurs/classiques/ClassiquesArrivees'; import ClassiquesDepartsQuais from './pages/afficheurs/classiques/quais/ClassiquesDepartsQuais'; import sessionMemory from './lib/sessionMemory'; import ClassiquesArriveesQuais from "./pages/afficheurs/classiques/quais/ClassiquesArriveesQuais"; import AFLDeparts from './pages/afficheurs/afl/AFLDeparts'; import AFLArrivees from './pages/afficheurs/afl/AFLArrivees'; import AFLDepartsQuais from './pages/afficheurs/afl/AFLDepartsQuais'; import AFLArriveesQuais from './pages/afficheurs/afl/AFLArriveesQuais'; import EVAArrivees from './pages/afficheurs/eva/EVAArrivees'; import EVADeparts from './pages/afficheurs/eva/EVADeparts'; import SelectAfficheur from './pages/SelectAfficheur'; import AfficheurViewportWrapper from './components/AfficheurViewportWrapper'; applyPolyfills().then(() => defineCustomElements(window)); // Petit routeur client sans dépendances externes function useSimpleRouter() { function normalizePath(p) { if (!p) return '/'; // retirer query string et hash pour normaliser le chemin utilisé en internal route p = String(p).split(/[?#]/)[0]; // traiter les cas comme /index.html if (p.indexOf('index.html') !== -1) return '/'; // supprimer espaces en début/fin p = p.trim(); // supprimer slashs finaux sauf pour la racine if (p !== '/') p = p.replace(/\/+$/, ''); return p || '/'; } const [route, setRoute] = useState(() => normalizePath(window.location.pathname || '/')); useEffect(() => { const onPop = () => { const p = normalizePath(window.location.pathname || '/'); console.debug('[router] popstate ->', p); setRoute(p); }; window.addEventListener('popstate', onPop); return () => window.removeEventListener('popstate', onPop); }, []); function navigate(path) { const target = normalizePath(path); // toujours pousser l'URL complète (path peut contenir query/hash), // mais stocker en internal state la version normalisée (sans query/hash) // comparer l'URL complète (pathname + search + hash) afin de permettre // des navigations qui ne changent que la querystring (ex. ?gare=...) const currentFull = window.location.pathname + (window.location.search || '') + (window.location.hash || ''); if (currentFull !== path) { console.debug('[router] navigate ->', path, '(normalized ->', target, ')'); try { window.history.pushState({}, '', path); } catch (e) { // fallback si path est invalide try { window.history.pushState({}, '', target); } catch (err) { /* ignore */ } } // mettre à jour la route interne (sans query/hash) setRoute(target); } else { // si l'URL complète est identique, forcer un update de state pour // déclencher un rendu si besoin (rare) setRoute(target); } } return { route, navigate }; } function App() { const { route, navigate } = useSimpleRouter(); // Composant Home explicite (panels cliquables) function Home({ navigate }) { useEffect(() => { console.debug('[Home] monté, pathname =', window.location.pathname); }, []); const panelStyle = { width: '40%', cursor: 'pointer', padding: 24, borderRadius: 8, boxShadow: '0 2px 8px rgba(0,0,0,0.12)', background: '#fff', textAlign: 'center' }; return (
Choisissez une section ci-dessous
Consultez les prochains départs d'une gare. Cliquez pour choisir une gare et voir les horaires.
Consultez les prochaines arrivées d'une gare. Cliquez pour choisir une gare et voir les informations.