diff --git a/client/src/Admin.jsx b/client/src/Admin.jsx index def1f6f..bb285ee 100644 --- a/client/src/Admin.jsx +++ b/client/src/Admin.jsx @@ -1,4 +1,4 @@ -import { useState, useEffect } from 'react'; +import { useState, useEffect, useRef } from 'react'; import './Admin.css'; import AudioRoutingMatrix from './components/AudioRoutingMatrix'; @@ -19,11 +19,12 @@ function Admin() { const [selectedInputDevice, setSelectedInputDevice] = useState(null); const [selectedOutputDevice, setSelectedOutputDevice] = useState(null); const [selectedSampleRate, setSelectedSampleRate] = useState(48000); - const [isEditingAudio, setIsEditingAudio] = useState(false); + const isEditingAudioRef = useRef(false); // Channel names (Phase 2.5) const [channelNames, setChannelNames] = useState({ inputs: {}, outputs: {} }); - const [editingChannelNames, setEditingChannelNames] = useState(false); + const editingChannelNamesRef = useRef(false); + const [, forceUpdate] = useState({}); // Gestion formulaire nouveau groupe const [showGroupForm, setShowGroupForm] = useState(false); @@ -104,10 +105,14 @@ function Admin() { const device = currentData.device || { inputChannels: 8, outputChannels: 8 }; setCurrentDevice(device); - setChannelNames(channelNamesData.channelNames || { inputs: {}, outputs: {} }); - // Ne réinitialiser les sélections que si l'utilisateur n'est pas en train d'éditer - if (!isEditingAudio) { + // Ne pas écraser les noms de canaux pendant l'édition + if (!editingChannelNamesRef.current) { + setChannelNames(channelNamesData.channelNames || { inputs: {}, outputs: {} }); + } + + // Ne réinitialiser les sélections que lors du chargement initial (pas en train d'éditer) + if (!isEditingAudioRef.current) { setSelectedInputDevice(device.inputDeviceId ?? null); setSelectedOutputDevice(device.outputDeviceId ?? null); setSelectedSampleRate(device.sampleRate || 48000); @@ -216,7 +221,8 @@ function Admin() { if (res.ok) { alert('Noms de canaux sauvegardés avec succès!'); - setEditingChannelNames(false); + editingChannelNamesRef.current = false; + forceUpdate({}); await loadAudioDevices(); } else { const error = await res.json(); @@ -251,7 +257,7 @@ function Admin() { }); if (res.ok) { - setIsEditingAudio(false); // Désactiver le mode édition + isEditingAudioRef.current = false; // Désactiver le mode édition alert('Configuration audio sauvegardée avec succès!'); await loadAudioDevices(); } else { @@ -442,7 +448,7 @@ function Admin() { { - setIsEditingAudio(true); + isEditingAudioRef.current = true; setSelectedOutputDevice(e.target.value === '' ? null : e.target.value); }} className="device-select" @@ -494,7 +500,7 @@ function Admin() { handleChange('defaultPTTMode', 'normal')} - /> -
- Mode normal (Push-To-Talk) -

Maintenir le bouton pour parler, relâcher pour arrêter

-
- - - - -

Feedback

@@ -112,19 +77,7 @@ export default function Settings({ isOpen, onClose }) { />
Vibrations -

Activer le retour haptique (si disponible)

-
- - -