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 (

Accueil

Choisissez une section ci-dessous

{ try { sessionMemory.set('afficheurMode', 'departs'); } catch (e) {} navigate('/departs'); }} onKeyDown={(e) => (e.key === 'Enter' || e.key === ' ' ? (function(){ try { sessionMemory.set('afficheurMode', 'departs'); } catch (e) {} navigate('/departs'); })() : null)} style={panelStyle} aria-label="Accéder aux départs" >

Départs

Consultez les prochains départs d'une gare. Cliquez pour choisir une gare et voir les horaires.

{ try { sessionMemory.set('afficheurMode', 'arrivees'); } catch (e) {} navigate('/arrivees'); }} onKeyDown={(e) => (e.key === 'Enter' || e.key === ' ' ? (function(){ try { sessionMemory.set('afficheurMode', 'arrivees'); } catch (e) {} navigate('/arrivees'); })() : null)} style={panelStyle} aria-label="Accéder aux arrivées" >

Arrivées

Consultez les prochaines arrivées d'une gare. Cliquez pour choisir une gare et voir les informations.

); } // Routes pour afficheurs : format /afficheurs/{mode}/{type}?gare=... // route plus spécifique pour l'afficheur "quais" if (route.startsWith('/afficheurs/departs/classiques/quais')) { return ; } if (route.startsWith('/afficheurs/arrivees/classiques/quais')) { return ; } if (route.startsWith('/afficheurs/departs/classiques')) { return ; } if (route.startsWith('/afficheurs/departs/afl/quais')) { return ; } if (route.startsWith('/afficheurs/departs/afl')) { return ; } if (route.startsWith('/afficheurs/departs/eva')) { return ; } if (route.startsWith('/afficheurs/arrivees/afl/quais')) { return ; } if (route.startsWith('/afficheurs/arrivees/afl')) { return ; } if (route.startsWith('/afficheurs/arrivees/eva')) { return ; } if (route.startsWith('/afficheurs/arrivees/classiques')) { return ; } let content; if (route === '/departs') { content = navigate('/')} navigate={navigate} />; } else if (route === '/arrivees') { content = navigate('/')} navigate={navigate} />; } else if (route === '/select-afficheur') { content = { const params = new URLSearchParams(window.location.search); const gare = params.get('gare') || ''; const mode = params.get('mode') || 'departs'; navigate(`/afficheurs/${encodeURIComponent(gare)}?mode=${mode}`); }} navigate={navigate} />; } else if (route.startsWith('/afficheurs')) { content = navigate('/')} navigate={navigate} />; } else { content = ; } return ( ); } export default App;