V2.5 : VOICI LES MODIFICATIONS MAJEURS APPRTÉES DANS CETTE VERSION :

-> (BÉTA) : SYSTÈME D'ANNONCES EN GARE VIA UN MODEL IA DE SIMONE HERAULT.
This commit is contained in:
Ferrovia committed 2026-07-02 22:22:37 +02:00
1 parent ad3fc8938c
commit ad999aa44f
14 files changed
+517 -62

No files matched your search

@@ -1,6 +1,7 @@
import React, { useState, useEffect, useCallback } from 'react';
import supabase from '../../../lib/supabase';
import './AFLDepartsQuais.css';
import useAnnonceSonoreRealtime from '../../../hooks/useAnnonceSonoreRealtime';
// Helper utilitaire : format HH:MM sans secondes (ex: 15:57)
const formatTimeNoSeconds = (v) => {
@@ -26,9 +27,46 @@ const AFLDepartsQuais = () => {
// Parse URL manually since we are not in a React Router context
const searchParams = new URLSearchParams(window.location.search);
const gareParam = searchParams.get('gare') || '';
const gareIdParam = searchParams.get('gare_id') || searchParams.get('gareId');
const quaiParam = searchParams.get('quai') || searchParams.get('voie') || '';
const gareDisplay = gareParam ? decodeURIComponent(String(gareParam).replace(/\+/g, ' ')).replace(/-/g, ' ') : null;
const [resolvedGareId, setResolvedGareId] = useState(gareIdParam || null);
useAnnonceSonoreRealtime(resolvedGareId);
useEffect(() => {
let mounted = true;
const resolveGareId = async () => {
if (!supabase) return;
try {
if (gareIdParam) {
const { data: gdata } = await supabase.from('gares').select('id').eq('id', gareIdParam).limit(1);
if (mounted && gdata && gdata.length) {
setResolvedGareId(gdata[0].id);
}
} else if (gareDisplay) {
const flexNeedle = `%${String(gareDisplay).replace(/[-_+\s]+/g, '%')}%`;
const { data: gdata } = await supabase.from('gares').select('id, nom').ilike('nom', flexNeedle);
if (gdata && gdata.length) {
const exactMatch = gdata.find(g => {
const n1 = String(g.nom || '').normalize('NFD').replace(/\p{M}/gu, '').toLowerCase().replace(/[-_+\s]+/g, ' ').trim();
const n2 = String(gareDisplay || '').normalize('NFD').replace(/\p{M}/gu, '').toLowerCase().replace(/[-_+\s]+/g, ' ').trim();
return n1 === n2;
});
const chosen = exactMatch || gdata[0];
if (mounted && chosen) {
setResolvedGareId(chosen.id);
}
}
}
} catch (e) {
console.error('[AFLDepartsQuais] Erreur resolution gare:', e);
}
};
resolveGareId();
return () => { mounted = false; };
}, [gareIdParam, gareDisplay]);
// Real-time clock update
useEffect(() => {
const timer = setInterval(() => setCurrentTime(new Date()), 1000);