"use client"; import Link from 'next/link'; import Image from 'next/image'; import { usePlayer } from "@/context/PlayerContext"; import { Play, Pause, Clock, Heart, MoreHorizontal, Plus } from "lucide-react"; import { useEffect, useState, Suspense } from "react"; import { useSearchParams } from "next/navigation"; import AddToPlaylistModal from "@/components/AddToPlaylistModal"; import { dbService } from "@/services/db"; import { libraryService } from "@/services/library"; interface Track { title: string; artist: string; album: string; cover_url: string; id: string; url?: string; duration?: number; } interface PlaylistData { title: string; description: string; author: string; cover_url: string; tracks: Track[]; } function PlaylistContent() { const searchParams = useSearchParams(); const id = searchParams.get('id'); const [playlist, setPlaylist] = useState(null); const [isLoading, setIsLoading] = useState(true); const { playTrack, currentTrack, isPlaying, likedTracks, toggleLike } = usePlayer(); // Modal State const [isAddToPlaylistOpen, setIsAddToPlaylistOpen] = useState(false); const [trackToAdd, setTrackToAdd] = useState(null); const [isDescriptionExpanded, setIsDescriptionExpanded] = useState(false); useEffect(() => { const fetchPlaylist = async () => { setIsLoading(true); try { if (!id) return; if (id === 'trending') { const browse = await libraryService.getBrowseContent(); // Assumption: Trending exists or use first available const trending = browse['Trending']?.[0] || browse['Top Lists']?.[0]; if (trending) { setPlaylist({ ...trending, author: "Audiophile", }); } } else { // Try DB (User Playlist) const dbPlaylist = await dbService.getPlaylist(id); if (dbPlaylist) { setPlaylist({ title: dbPlaylist.title, description: `Created on ${new Date(dbPlaylist.createdAt).toLocaleDateString()}`, author: "You", cover_url: dbPlaylist.cover_url || "https://placehold.co/300?text=Playlist", tracks: dbPlaylist.tracks }); setIsLoading(false); return; } // Try Library (Static Playlist) const libPlaylist = await libraryService.getPlaylist(id); if (libPlaylist) { setPlaylist({ ...libPlaylist, author: "System" }); setIsLoading(false); return; } throw new Error("Playlist not found"); } } catch (error) { console.error("Failed to fetch playlist:", error); } finally { setIsLoading(false); } }; if (id) fetchPlaylist(); }, [id]); const handlePlay = (track: Track) => { if (playlist) { playTrack(track, playlist.tracks); } else { playTrack(track); } }; const handlePlayAll = () => { if (playlist && playlist.tracks.length > 0) { playTrack(playlist.tracks[0], playlist.tracks); } }; const formatDuration = (seconds?: number) => { if (!seconds) return "-:--"; const mins = Math.floor(seconds / 60); const secs = Math.floor(seconds % 60); return `${mins}:${secs.toString().padStart(2, '0')}`; }; const openAddToPlaylist = (e: React.MouseEvent, track: Track) => { e.stopPropagation(); setTrackToAdd(track); setIsAddToPlaylistOpen(true); }; if (isLoading) return
Loading playlist...
; if (!playlist) return
Playlist not found.
; return (
{/* Header */}
{playlist.title}
Playlist

{playlist.title}

{/* Expandable Description */}

setIsDescriptionExpanded(!isDescriptionExpanded)} > {playlist.description}

{playlist.description && playlist.description.length > 100 && ( )}
{playlist.author || "User"} {playlist.tracks.length} songs
{/* Controls */}
{/* ... (controls remain similar) ... */}
{/* List */}
{/* Header Row */}
# Title Album
{playlist.tracks.filter(t => t.id).map((track, i) => { const isCurrent = currentTrack?.id === track.id; const isLiked = likedTracks.has(track.id); return (
handlePlay(track)} className={`grid grid-cols-[auto_1fr_auto] md:grid-cols-[16px_4fr_3fr_minmax(120px,1fr)] gap-4 px-2 md:px-4 py-3 rounded-md hover:bg-[#ffffff1a] group cursor-pointer transition items-center text-sm text-spotify-text-muted hover:text-white ${isCurrent ? 'bg-[#ffffff1a]' : ''}`} > {isCurrent && isPlaying ? ( playing ) : ( {i + 1} )}
{track.title}
{/* Changed from truncate to line-clamp-2 for readability */} {track.title} {track.artist}
{track.album}
{formatDuration(track.duration)}
); })}
setIsAddToPlaylistOpen(false)} />
); } export default function PlaylistPage() { return ( Loading...}> ); }