import { Play, Pause, Heart, Music } from "lucide-react"; import Image from "next/image"; import { cn } from "@/utils/cn"; import { DiscoverTrack } from "../types"; import { api } from "@/lib/api"; const tierColors: Record = { high: "text-green-400", medium: "text-yellow-400", explore: "text-orange-400", wildcard: "text-purple-400", low: "text-orange-400", wild: "text-purple-400", }; const tierLabels: Record = { high: "High Match", medium: "Medium Match", explore: "Explore", wildcard: "Wild Card", low: "Explore", wild: "Wild Card", }; interface TrackListProps { tracks: DiscoverTrack[]; currentTrack?: { id: string } | null; isPlaying: boolean; onPlayTrack: (index: number) => void; onTogglePlay: () => void; onLike: (track: DiscoverTrack) => void; } export function TrackList({ tracks, currentTrack, isPlaying, onPlayTrack, onTogglePlay, onLike, }: TrackListProps) { const formatDuration = (seconds: number) => { // Defensive handling for invalid/missing duration if (!seconds || isNaN(seconds) || seconds < 0) { return "--:--"; } const mins = Math.floor(seconds / 60); const secs = seconds % 60; return `${mins}:${secs.toString().padStart(2, "0")}`; }; return (
{/* Table Header */}
# Title Album Match Duration
{/* Track Rows */}
{tracks.map((track, index) => { const isTrackPlaying = currentTrack?.id === track.id; return (
isTrackPlaying && isPlaying ? onTogglePlay() : onPlayTrack(index) } className={cn( "grid grid-cols-[40px_1fr_auto] md:grid-cols-[40px_minmax(200px,4fr)_minmax(100px,2fr)_80px_80px] gap-4 px-4 py-2 rounded-md hover:bg-white/5 transition-colors group cursor-pointer", isTrackPlaying && "bg-white/10" )} > {/* Track Number / Play Icon */}
{isTrackPlaying && isPlaying ? ( ) : ( index + 1 )}
{/* Title + Artist */}
{track.coverUrl ? ( {track.album} ) : (
)}

{track.title}

{track.artist}

{/* Album (hidden on mobile) */}

{track.album}

{/* Tier Badge (hidden on mobile) */}
{tierLabels[track.tier]?.split(" ")[0]}
{/* Duration + Like */}
{formatDuration(track.duration)}
); })}
); }