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 '../../../context/ToastContext'; 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-3 bg-kodo-ink rounded-lg border border-transparent hover:border-kodo-steel transition-all group ${draggedIndex === i ? 'opacity-50 border-kodo-cyan' : ''}`} >
playTrack(track)}>
{track.title}
{track.artist}
{track.duration}
)) )}
{showSaveModal && ( setShowSaveModal(false)} onSave={handleSavePlaylist} /> )}
); };