import React, { useState, useEffect } from 'react'; import './AudioRoutingMatrix.css'; const API_URL = import.meta.env.VITE_API_URL || 'http://localhost:3000'; function AudioRoutingMatrix({ groups, channelNames }) { const [routing, setRouting] = useState({ inputToGroup: {}, groupToOutput: {}, gains: {} }); const [loading, setLoading] = useState(true); useEffect(() => { loadRouting(); }, []); const loadRouting = async () => { try { const res = await fetch(`${API_URL}/admin/audio/routing`); if (!res.ok) { throw new Error(`HTTP error! status: ${res.status}`); } const data = await res.json(); setRouting(data.routing || { inputToGroup: {}, groupToOutput: {}, gains: {} }); } catch (error) { console.error('Erreur chargement routing:', error); } finally { setLoading(false); } }; const saveRouting = async () => { try { const res = await fetch(`${API_URL}/admin/audio/routing`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(routing) }); if (res.ok) { alert('Configuration de routing sauvegardée!'); } else { const errorText = await res.text(); console.error('Erreur serveur:', errorText); alert(`Erreur: ${res.status} - ${errorText}`); } } catch (error) { console.error('Erreur sauvegarde routing:', error); alert('Erreur lors de la sauvegarde'); } }; const toggleInputToGroup = (inputId, groupId) => { setRouting(prev => { const inputToGroup = { ...prev.inputToGroup }; if (!inputToGroup[inputId]) { inputToGroup[inputId] = []; } const groupArray = [...inputToGroup[inputId]]; const index = groupArray.indexOf(groupId); if (index > -1) { groupArray.splice(index, 1); } else { groupArray.push(groupId); } inputToGroup[inputId] = groupArray; return { ...prev, inputToGroup }; }); }; const toggleGroupToOutput = (groupId, outputId) => { setRouting(prev => { const groupToOutput = { ...prev.groupToOutput }; if (!groupToOutput[groupId]) { groupToOutput[groupId] = []; } const outputArray = [...groupToOutput[groupId]]; const index = outputArray.indexOf(outputId); if (index > -1) { outputArray.splice(index, 1); } else { outputArray.push(outputId); } groupToOutput[groupId] = outputArray; return { ...prev, groupToOutput }; }); }; const isInputRoutedToGroup = (inputId, groupId) => { return routing.inputToGroup[inputId]?.includes(groupId) || false; }; const isGroupRoutedToOutput = (groupId, outputId) => { return routing.groupToOutput[groupId]?.includes(outputId) || false; }; const getChannelName = (type, id) => { const name = channelNames?.[type]?.[id]; return name || `${type === 'inputs' ? 'Input' : 'Output'} ${id}`; }; if (loading) { return
Sélectionnez quels inputs audio alimentent chaque groupe
Sélectionnez vers quels outputs chaque groupe envoie son audio