import React, { useEffect, useState, useRef, useCallback } from 'react'; import './ClassiquesDepartsQuais.css'; import supabase from '../../../../lib/supabase'; // Hook pour récupérer la map des logos depuis /type/data.json function useTypeLogos(){ const [map, setMap] = useState({ default: '/type/quais/logo-sncf-color.svg' }); useEffect(() => { let mounted = true; const load = async () => { const candidates = ['/type/quais/data-color.json', '/type/data.json']; for(const url of candidates){ try{ const res = await fetch(url); if(!res.ok) continue; const data = await res.json(); if(!mounted) return; const logos = {}; if(Array.isArray(data.logos)){ data.logos.forEach(item => { // item.file is expected (ex: logo-tgv.svg). If absent, try to extract from path let file = item.file; if(!file && item.path){ const parts = String(item.path).split('/'); file = parts[parts.length-1]; } if(!file) return; const basename = file.replace(/\.[^/.]+$/, ''); const semantic = basename.replace(/^logo-/, ''); const key = semantic.toUpperCase().replace(/[^A-Z0-9]+/g, '-'); // Prefer color logos in the 'quais' subfolder if data came from the quais file if(url.includes('/quais/')){ logos[key] = `/type/quais/${file}`; } else { logos[key] = `/type/${file}`; } }); } logos.default = logos['SNCF-VOYAGEURS-LOGO'] || logos['SNFC-VOYAGEURS-LOGO'] || logos['SNCF'] || '/type/sncf-voyageurs-logo.png'; setMap(logos); return; }catch(e){ // try next candidate (ignore error and continue loop) } } // no candidate succeeded — keep fallback }; load(); return () => { mounted = false; }; }, []); return map; } function getTypeLogo(type, TYPE_LOGOS_MAP){ const map = TYPE_LOGOS_MAP || { default: '/type/sncf-voyageurs-logo.png' }; if(!type) return map.default; const norm = String(type).toUpperCase().replace(/[^A-Z0-9]+/g, '-'); if(map[norm]) return map[norm]; const keys = Object.keys(map).filter(k => k !== 'default'); for(const k of keys){ if(k.includes(norm) || norm.includes(k)) return map[k]; } return map.default; } function Clock() { const [now, setNow] = useState(new Date()); useEffect(() => { const id = setInterval(() => setNow(new Date()), 1000); return () => clearInterval(id); }, []); const hh = String(now.getHours()).padStart(2,'0'); const mm = String(now.getMinutes()).padStart(2,'0'); const ss = String(now.getSeconds()).padStart(2,'0'); return (
{JSON.stringify(selectedHoraire, null, 2)} : null}