import React, { useState } from 'react'; import { Button } from '../../ui/button'; import { Play, Shuffle, Heart, MoreHorizontal, Clock, Edit3, } from 'lucide-react'; import { Playlist, Track } from '../../../types'; import { useToast } from '../../../components/feedback/ToastProvider'; import { useAudio } from '../../../context/AudioContext'; import { EditPlaylistModal } from './EditPlaylistModal'; interface PlaylistDetailViewProps { playlistId: string; onBack: () => void; } // Mock Data Fetcher const getPlaylistById = (id: string): any => ({ id, title: 'Cyberpunk 2077 Vibes', creator: 'Cyber_Producer', userId: 'u1', track_count: 12, likes: 1240, cover_url: 'https://picsum.photos/id/55/600/600', tags: ['Synthwave', 'Dark'], description: 'High octane sounds for the street samurai. A mix of heavy bass, retro synths, and futuristic atmosphere.', is_public: true, isCollaborative: false, duration: '45 min', followers: 850, tracks: Array.from({ length: 12 }).map((_, i) => ({ id: `t${i}`, title: `Neon Track ${i + 1}`, artist: 'Various Artists', album: 'Compilation', cover_url: `https://picsum.photos/id/${60 + i}/200/200`, duration: '3:45', durationSec: 225, plays: 1000 + i * 100, likes: 50 + i, })), }); export const PlaylistDetailView: React.FC = ({ playlistId, onBack, }) => { const { addToast } = useToast(); const { playTrack } = useAudio(); const [playlist, setPlaylist] = useState(getPlaylistById(playlistId)); const [isEditing, setIsEditing] = useState(false); const [tracks, setTracks] = useState(playlist.tracks || []); const [draggedIndex, setDraggedIndex] = useState(null); const handleUpdate = (data: Partial) => { setPlaylist((prev: any) => ({ ...prev, ...data })); addToast('Playlist updated', 'success'); }; const handleDelete = () => { addToast('Playlist deleted', 'info'); onBack(); }; // Drag and Drop Logic const handleDragStart = (e: React.DragEvent, index: number) => { setDraggedIndex(index); e.dataTransfer.effectAllowed = 'move'; 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; const newTracks = [...tracks]; const [removed] = newTracks.splice(draggedIndex, 1); newTracks.splice(index, 0, removed); setTracks(newTracks); setDraggedIndex(index); }; return (
{/* Header Section */}
setIsEditing(true)} >
{playlist.is_public ? 'Public Playlist' : 'Private Playlist'} {/* {playlist.isCollaborative && Collaborative} */}

{playlist.title}

{playlist.description}

{playlist.creator}
{playlist.likes} likes {tracks.length} songs, {playlist.duration}
{/* Tracks List */}
#
Title
Album
Date Added
{tracks.map((track, i) => (
handleDragStart(e, i)} onDragOver={(e) => handleDragOver(e, i)} onDragEnd={() => setDraggedIndex(null)} className={`grid grid-cols-[auto_1fr_auto_auto_auto] gap-4 items-center p-2 rounded-lg hover:bg-white/5 group transition-colors ${draggedIndex === i ? 'bg-kodo-cyan/10' : ''}`} >
{i + 1} playTrack(track, tracks)} />
{track.title}
{track.artist}
{track.album}
2 days ago
{track.duration}
))}
{isEditing && ( setIsEditing(false)} onSave={handleUpdate} onDelete={handleDelete} /> )}
); };