import React, { useState, useEffect } from "react"; import { invoke } from "@tauri-apps/api/core"; import { AudioDevice } from "../../lib/types"; import { Dropdown } from "../ui/Dropdown"; import { SettingContainer } from "../ui/SettingContainer"; import ResetIcon from "../icons/ResetIcon"; interface OutputDeviceSelectorProps { descriptionMode?: "inline" | "tooltip"; grouped?: boolean; } export const OutputDeviceSelector: React.FC = ({ descriptionMode = "tooltip", grouped = false, }) => { const [outputDevices, setOutputDevices] = useState([]); const [selectedOutputDevice, setSelectedOutputDevice] = useState("default"); const [isLoading, setIsLoading] = useState(true); const [isUpdating, setIsUpdating] = useState(false); useEffect(() => { loadOutputDevices(); loadSettings(); }, []); const loadOutputDevices = async () => { try { const devices: AudioDevice[] = await invoke( "get_available_output_devices", ); setOutputDevices(devices); } catch (error) { console.error("Failed to load output devices:", error); setOutputDevices([]); } }; const loadSettings = async () => { try { setIsLoading(true); const selectedDevice: string = await invoke("get_selected_output_device"); setSelectedOutputDevice(selectedDevice); } catch (error) { console.error("Failed to load output device settings:", error); } finally { setIsLoading(false); } }; const handleOutputDeviceSelect = async (deviceName: string) => { if (isUpdating) return; try { setIsUpdating(true); await invoke("set_selected_output_device", { deviceName }); setSelectedOutputDevice(deviceName); console.log( `Output device changed to: ${outputDevices.find((d) => d.name === deviceName)?.name}`, ); } catch (error) { console.error("Failed to set output device:", error); // Revert selection if update failed loadSettings(); } finally { setIsUpdating(false); } }; const handleReset = async () => { if (isUpdating) return; try { setIsUpdating(true); await invoke("set_selected_output_device", { deviceName: "default" }); setSelectedOutputDevice("default"); console.log("Output device reset to default"); } catch (error) { console.error("Failed to reset output device:", error); // Revert selection if reset failed loadSettings(); } finally { setIsUpdating(false); } }; return (
{isUpdating && (
)}
); };