"use client"; import { use, useState } from "react"; import { useRouter } from "next/navigation"; import { useAudio } from "@/lib/audio-context"; import { LoadingScreen } from "@/components/ui/LoadingScreen"; import { useImageColor, getPlayButtonStyles } from "@/hooks/useImageColor"; import { api } from "@/lib/api"; import { PlaylistSelector } from "@/components/ui/PlaylistSelector"; import { useDownloadContext } from "@/lib/download-context"; // Custom hooks import { useAlbumData } from "@/features/album/hooks/useAlbumData"; import { useAlbumActions } from "@/features/album/hooks/useAlbumActions"; import { useTrackPreview } from "@/features/album/hooks/useTrackPreview"; // Components import { AlbumHero } from "@/features/album/components/AlbumHero"; import { AlbumActionBar } from "@/features/album/components/AlbumActionBar"; import { TrackList } from "@/features/album/components/TrackList"; import { SimilarAlbums } from "@/features/album/components/SimilarAlbums"; interface AlbumPageProps { params: Promise<{ id: string; }>; } export default function AlbumPage({ params }: AlbumPageProps) { const { id } = use(params); const router = useRouter(); const { currentTrack, isPlaying, pause } = useAudio(); // State const [showPlaylistSelector, setShowPlaylistSelector] = useState(false); const [pendingTrackIds, setPendingTrackIds] = useState([]); const [isBulkAdd, setIsBulkAdd] = useState(false); const [isAddingToPlaylist, setIsAddingToPlaylist] = useState(false); // Custom hooks const { album, source, loading, reloadAlbum } = useAlbumData(id); const { playAlbum, shufflePlay, addToQueue, downloadAlbum } = useAlbumActions(); const { isPendingByMbid } = useDownloadContext(); const { previewTrack, previewPlaying, handlePreview } = useTrackPreview(); // Get cover URL for display and color extraction // Proxy through API to handle native: URLs and CORS const rawCoverUrl = album?.coverUrl || album?.coverArt || "/placeholder-album.png"; const coverUrl = rawCoverUrl === "/placeholder-album.png" ? rawCoverUrl : api.getCoverArtUrl(rawCoverUrl, 1200); // Extract colors const { colors } = useImageColor(coverUrl); // Loading and error states if (loading) { return ; } if (!album) { return (

Error Loading Album

Album not found

); } // Event handlers const handlePlayTrack = (track: any, index: number) => { playAlbum(album, index); }; const openPlaylistSelector = (trackIds: string[], bulk = false) => { if (!trackIds.length) return; setPendingTrackIds(trackIds); setIsBulkAdd(bulk); setShowPlaylistSelector(true); }; const handleAddAlbumToPlaylist = () => { if (!album?.tracks?.length) return; const trackIds = album.tracks .map((track: any) => track.id) .filter(Boolean); openPlaylistSelector(trackIds, true); }; const handleAddToPlaylist = (trackId: string) => { openPlaylistSelector([trackId]); }; const handlePlaylistSelected = async (playlistId: string) => { if (!pendingTrackIds.length) return; try { setIsAddingToPlaylist(true); for (const trackId of pendingTrackIds) { await api.addTrackToPlaylist(playlistId, trackId); } setPendingTrackIds([]); setIsBulkAdd(false); setShowPlaylistSelector(false); } catch (error) { console.error("Failed to add track(s) to playlist:", error); } finally { setIsAddingToPlaylist(false); } }; return (
playAlbum(album, 0)} onShuffle={() => shufflePlay(album)} onDownloadAlbum={() => downloadAlbum(album)} onAddToPlaylist={handleAddAlbumToPlaylist} isPendingDownload={isPendingByMbid( album?.mbid || album?.rgMbid || "" )} isPlaying={isPlaying} isPlayingThisAlbum={currentTrack?.album?.id === album.id} onPause={pause} /> {/* Main Content - fills remaining viewport height */}
{/* Dynamic color gradient */}
{/* Texture overlay */}
{album.tracks && album.tracks.length > 0 && ( addToQueue(track, album) } onAddToPlaylist={handleAddToPlaylist} previewTrack={previewTrack} previewPlaying={previewPlaying} onPreview={(track: any, e: React.MouseEvent) => handlePreview( track, album.artist?.name || "", e ) } /> )} {album.similarAlbums && album.similarAlbums.length > 0 && ( router.push(`/album/${id}`)} /> )}
{ setShowPlaylistSelector(false); setPendingTrackIds([]); setIsBulkAdd(false); }} onSelectPlaylist={handlePlaylistSelected} />
); }