import { Play, Pause, ThumbsDown, Disc3, Sparkles } from 'lucide-react'; import { Link, useRouter } from '@tanstack/react-router'; import type { Track } from '../types'; import { usePlaybackStore } from '../store/usePlaybackStore'; import { useDislikeTrack } from '../hooks/useDislikeTrack'; import { startVibeSession } from '../services/vibeSession'; import { Artwork } from './Artwork'; import { ArtistLinks } from './ArtistLinks'; export function formatDuration(seconds?: number | null): string { if (!seconds || seconds < 0 || !Number.isFinite(seconds)) return '0:00'; const total = Math.floor(seconds); return `${Math.floor(total / 60)}:${(total % 60).toString().padStart(2, '0')}`; } type TrackRowVariant = 'default' | 'compact'; interface TrackRowProps { track: Track; queue: Track[]; index: number; showActions?: boolean; /** compact — smaller artwork, no duration, for queue panels / VibeTimeline */ variant?: TrackRowVariant; /** Show a "Vibe by track" button that starts a vibe session seeded from this track. */ showVibe?: boolean; /** Override ordinary queue playback, for contextual actions such as Vibe seed rows. */ onSelect?: (track: Track) => void; /** Display-only rows keep their surrounding playback controller authoritative. */ playable?: boolean; } export function TrackRow({ track, queue, showActions = true, variant = 'default', showVibe = false, onSelect, playable = true }: TrackRowProps) { const { setQueue, playTrack, play, pause, currentTrack, isPlaying } = usePlaybackStore(); const dislikeTrack = useDislikeTrack(); const router = useRouter(); const isCurrent = currentTrack?.id === track.id; const compact = variant === 'compact'; const handlePlay = () => { if (!playable) return; if (onSelect) { onSelect(track); return; } if (isCurrent) { isPlaying ? pause() : play(); return; } // Queue the whole list and start at this track, so Previous can walk back // into the tracks before it. setQueue(queue); playTrack(track); }; const playLabel = !playable ? `${track.title || 'Track'} is queued by Vibe` : isCurrent && isPlaying ? `Pause ${track.title || 'track'}` : `Play ${track.title || 'track'}`; const handleDislike = (e: React.MouseEvent) => { e.stopPropagation(); dislikeTrack(track.id); }; const handleVibe = (e: React.MouseEvent) => { e.stopPropagation(); // Start and hydrate the V2 plan before showing the Vibe page. startVibeSession(track).then(() => { router.navigate({ to: '/vibe' }); }).catch(() => { // Session failed — still navigate so the user can try manually. router.navigate({ to: '/vibe' }); }); }; return (