import React, { useEffect, useState, useMemo } from 'react'; import { WcsCard, WcsCardBody, WcsButton, WcsInput, WcsBadge, WcsHorizontalStepper } from 'wcs-react'; import sessionMemory from '../lib/sessionMemory'; import { getSourceFromPath, searchGares } from '../services/railwayService'; const POPULAR_GARES = [ 'Paris-Gare-de-Lyon', 'Besançon-Viotte', 'Dijon-Ville', 'Lyon-Part-Dieu', 'Marseille-Saint-Charles', 'Lille-Flandres', 'Strasbourg', 'Bordeaux-Saint-Jean', 'Nantes', 'Rennes' ]; export default function Departs({ onBack, navigate }) { const source = getSourceFromPath(window.location.pathname); const prefix = source === 'supabase' ? '/ferrovia' : ''; const [allGares, setAllGares] = useState([]); const [sncfResults, setSncfResults] = useState([]); const [loading, setLoading] = useState(source === 'supabase'); const [error, setError] = useState(null); const [search, setSearch] = useState(''); // Pour Supabase : charger les gares une seule fois au montage useEffect(() => { let mounted = true; if (source === 'supabase') { async function loadSupabaseGares() { setLoading(true); setError(null); try { const data = await searchGares('', 'supabase'); if (mounted) setAllGares(Array.isArray(data) ? data.map(r => r.nom || r) : []); } catch (err) { console.error('Supabase error:', err); if (mounted) setError(err.message || String(err)); } finally { if (mounted) setLoading(false); } } loadSupabaseGares(); } return () => { mounted = false; }; }, [source]); // Pour SNCF : recherche dynamique avec debounce dès 2 caractères useEffect(() => { let active = true; if (source === 'sncf') { const q = search.trim(); if (q.length < 2) { setSncfResults([]); return; } const timer = setTimeout(async () => { try { const results = await searchGares(q, 'sncf'); if (active) setSncfResults(results); } catch (e) { if (active) setSncfResults([]); } }, 180); return () => { active = false; clearTimeout(timer); }; } }, [search, source]); // Liste finale affichée const displayedGares = useMemo(() => { if (source === 'supabase') { const q = search.toLowerCase().trim(); return allGares.filter(nom => String(nom).toLowerCase().includes(q)).map(nom => ({ nom })); } return sncfResults; }, [source, allGares, sncfResults, search]); const handleSelectGare = (nom) => { try { sessionMemory.set('afficheurMode', 'departs'); } catch (e) {} if (navigate) { const cleanNom = String(nom).trim().replace(/\s+/g, '-'); navigate(`${prefix}/afficheurs/${encodeURIComponent(cleanNom)}?mode=departs`); } }; const steps = [ { text: 'Choix de la gare', button: { kind: 'Text', text: '1' }, complete: false }, { text: "Type d'afficheur", button: { kind: 'Text', text: '2' }, disable: true }, { text: 'Options & Affichage', button: { kind: 'Text', text: '3' }, disable: true } ]; return (
Recherchez une gare pour afficher le tableau des départs en temps réel.
Gares fréquentes :
⏳ Chargement des gares...
} {error &&⚠️ Erreur : {error}
} {source === 'sncf' && search.trim().length < 2 && (💡 Saisissez au moins 2 lettres pour chercher parmi plus de 3 500 gares du réseau français.