import { useEffect, useRef, useState } from 'react'; import { Check, FolderOpen, Infinity, MoveRight, Save, Share2, Shuffle, Trash2, Waves, } from 'lucide-react'; import type { TFunction } from 'i18next'; import type { QueueItemRef } from '../../store/playerStoreTypes'; import type { QueueToolbarButtonConfig, QueueToolbarButtonId, } from '../../store/queueToolbarStore'; interface Props { queue: QueueItemRef[]; activePlaylist: { id: string; name: string } | null; saveState: 'idle' | 'saving' | 'saved'; toolbarButtons: QueueToolbarButtonConfig[]; shuffleQueue: () => void; handleSave: () => void; handleLoad: () => void; handleCopyQueueShare: () => void; handleClear: () => void; gaplessEnabled: boolean; setGaplessEnabled: (v: boolean) => void; crossfadeEnabled: boolean; setCrossfadeEnabled: (v: boolean) => void; crossfadeSecs: number; setCrossfadeSecs: (v: number) => void; crossfadeTrimSilence: boolean; setCrossfadeTrimSilence: (v: boolean) => void; infiniteQueueEnabled: boolean; setInfiniteQueueEnabled: (v: boolean) => void; t: TFunction; } export function QueueToolbar({ queue, activePlaylist, saveState, toolbarButtons, shuffleQueue, handleSave, handleLoad, handleCopyQueueShare, handleClear, gaplessEnabled, setGaplessEnabled, crossfadeEnabled, setCrossfadeEnabled, crossfadeSecs, setCrossfadeSecs, crossfadeTrimSilence, setCrossfadeTrimSilence, infiniteQueueEnabled, setInfiniteQueueEnabled, t, }: Props) { const [showCrossfadePopover, setShowCrossfadePopover] = useState(false); const crossfadeBtnRef = useRef(null); const crossfadePopoverRef = useRef(null); useEffect(() => { if (!showCrossfadePopover) return; const handle = (e: MouseEvent) => { if ( crossfadeBtnRef.current?.contains(e.target as Node) || crossfadePopoverRef.current?.contains(e.target as Node) ) return; setShowCrossfadePopover(false); }; document.addEventListener('mousedown', handle); return () => document.removeEventListener('mousedown', handle); }, [showCrossfadePopover]); return (
{toolbarButtons.map((btn) => { if (!btn.visible) return null; switch (btn.id as QueueToolbarButtonId) { case 'shuffle': return ( ); case 'save': return ( ); case 'load': return ( ); case 'share': return ( ); case 'clear': return ( ); case 'separator': return
; case 'gapless': return ( ); case 'crossfade': return (
{showCrossfadePopover && (
{!crossfadeTrimSilence && ( <>
{t('queue.crossfade')} {crossfadeSecs.toFixed(1)} s
{ setCrossfadeSecs(parseFloat(e.target.value)); setCrossfadeEnabled(true); }} className="crossfade-popover-slider" />
0.1s10s
)}
)}
); case 'infinite': return ( ); default: return null; } })}
); }