import { useEffect, useState } from 'react'; import { Divider, Group, SelectItem, Stack } from '@mantine/core'; import isElectron from 'is-electron'; import { NumberInput, SegmentedControl, Select, Slider, Switch, toast, Tooltip, } from '@/renderer/components'; import { mpvPlayer } from '@/renderer/features/player/utils/mpv-player'; import { SettingsOptions } from '@/renderer/features/settings/components/settings-option'; import { usePlayerStore } from '@/renderer/store'; import { useSettingsStore } from '@/renderer/store/settings.store'; import { Play, PlaybackStyle, PlaybackType, PlayerStatus, } from '@/renderer/types'; const getAudioDevice = async () => { const devices = await navigator.mediaDevices.enumerateDevices(); return (devices || []).filter( (dev: MediaDeviceInfo) => dev.kind === 'audiooutput' ); }; const ipc = isElectron() ? window.electron.ipcRenderer : null; const set = (property: string, value: any) => { ipc?.SETTINGS_SET({ property, value }); }; export const PlaybackTab = () => { const settings = useSettingsStore((state) => state.player); const update = useSettingsStore((state) => state.setSettings); const status = usePlayerStore((state) => state.current.status); const [audioDevices, setAudioDevices] = useState([]); useEffect(() => { const getAudioDevices = () => { getAudioDevice() .then((dev) => setAudioDevices( dev.map((d) => ({ label: d.label, value: d.deviceId })) ) ) .catch(() => toast.error({ message: 'Error fetching audio devices' })); }; getAudioDevices(); }, []); const playerOptions = [ { control: ( { update({ player: { ...settings, type: e as PlaybackType } }); if (isElectron() && e === PlaybackType.LOCAL) { const queueData = usePlayerStore.getState().getPlayerData(); mpvPlayer.setQueue(queueData); } }} /> ), description: 'The audio player to use for playback (desktop only)', isHidden: !isElectron(), note: status === PlayerStatus.PLAYING ? 'Player must be paused' : undefined, title: 'Audio player', }, { control: (