'use client'; import { useEffect, useState } from 'react'; import { useParams } from 'next/navigation'; import Image from 'next/image'; import { Album, Song } from '@/lib/navidrome'; import { useNavidrome } from '@/app/components/NavidromeContext'; import { Play, Heart, Clock, User, Plus } from 'lucide-react'; import { Button } from '@/components/ui/button'; import Link from 'next/link'; import { PlusIcon } from "@radix-ui/react-icons"; import { useAudioPlayer } from '@/app/components/AudioPlayerContext' import Loading from "@/app/components/loading"; import { Separator } from '@/components/ui/separator'; import { ScrollArea } from '@/components/ui/scroll-area'; import { getNavidromeAPI } from '@/lib/navidrome'; export default function AlbumPage() { const { id } = useParams(); const [album, setAlbum] = useState(null); const [tracklist, setTracklist] = useState([]); const [loading, setLoading] = useState(true); const [isStarred, setIsStarred] = useState(false); const { getAlbum, starItem, unstarItem } = useNavidrome(); const { playTrack, addAlbumToQueue, playAlbum, playAlbumFromTrack, addToQueue, currentTrack } = useAudioPlayer(); const api = getNavidromeAPI(); useEffect(() => { const fetchAlbum = async () => { setLoading(true); console.log(`Fetching album with id: ${id}`); try { const albumData = await getAlbum(id as string); setAlbum(albumData.album); setTracklist(albumData.songs); setIsStarred(!!albumData.album.starred); console.log(`Album found: ${albumData.album.name}`); } catch (error) { console.error('Failed to fetch album:', error); } setLoading(false); }; if (id) { fetchAlbum(); } }, [id, getAlbum]); const handleStar = async () => { if (!album) return; try { if (isStarred) { await unstarItem(album.id, 'album'); setIsStarred(false); } else { await starItem(album.id, 'album'); setIsStarred(true); } } catch (error) { console.error('Failed to star/unstar album:', error); } }; if (loading) { return ; } if (!album) { return

Album not found

; } const handlePlayClick = async (song: Song): Promise => { if (!album) return; try { await playAlbumFromTrack(album.id, song.id); } catch (error) { console.error('Failed to play album from track:', error); } }; const handleAddToQueue = (song: Song) => { const track = { id: song.id, name: song.title, url: api.getStreamUrl(song.id), artist: song.artist, album: song.album, duration: song.duration, coverArt: song.coverArt ? api.getCoverArtUrl(song.coverArt, 300) : undefined, albumId: song.albumId, artistId: song.artistId }; addToQueue(track); }; const isCurrentlyPlaying = (song: Song): boolean => { return currentTrack?.id === song.id; }; const formatDuration = (duration: number): string => { const minutes = Math.floor(duration / 60); const seconds = duration % 60; return `${minutes}:${seconds.toString().padStart(2, '0')}`; }; // Get cover art URL with proper fallback const coverArtUrl = album.coverArt ? api.getCoverArtUrl(album.coverArt, 300) : '/default-user.jpg'; return ( <>
{album.name}

{album.name}

{album.artist}

{album.songCount} songs • {album.year} • {album.genre}

Duration: {formatDuration(album.duration)}

{tracklist.length === 0 ? (

No tracks available.

) : (
{tracklist.map((song, index) => (
handlePlayClick(song)} > {/* Track Number / Play Indicator */}
{isCurrentlyPlaying(song) ? (
) : ( <> {song.track || index + 1} )}
{/* Song Info */}

{song.title}

{song.artist}
{/* Duration */}
{formatDuration(song.duration)}
{/* Actions */}
))}
)}

); }