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 { BarAlign, PlayerbarSliderType, useGeneralSettings, usePlaybackSettings, usePlayerbarSlider, 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 playerbarSlider = usePlayerbarSlider(); const generalSettings = useGeneralSettings(); 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: 'titleCase' }), }, { component: null, id: 'divider-1', isDivider: true, label: '', }, ...(playbackSettings.type === PlayerType.WEB ? [ { component: ( setTransitionType(value as PlayerStyle)} size="sm" value={transitionType} w="100%" /> ), id: 'transitionType', label: t('setting.playbackStyle', { postProcess: 'titleCase', }), }, ] : []), ...(playbackSettings.type === PlayerType.WEB && transitionType === PlayerStyle.CROSSFADE ? [ { component: ( ), id: 'crossfadeDuration', label: t('setting.crossfadeDuration', { postProcess: 'titleCase', }), }, ] : []), { component: ( { setSettings({ general: { ...generalSettings, playerbarSlider: { ...playerbarSlider, type: value as PlayerbarSliderType, }, }, }); }} size="sm" value={playerbarSlider?.type || PlayerbarSliderType.WAVEFORM} w="100%" /> ), id: 'playerbarSliderType', label: t('setting.playerbarSlider', { postProcess: 'titleCase' }), }, ...(playerbarSlider?.type === PlayerbarSliderType.WAVEFORM ? [ { component: ( { setSettings({ general: { ...generalSettings, playerbarSlider: { ...playerbarSlider, barAlign: (value as BarAlign) || BarAlign.CENTER, }, }, }); }} size="sm" value={playerbarSlider?.barAlign || BarAlign.CENTER} w="100%" /> ), id: 'barAlign', label: t('setting.playerbarWaveformAlign', { postProcess: 'titleCase', }), }, { component: ( { setSettings({ general: { ...generalSettings, playerbarSlider: { ...playerbarSlider, barWidth: value, }, }, }); }} step={1} styles={{ root: {}, }} w="100%" /> ), id: 'barWidth', label: t('setting.playerbarWaveformBarWidth', { postProcess: 'titleCase', }), }, { component: ( { setSettings({ general: { ...generalSettings, playerbarSlider: { ...playerbarSlider, barGap: value, }, }, }); }} step={1} styles={{ root: {}, }} w="100%" /> ), id: 'barGap', label: t('setting.playerbarWaveformGap', { postProcess: 'titleCase' }), }, { component: ( { setSettings({ general: { ...generalSettings, playerbarSlider: { ...playerbarSlider, barRadius: value, }, }, }); }} step={1} styles={{ root: {}, }} w="100%" /> ), id: 'barRadius', label: t('setting.playerbarWaveformRadius', { postProcess: 'titleCase', }), }, ] : []), { component: null, id: 'divider-2', isDivider: true, label: '', }, { component: ( setSpeed(1)} step={0.01} styles={{ markLabel: {}, root: {}, }} value={speed} w="100%" /> ), id: 'playbackSpeed', label: t('player.playbackSpeed', { postProcess: 'titleCase' }), }, ...(speed !== 1 ? [ { component: ( { setSettings({ playback: { ...playbackSettings, preservePitch: e.currentTarget.checked, }, }); }} /> ), id: 'preservePitch', label: t('setting.preservePitch', { postProcess: 'titleCase', }), }, ] : []), ]; return allOptions; }, [ playbackSettings, speedPreservePitch, setSettings, currentSong, speed, setSpeed, queueType, setQueueType, transitionType, setTransitionType, crossfadeDuration, setCrossfadeDuration, playerbarSlider, generalSettings, t, ]); return ( ); };