import { useEffect, useState } from 'react'; import { useParams, Link } from 'react-router-dom'; import { libraryService } from '../services/library'; import { usePlayer } from '../context/PlayerContext'; import { Play, Shuffle, Heart, Clock, ListPlus, Download } from 'lucide-react'; import { Track } from '../types'; export default function Album() { const { id } = useParams(); const { playTrack, toggleLike, likedTracks, setIsFullScreenOpen, currentTrack } = usePlayer(); const [tracks, setTracks] = useState([]); const [albumInfo, setAlbumInfo] = useState<{ title: string, artist: string, cover?: string, year?: string } | null>(null); const [moreByArtist, setMoreByArtist] = useState([]); const [loading, setLoading] = useState(true); useEffect(() => { if (!id) return; setLoading(true); const fetchAlbum = async () => { const queryId = decodeURIComponent(id); try { const album = await libraryService.getAlbum(queryId); if (album) { setTracks(album.tracks); setAlbumInfo({ title: album.title, artist: album.creator || "Unknown Artist", cover: album.cover_url, year: '2024' }); // Fetch suggestions try { const artistQuery = album.creator || "Unknown Artist"; const suggestions = await libraryService.search(artistQuery); const currentIds = new Set(album.tracks.map(t => t.id)); setMoreByArtist(suggestions.filter(t => !currentIds.has(t.id)).slice(0, 10)); } catch (e) { } } else { // Fallback to searching the query if ID not found anywhere const cleanTitle = queryId.replace(/^search-|^album-/, ''); const results = await libraryService.search(queryId); setTracks(results); setAlbumInfo({ title: cleanTitle, artist: results.length > 0 ? results[0].artist : "Unknown Artist", cover: results.length > 0 ? results[0].cover_url : undefined, year: '2024' }); } } catch (e) { console.error(e); } setLoading(false); }; fetchAlbum(); }, [id]); if (loading) return
; if (!albumInfo) return
Album not found
; const totalDuration = tracks.reduce((acc, t) => acc + (t.duration || 0), 0); const formattedDuration = `${Math.floor(totalDuration / 60)} minutes`; return (
{/* Banner Background */} {albumInfo.cover && (
)}
{/* Cover */}
{ if (tracks.length > 0) { playTrack(tracks[0], tracks); setIsFullScreenOpen(true); } }} > {albumInfo.title}
{/* Info */}
Album

{albumInfo.title}

{albumInfo.artist} {albumInfo.year} {tracks.length} songs, {formattedDuration}
{/* Toolbar */}
{/* Tracklist */}
{/* Header Row */}
# Title
{tracks.map((track, i) => (
playTrack(track, tracks)} > {i + 1}
{track.title}
{track.artist}
{Math.floor((track.duration || 0) / 60)}:{((track.duration || 0) % 60).toString().padStart(2, '0')}
))}
{/* Suggestions / More By Artist */} {moreByArtist.length > 0 && (

More by {albumInfo.artist}

Show discography
{moreByArtist.map((track) => (
{ playTrack(track, moreByArtist); }} >

{track.title}

{track.artist}

))}
)}
); }