import { useEffect, useState } from 'react'; import { Divider, Group, SelectItem, Stack } from '@mantine/core'; import { FileInput, NumberInput, SegmentedControl, Select, Slider, Switch, Textarea, Tooltip, toast, Text, } from '/@/renderer/components'; import isElectron from 'is-electron'; import { SettingsOptions } from '/@/renderer/features/settings/components/settings-option'; import { useCurrentStatus, usePlayerStore } from '/@/renderer/store'; import { useSettingsStore, useSettingsStoreActions } from '/@/renderer/store/settings.store'; import { PlaybackType, PlayerStatus, PlaybackStyle, CrossfadeStyle, Play } from '/@/renderer/types'; const localSettings = window.electron.localSettings; const mpvPlayer = window.electron.mpvPlayer; const getAudioDevice = async () => { const devices = await navigator.mediaDevices.enumerateDevices(); return (devices || []).filter((dev: MediaDeviceInfo) => dev.kind === 'audiooutput'); }; export const PlaybackTab = () => { const settings = useSettingsStore((state) => state.player); const { setSettings } = useSettingsStoreActions(); const status = useCurrentStatus(); const [audioDevices, setAudioDevices] = useState([]); const [mpvPath, setMpvPath] = useState(''); const [mpvParameters, setMpvParameters] = useState(''); const handleSetMpvPath = (e: File) => { localSettings.set('mpv_path', e.path); }; useEffect(() => { const getMpvPath = async () => { if (!isElectron()) return setMpvPath(''); const mpvPath = (await localSettings.get('mpv_path')) as string; return setMpvPath(mpvPath); }; const getMpvParameters = async () => { if (!isElectron()) return setMpvPath(''); const mpvParametersFromSettings = (await localSettings.get('mpv_parameters')) as string[]; const mpvParameters = mpvParametersFromSettings?.join('\n'); return setMpvParameters(mpvParameters); }; getMpvPath(); getMpvParameters(); }, []); 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: ( { setSettings({ player: { ...settings, type: e as PlaybackType } }); if (isElectron() && e === PlaybackType.LOCAL) { const queueData = usePlayerStore.getState().actions.getPlayerData(); mpvPlayer.setQueue(queueData); } }} /> ), description: 'The audio player to use for playback', isHidden: !isElectron(), note: status === PlayerStatus.PLAYING ? 'Player must be paused' : undefined, title: 'Audio player', }, { control: ( ), description: 'The location of your mpv executable', isHidden: settings.type !== PlaybackType.LOCAL, note: 'Restart required', title: 'Mpv executable path', }, { control: (