import React, { useState } from 'react'; import { useAudio } from '../../../context/AudioContext'; import { Card } from '../../ui/card'; import { Button } from '../../ui/button'; import { SaveQueueAsPlaylistModal } from './SaveQueueAsPlaylistModal'; import { Play, Pause, X, GripVertical, Trash2, Save, ListMusic, } from 'lucide-react'; import { useToast } from '../../../components/feedback/ToastProvider'; export const QueueView: React.FC = () => { const { queue, currentTrack, reorderQueue, removeFromQueue, clearQueue, playTrack, isPlaying, togglePlay, autoplay, toggleAutoplay, } = useAudio(); const { addToast } = useToast(); const [showSaveModal, setShowSaveModal] = useState(false); const [draggedIndex, setDraggedIndex] = useState(null); const handleDragStart = (e: React.DragEvent, index: number) => { setDraggedIndex(index); e.dataTransfer.effectAllowed = 'move'; // Transparent ghost image const ghost = document.createElement('div'); ghost.style.opacity = '0'; document.body.appendChild(ghost); e.dataTransfer.setDragImage(ghost, 0, 0); setTimeout(() => document.body.removeChild(ghost), 0); }; const handleDragOver = (e: React.DragEvent, index: number) => { e.preventDefault(); if (draggedIndex === null || draggedIndex === index) return; reorderQueue(draggedIndex, index); setDraggedIndex(index); }; const handleSavePlaylist = (name: string, _isPublic: boolean) => { addToast(`Queue saved as "${name}"`, 'success'); // Logic to actually save would connect to backend/context here }; return (

PLAY QUEUE

{queue.length} tracks upcoming

{/* Current Track */} {currentTrack && (

Now Playing

{isPlaying ? ( ) : ( )}
{isPlaying && (
)}

{currentTrack.title}

{currentTrack.artist}

{currentTrack.duration}
)} {/* Up Next */}

Up Next

Autoplay
{queue.length === 0 ? (

Queue is empty. Add tracks to keep the vibe going.

{autoplay && (

Autoplay is on. We'll pick a song for you.

)}
) : ( queue.map((track, i) => (
handleDragStart(e, i)} onDragOver={(e) => handleDragOver(e, i)} onDragEnd={() => setDraggedIndex(null)} className={`flex items-center gap-4 p-4 bg-kodo-ink rounded-lg border border-transparent hover:border-border transition-all group ${draggedIndex === i ? 'opacity-50 border-primary' : ''}`} >
playTrack(track)} >
{track.title}
{track.artist}
{track.duration}
)) )}
{showSaveModal && ( setShowSaveModal(false)} onSave={handleSavePlaylist} /> )}
); };