'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 } 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 { 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 } = 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 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.map((song, index) => (
handlePlayClick(song)}>
{song.track || index + 1}

{song.title}

{song.artist}

{formatDuration(song.duration)}

))}

); }