import React, { useEffect, useState } from 'react'; import { Mic, Check, AlertCircle } from 'lucide-react'; interface AudioDeviceSelectorProps { selectedDeviceId?: string; onSelect: (deviceId: string) => void; className?: string; } const AudioDeviceSelector: React.FC = ({ selectedDeviceId, onSelect, className = "" }) => { const [devices, setDevices] = useState([]); const [error, setError] = useState(null); const getDevices = async () => { try { // Request permission first to get labels await navigator.mediaDevices.getUserMedia({ audio: true }); const allDevices = await navigator.mediaDevices.enumerateDevices(); const audioInputs = allDevices.filter(device => device.kind === 'audioinput'); setDevices(audioInputs); // If no device is selected but we have devices, select the first one if (!selectedDeviceId && audioInputs.length > 0) { onSelect(audioInputs[0].deviceId); } } catch (err) { console.error("Error accessing audio devices:", err); setError("Microphone access denied. Please check your browser permissions."); } }; useEffect(() => { getDevices(); // Listen for device changes (e.g., plugging in a new mic) navigator.mediaDevices.addEventListener('devicechange', getDevices); return () => { navigator.mediaDevices.removeEventListener('devicechange', getDevices); }; }, []); if (error) { return (
{error}
); } return (
{devices.length === 0 ? (

Searching for devices...

) : ( devices.map((device) => ( )) )}
); }; export default AudioDeviceSelector;