import React, { useEffect, useState } from 'react'; import WcsButton from '../components/WcsButton'; import { getSourceFromPath, getPlatformsForStation } from '../services/railwayService'; export default function SelectAfficheur({ onBack, navigate }) { const source = getSourceFromPath(window.location.pathname); const prefix = source === 'supabase' ? '/ferrovia' : ''; const params = new URLSearchParams(window.location.search || ''); const gareParam = params.get('gare') || ''; const modeParam = params.get('mode') || 'departs'; const typeParam = params.get('type') || 'afl'; const [platforms, setPlatforms] = useState([]); const [selectedPlatform, setSelectedPlatform] = useState(''); const [manualPlatform, setManualPlatform] = useState(''); const [loading, setLoading] = useState(true); // État des pages sélectionnées pour les afficheurs AFL const [aflPages, setAflPages] = useState({ horaires: true, infos: false, securite1: false, securite2: false, corresp: false }); // Options spécifiques pour les afficheurs Classiques const [extendedLines, setExtendedLines] = useState(0); // 0, 1, 2, 3 const [showTime, setShowTime] = useState(false); const toggleAflPage = (key) => { setAflPages(prev => ({ ...prev, [key]: !prev[key] })); }; const selectAllAflPages = (all) => { setAflPages({ horaires: true, infos: all, securite1: all, securite2: all, corresp: all }); }; // Decode and format station name for display const decodedGare = gareParam ? decodeURIComponent(String(gareParam).replace(/\+/g, ' ')).replace(/-/g, ' ') : ''; useEffect(() => { let mounted = true; async function loadPlatforms() { try { setLoading(true); const sortedPlatforms = await getPlatformsForStation(decodedGare || gareParam, source); if (!mounted) return; setPlatforms(sortedPlatforms || []); if (sortedPlatforms && sortedPlatforms.length > 0) { setSelectedPlatform(sortedPlatforms[0]); } } catch (err) { console.error('Error fetching platforms:', err); } finally { if (mounted) setLoading(false); } } loadPlatforms(); return () => { mounted = false; }; }, [gareParam, decodedGare, source]); const handleGeneral = () => { if (typeof navigate === 'function') { const kebab = gareParam ? String(gareParam).trim() : ''; let url = `${prefix}/afficheurs/${modeParam}/${typeParam}?gare=${encodeURIComponent(kebab)}`; if (typeParam === 'afl') { const activeKeys = Object.entries(aflPages) .filter(([_, active]) => active) .map(([key]) => key); if (activeKeys.length > 0) { url += `&pages=${activeKeys.join(',')}`; } } else if (typeParam === 'classiques') { if (extendedLines > 0) { url += `&extended=${extendedLines}`; } if (showTime) { url += `&time=true`; } } navigate(url); } }; const handlePlatform = () => { const quai = manualPlatform.trim() || selectedPlatform; if (!quai) { alert("Veuillez sélectionner ou saisir une voie."); return; } if (typeof navigate === 'function') { const kebab = gareParam ? String(gareParam).trim() : ''; let url = `${prefix}/afficheurs/${modeParam}/${typeParam}/quais?gare=${encodeURIComponent(kebab)}&quai=${encodeURIComponent(quai)}`; if (typeParam === 'classiques') { if (extendedLines > 0) { url += `&extended=${extendedLines}`; } if (showTime) { url += `&time=true`; } } navigate(url); } }; const handleSinglePage = (pageKey) => { if (typeof navigate === 'function') { const kebab = gareParam ? String(gareParam).trim() : ''; navigate(`${prefix}/afficheurs/${modeParam}/${typeParam}?gare=${encodeURIComponent(kebab)}&page=${pageKey}`); } }; return (
{/* Stepper */}
✓ {decodedGare || 'Gare'}
›
✓ {typeParam.toUpperCase()}
›
3 Options & Affichage
{/* Header */}

Configuration de l'afficheur

Gare : {decodedGare} • Mode : {modeParam === 'arrivees' ? '🏁 Arrivées' : '🚆 Départs'} • Style : {typeParam.toUpperCase()}

{source === 'supabase' ? '🗄️ BDD Ferrovia' : '🌐 SNCF GTFS'}
{/* Grille responsive 2 colonnes (1 col sur mobile) */}
{/* Option 1 : Afficheur Général */}
🖥️ Écran Général

Afficheur Général (Hall)

Affiche la liste complète des circulations avec basculement automatique des pages.

{typeParam === 'afl' && (
Pages incluses dans la boucle :
|
)} {typeParam === 'classiques' && (
Options d'affichage Classiques :
{/* Choix du nombre de lignes étendues */}
{[0, 1, 2, 3].map((num) => ( ))}
{extendedLines > 0 ? `Les ${extendedLines} premier${extendedLines > 1 ? 's' : ''} train${extendedLines > 1 ? 's' : ''} s'afficheront sur 2 lignes réduites avec le défilement de toutes les gares.` : 'Affichage classique compact sans défilement de gares.'}
{/* Option Afficher l'heure */}
Réserve la 10e ligne pour l'horloge numérique [ HH MM SS ] et un bandeau d'information défilant (horaires sur 9 lignes max).
)}
{/* Option 2 : Afficheur par Quai */}
🚉 Écran de Voie

Afficheur par Quai

Affiche le prochain train au départ/arrivée avec la liste déroulante des gares desservies sur la voie.

{loading ? (
⏳ Détection des voies réelles...
) : (
{platforms.length > 0 ? (
) : (
ℹ️ Saisie manuelle de la voie ci-dessous.
)}
setManualPlatform(e.target.value)} style={{ width: '100%', padding: '12px', borderRadius: '8px', border: '2px solid #e2ebf6', fontSize: '15px', boxSizing: 'border-box', background: '#ffffff' }} />
)}
{/* Options 3 & 4 pour le mode Classiques : Flash Info & Informations */} {typeParam === 'classiques' && ( <> {/* Option 3 : Flash Information */}
⚡ Flash Info Trafic

Flash Information

Écran dédié aux perturbations de circulation en temps réel et travaux de maintenance sur le réseau.

⚡ Conforme au design historique Flash Circulation avec fond ambre et bandeau bleu nuit.
{/* Option 4 : Informations (Messages Dynamiques) */}
ℹ️ Messages Gare

Informations Voyageurs

Écran d'annonces et consignes dynamiques de la gare (Vigipirate, étiquetage des bagages, sécurité en gare).

ℹ️ Conforme au design historique Information avec messages voyageurs de la gare de {decodedGare}.
)}
{/* Accès direct aux pages fixes AFL */} {typeParam === 'afl' && (
Accès direct à une page fixe AFL :
)} {/* Navigation retour */}
{ if (typeof onBack === 'function') { onBack(); } else if (typeof navigate === 'function') { navigate(`${prefix}/afficheurs?gare=${encodeURIComponent(gareParam)}&mode=${modeParam}`); } }} label="← Retour au choix du style" />
); }