import { useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { ListConfigTable } from '/@/renderer/features/shared/components/list-config-menu'; import { usePlayerActions, usePlayerData, usePlayerProperties, usePlayerQueueType, usePlayerSpeed, } from '/@/renderer/store'; import { usePlaybackSettings, useSettingsStore, useSettingsStoreActions, } from '/@/renderer/store/settings.store'; import { ActionIcon } from '/@/shared/components/action-icon/action-icon'; import { Popover } from '/@/shared/components/popover/popover'; import { SegmentedControl } from '/@/shared/components/segmented-control/segmented-control'; import { Slider } from '/@/shared/components/slider/slider'; import { Switch } from '/@/shared/components/switch/switch'; import { PlayerQueueType, PlayerStyle, PlayerType } from '/@/shared/types/types'; export const PlayerConfig = () => { const { t } = useTranslation(); const { currentSong } = usePlayerData(); const speed = usePlayerSpeed(); const queueType = usePlayerQueueType(); const { crossfadeDuration, transitionType } = usePlayerProperties(); const { setCrossfadeDuration, setQueueType, setSpeed, setTransitionType } = usePlayerActions(); const playbackSettings = usePlaybackSettings(); const { setSettings } = useSettingsStoreActions(); const speedPreservePitch = useSettingsStore((state) => state.playback.preservePitch); const options = useMemo(() => { const formatPlaybackSpeedSliderLabel = (value: number) => { const bpm = Number(currentSong?.bpm); if (bpm > 0) { return `${value} x / ${(bpm * value).toFixed(1)} BPM`; } return `${value} x`; }; const allOptions = [ { component: ( setQueueType(value as PlayerQueueType)} size="sm" value={queueType} w="100%" /> ), id: 'queueType', label: t('player.queueType', { postProcess: 'sentenceCase' }), }, ...(playbackSettings.type === PlayerType.WEB ? [ { component: ( setTransitionType(value as PlayerStyle)} size="sm" value={transitionType} w="100%" /> ), id: 'transitionType', label: t('setting.playbackStyle', { postProcess: 'sentenceCase', }), }, ] : []), ...(playbackSettings.type === PlayerType.WEB && transitionType === PlayerStyle.CROSSFADE ? [ { component: ( ), id: 'crossfadeDuration', label: t('setting.crossfadeDuration', { postProcess: 'sentenceCase', }), }, ] : []), ...(playbackSettings.type === PlayerType.WEB ? [ { component: ( { setSettings({ playback: { ...playbackSettings, preservePitch: e.currentTarget.checked, }, }); }} /> ), id: 'preservePitch', label: t('setting.preservePitch', { postProcess: 'sentenceCase', }), }, ] : []), { component: ( setSpeed(1)} step={0.01} styles={{ markLabel: {}, root: {}, }} value={speed} w="100%" /> ), id: 'playbackSpeed', label: t('player.playbackSpeed', { postProcess: 'sentenceCase' }), }, ]; return allOptions; }, [ playbackSettings, speedPreservePitch, setSettings, currentSong, speed, setSpeed, queueType, setQueueType, transitionType, setTransitionType, crossfadeDuration, setCrossfadeDuration, t, ]); return ( { e.stopPropagation(); }} size="sm" tooltip={{ label: t('common.setting_other', { postProcess: 'titleCase' }), openDelay: 0, }} variant="subtle" /> ); };