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. -> (BÉTA) : GÉNÉRATION AUTOMATIQUE DES ANNONCES POUR L'ENSEMBLE DES GARES EXISTANTES.
This commit is contained in:
1 parent
ad999aa44f
commit
0f7c271b1f
9 files changed
+52
-12
No files matched your search
@@ -1,16 +1,51 @@
|
|||||||
import { useEffect, useRef } from 'react';
|
import { useEffect, useRef } from 'react';
|
||||||
import supabase from '../lib/supabase';
|
import supabase from '../lib/supabase';
|
||||||
|
|
||||||
export default function useAnnonceSonoreRealtime(gareId) {
|
// Helper pour normaliser le nom du quai pour comparaison robuste
|
||||||
|
const normalizeQuai = (val) => {
|
||||||
|
if (!val) return '';
|
||||||
|
return String(val)
|
||||||
|
.toLowerCase()
|
||||||
|
.replace(/\s+/g, '')
|
||||||
|
.replace(/voie/g, '')
|
||||||
|
.replace(/quai/g, '');
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function useAnnonceSonoreRealtime(gareId, affType = null, quaiName = null) {
|
||||||
const audioRef = useRef(null);
|
const audioRef = useRef(null);
|
||||||
const lastAnnonceIdRef = useRef(null);
|
const lastAnnonceIdRef = useRef(null);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!supabase || !gareId) return;
|
if (!supabase || !gareId) return;
|
||||||
|
|
||||||
console.debug(`[useAnnonceSonoreRealtime] Setup for gareId: ${gareId}`);
|
console.debug(`[useAnnonceSonoreRealtime] Setup for gareId: ${gareId}, type: ${affType}, quai: ${quaiName}`);
|
||||||
|
|
||||||
const playAnnonce = (newRecord) => {
|
const playAnnonce = (newRecord) => {
|
||||||
|
// 1. Déterminer les afficheurs cibles
|
||||||
|
const variables = newRecord.annonce?.variables_values || {};
|
||||||
|
const targetAfficheurs = variables.afficheurs || [];
|
||||||
|
const trainQuai = variables.quai || '';
|
||||||
|
|
||||||
|
// Si targetAfficheurs est renseigné, filtrer
|
||||||
|
if (affType && targetAfficheurs.length > 0) {
|
||||||
|
const isTargeted = targetAfficheurs.includes(affType);
|
||||||
|
if (!isTargeted) {
|
||||||
|
console.debug(`[useAnnonceSonoreRealtime] Ignoré : cet afficheur (${affType}) n'est pas ciblé par l'annonce.`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Si l'afficheur est de type "Quais" (se termine par "Quais"), on vérifie la voie/quai
|
||||||
|
const isQuaiDisplay = affType.toLowerCase().endsWith('quais');
|
||||||
|
if (isQuaiDisplay && quaiName && trainQuai) {
|
||||||
|
const normDisplayQuai = normalizeQuai(quaiName);
|
||||||
|
const normTrainQuai = normalizeQuai(trainQuai);
|
||||||
|
if (normDisplayQuai !== normTrainQuai) {
|
||||||
|
console.debug(`[useAnnonceSonoreRealtime] Ignoré : voie non correspondante (Afficheur: ${quaiName}, Train: ${trainQuai})`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 1. Couper l'audio en cours de lecture
|
// 1. Couper l'audio en cours de lecture
|
||||||
if (audioRef.current) {
|
if (audioRef.current) {
|
||||||
try { audioRef.current.pause(); } catch (e) {}
|
try { audioRef.current.pause(); } catch (e) {}
|
||||||
@@ -59,7 +94,12 @@ export default function useAnnonceSonoreRealtime(gareId) {
|
|||||||
try {
|
try {
|
||||||
const { data, error } = await supabase
|
const { data, error } = await supabase
|
||||||
.from('annonces_diffusions')
|
.from('annonces_diffusions')
|
||||||
.select('*')
|
.select(`
|
||||||
|
*,
|
||||||
|
annonce:annonces_enregistrees(
|
||||||
|
variables_values
|
||||||
|
)
|
||||||
|
`)
|
||||||
.eq('gare_id', gareId)
|
.eq('gare_id', gareId)
|
||||||
.order('created_at', { ascending: false })
|
.order('created_at', { ascending: false })
|
||||||
.limit(1);
|
.limit(1);
|
||||||
@@ -106,5 +146,5 @@ export default function useAnnonceSonoreRealtime(gareId) {
|
|||||||
try { window.speechSynthesis.cancel(); } catch (e) {}
|
try { window.speechSynthesis.cancel(); } catch (e) {}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}, [gareId]);
|
}, [gareId, affType, quaiName]);
|
||||||
}
|
}
|
||||||
@@ -87,7 +87,7 @@ export default function AFLArrivees(){
|
|||||||
const [, setRawDebug] = useState({ count: 0, sample: [] });
|
const [, setRawDebug] = useState({ count: 0, sample: [] });
|
||||||
|
|
||||||
const [resolvedGareId, setResolvedGareId] = useState(gareIdParam || null);
|
const [resolvedGareId, setResolvedGareId] = useState(gareIdParam || null);
|
||||||
useAnnonceSonoreRealtime(resolvedGareId);
|
useAnnonceSonoreRealtime(resolvedGareId, 'AFLArrivees');
|
||||||
useAutoAnnonce(horaires, currentTime, true);
|
useAutoAnnonce(horaires, currentTime, true);
|
||||||
|
|
||||||
// Récupérer le type de gare une seule fois au montage ou quand les paramètres changent
|
// Récupérer le type de gare une seule fois au montage ou quand les paramètres changent
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ const AFLArriveesQuais = () => {
|
|||||||
const gareDisplay = gareParam ? decodeURIComponent(String(gareParam).replace(/\+/g, ' ')).replace(/-/g, ' ') : null;
|
const gareDisplay = gareParam ? decodeURIComponent(String(gareParam).replace(/\+/g, ' ')).replace(/-/g, ' ') : null;
|
||||||
|
|
||||||
const [resolvedGareId, setResolvedGareId] = useState(gareIdParam || null);
|
const [resolvedGareId, setResolvedGareId] = useState(gareIdParam || null);
|
||||||
useAnnonceSonoreRealtime(resolvedGareId);
|
useAnnonceSonoreRealtime(resolvedGareId, 'AFLArriveesQuais', quaiParam);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
let mounted = true;
|
let mounted = true;
|
||||||
|
|||||||
@@ -87,7 +87,7 @@ export default function AFLDeparts(){
|
|||||||
const [, setRawDebug] = useState({ count: 0, sample: [] });
|
const [, setRawDebug] = useState({ count: 0, sample: [] });
|
||||||
|
|
||||||
const [resolvedGareId, setResolvedGareId] = useState(gareIdParam || null);
|
const [resolvedGareId, setResolvedGareId] = useState(gareIdParam || null);
|
||||||
useAnnonceSonoreRealtime(resolvedGareId);
|
useAnnonceSonoreRealtime(resolvedGareId, 'AFLDeparts');
|
||||||
useAutoAnnonce(horaires, currentTime, false);
|
useAutoAnnonce(horaires, currentTime, false);
|
||||||
|
|
||||||
// Récupérer le type de gare une seule fois au montage ou quand les paramètres changent
|
// Récupérer le type de gare une seule fois au montage ou quand les paramètres changent
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ const AFLDepartsQuais = () => {
|
|||||||
const gareDisplay = gareParam ? decodeURIComponent(String(gareParam).replace(/\+/g, ' ')).replace(/-/g, ' ') : null;
|
const gareDisplay = gareParam ? decodeURIComponent(String(gareParam).replace(/\+/g, ' ')).replace(/-/g, ' ') : null;
|
||||||
|
|
||||||
const [resolvedGareId, setResolvedGareId] = useState(gareIdParam || null);
|
const [resolvedGareId, setResolvedGareId] = useState(gareIdParam || null);
|
||||||
useAnnonceSonoreRealtime(resolvedGareId);
|
useAnnonceSonoreRealtime(resolvedGareId, 'AFLDepartsQuais', quaiParam);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
let mounted = true;
|
let mounted = true;
|
||||||
|
|||||||
@@ -100,7 +100,7 @@ export default function ClassiquesArrivees(){
|
|||||||
const [rawDebug, setRawDebug] = useState({ count: 0, sample: [] });
|
const [rawDebug, setRawDebug] = useState({ count: 0, sample: [] });
|
||||||
|
|
||||||
const [resolvedGareId, setResolvedGareId] = useState(gareIdParam || null);
|
const [resolvedGareId, setResolvedGareId] = useState(gareIdParam || null);
|
||||||
useAnnonceSonoreRealtime(resolvedGareId);
|
useAnnonceSonoreRealtime(resolvedGareId, 'ClassiquesArrivees');
|
||||||
useAutoAnnonce(horaires, currentTime, true);
|
useAutoAnnonce(horaires, currentTime, true);
|
||||||
|
|
||||||
// Récupérer le type de gare une seule fois au montage ou quand les paramètres changent
|
// Récupérer le type de gare une seule fois au montage ou quand les paramètres changent
|
||||||
|
|||||||
@@ -100,7 +100,7 @@ export default function ClassiquesDeparts(){
|
|||||||
const [rawDebug, setRawDebug] = useState({ count: 0, sample: [] });
|
const [rawDebug, setRawDebug] = useState({ count: 0, sample: [] });
|
||||||
|
|
||||||
const [resolvedGareId, setResolvedGareId] = useState(gareIdParam || null);
|
const [resolvedGareId, setResolvedGareId] = useState(gareIdParam || null);
|
||||||
useAnnonceSonoreRealtime(resolvedGareId);
|
useAnnonceSonoreRealtime(resolvedGareId, 'ClassiquesDeparts');
|
||||||
useAutoAnnonce(horaires, currentTime, false);
|
useAutoAnnonce(horaires, currentTime, false);
|
||||||
|
|
||||||
// Récupérer le type de gare une seule fois au montage ou quand les paramètres changent
|
// Récupérer le type de gare une seule fois au montage ou quand les paramètres changent
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ export default function ClassiquesArriveesQuais() {
|
|||||||
const [currentTime, setCurrentTime] = useState(new Date());
|
const [currentTime, setCurrentTime] = useState(new Date());
|
||||||
|
|
||||||
const [resolvedGareId, setResolvedGareId] = useState(gareIdParam || null);
|
const [resolvedGareId, setResolvedGareId] = useState(gareIdParam || null);
|
||||||
useAnnonceSonoreRealtime(resolvedGareId);
|
useAnnonceSonoreRealtime(resolvedGareId, 'ClassiquesArriveesQuais', quaiParam);
|
||||||
useAutoAnnonce(selectedHoraire ? [selectedHoraire] : [], currentTime, true);
|
useAutoAnnonce(selectedHoraire ? [selectedHoraire] : [], currentTime, true);
|
||||||
const [alternateDelayPhase, setAlternateDelayPhase] = useState(true);
|
const [alternateDelayPhase, setAlternateDelayPhase] = useState(true);
|
||||||
const [alternateCancelPhase, setAlternateCancelPhase] = useState(true);
|
const [alternateCancelPhase, setAlternateCancelPhase] = useState(true);
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ export default function ClassiquesDepartsQuais() {
|
|||||||
const [currentTime, setCurrentTime] = useState(new Date());
|
const [currentTime, setCurrentTime] = useState(new Date());
|
||||||
|
|
||||||
const [resolvedGareId, setResolvedGareId] = useState(gareIdParam || null);
|
const [resolvedGareId, setResolvedGareId] = useState(gareIdParam || null);
|
||||||
useAnnonceSonoreRealtime(resolvedGareId);
|
useAnnonceSonoreRealtime(resolvedGareId, 'ClassiquesDepartsQuais', quaiParam);
|
||||||
useAutoAnnonce(selectedHoraire ? [selectedHoraire] : [], currentTime, false);
|
useAutoAnnonce(selectedHoraire ? [selectedHoraire] : [], currentTime, false);
|
||||||
const [alternateDelayPhase, setAlternateDelayPhase] = useState(true);
|
const [alternateDelayPhase, setAlternateDelayPhase] = useState(true);
|
||||||
const [alternateCancelPhase, setAlternateCancelPhase] = useState(true);
|
const [alternateCancelPhase, setAlternateCancelPhase] = useState(true);
|
||||||
|
|||||||
Reference in new issue
Block a user