"use client"; import { Disc3 } from "lucide-react"; import Link from "next/link"; import Image from "next/image"; import { Album, AlbumSource } from "../types"; import { ReactNode, lazy, Suspense } from "react"; import { useAlbumDisplayData } from "@/hooks/useMetadataDisplay"; // Lazy load MetadataEditor - modal component opened on user action const MetadataEditor = lazy(() => import("@/components/MetadataEditor").then(mod => ({ default: mod.MetadataEditor }))); interface AlbumHeroProps { album: Album; source: AlbumSource; coverUrl: string | null; colors: any; onReload: () => void; children?: ReactNode; } export function AlbumHero({ album, source, coverUrl, colors, onReload, children, }: AlbumHeroProps) { const displayData = useAlbumDisplayData(album); const formatDuration = (seconds?: number) => { if (!seconds) return ""; const hours = Math.floor(seconds / 3600); const mins = Math.floor((seconds % 3600) / 60); if (hours > 0) { return `${hours} hr ${mins} min`; } return `${mins} min`; }; const totalDuration = formatDuration(album.duration); return (
{/* Background Image with VibrantJS gradient */} {coverUrl ? (
{album.title}
{/* Dynamic VibrantJS gradient overlays */}
) : (
)} {/* Compact Hero Content - Full Width */}
{/* Album Cover - Square */}
{coverUrl ? ( {album.title} ) : (
)}
{/* Album Info - Bottom Aligned */}

Album

{displayData.title}

{displayData.hasUserOverrides && ( Edited )} {source === "library" && ( { await onReload(); }} /> )}
{album.artist && ( {album.artist.name} )} {displayData.year && ( <> {displayData.year} )} {album.trackCount && album.trackCount > 0 && ( <> {album.trackCount} songs )} {totalDuration && , {totalDuration}}
{album.genre && ( {album.genre} )}
{/* Action Bar - Full Width */} {children && (
{children}
)}
); }