import { useEffect, useState } from 'react'; import { useVoiceStore } from '../stores/voice.ts'; interface Props { onClose: () => void; } export function DeviceSettingsModal({ onClose }: Props) { const room = useVoiceStore((s) => s._room); const bgMode = useVoiceStore((s) => s.bgMode); const [audioInputs, setAudioInputs] = useState([]); const [audioOutputs, setAudioOutputs] = useState([]); const [videoInputs, setVideoInputs] = useState([]); const [activeAudioInput, setActiveAudioInput] = useState(''); const [activeAudioOutput, setActiveAudioOutput] = useState(''); const [activeVideoInput, setActiveVideoInput] = useState(''); useEffect(() => { async function loadDevices() { if (!room) return; try { // Request permissions first to ensure we get labels await navigator.mediaDevices.getUserMedia({ audio: true, video: true }); } catch (e) { // Ignore if denied or no devices } const devices = await navigator.mediaDevices.enumerateDevices(); setAudioInputs(devices.filter((d) => d.kind === 'audioinput')); setAudioOutputs(devices.filter((d) => d.kind === 'audiooutput')); setVideoInputs(devices.filter((d) => d.kind === 'videoinput')); // If room exposes getActiveDevice(kind) if (typeof room.getActiveDevice === 'function') { const ai = room.getActiveDevice('audioinput'); const ao = room.getActiveDevice('audiooutput'); const vi = room.getActiveDevice('videoinput'); if (ai) setActiveAudioInput(ai); if (ao) setActiveAudioOutput(ao); if (vi) setActiveVideoInput(vi); } } loadDevices(); }, [room]); const handleDeviceChange = async (kind: MediaDeviceKind, deviceId: string) => { if (!room) return; try { await room.switchActiveDevice(kind, deviceId); if (kind === 'audioinput') setActiveAudioInput(deviceId); if (kind === 'audiooutput') setActiveAudioOutput(deviceId); if (kind === 'videoinput') setActiveVideoInput(deviceId); } catch (e) { console.error('Failed to switch device', e); } }; return (

Device Settings

); }