'use client'; import { useState, useEffect } from 'react'; import { useParams, useRouter } from 'next/navigation'; import { motion } from 'framer-motion'; import { FaPlay, FaShoppingCart, FaArrowLeft, FaClock, FaMusic } from 'react-icons/fa'; import { Album, Purchase } from '@/lib/types'; import { useCart } from '@/lib/CartContext'; import { useAlbums } from '@/lib/AlbumsContext'; import { formatPrice } from '@/lib/utils'; import Header from '@/components/Header'; import CartSidebar from '@/components/CartSidebar'; import MusicPlayer from '@/components/MusicPlayer'; import PaymentModal from '@/components/PaymentModal'; import PurchaseSuccessModal from '@/components/PurchaseSuccessModal'; export default function AlbumDetailPage() { const params = useParams(); const router = useRouter(); const { addToCart, isInCart } = useCart(); const { albums } = useAlbums(); const [album, setAlbum] = useState(null); const [purchasedAlbums, setPurchasedAlbums] = useState([]); const [purchases, setPurchases] = useState([]); const [cartOpen, setCartOpen] = useState(false); const [currentAlbum, setCurrentAlbum] = useState(null); const [albumToPurchase, setAlbumToPurchase] = useState(null); const [showSuccessModal, setShowSuccessModal] = useState(false); const [latestPurchase, setLatestPurchase] = useState(null); useEffect(() => { const foundAlbum = albums.find((a) => a.id === params.id); setAlbum(foundAlbum || null); // Load purchases from localStorage (legacy) const savedPurchases = localStorage.getItem('purchases'); if (savedPurchases) { const parsedPurchases = JSON.parse(savedPurchases); setPurchases(parsedPurchases); } // Fetch approved purchases from API const fetchPurchases = async () => { try { const response = await fetch('/api/purchases'); if (response.ok) { const apiPurchases = await response.json(); // Only include approved purchases for determining access const approvedPurchases = apiPurchases.filter((p: Purchase) => p.approvalStatus === 'approved'); setPurchasedAlbums(approvedPurchases.map((p: Purchase) => p.albumId)); } } catch (error) { console.error('Error fetching purchases:', error); } }; fetchPurchases(); }, [params.id, albums]); const handlePurchaseSuccess = (albumId: string, transactionId: string) => { const purchase: Purchase = { albumId, transactionId, purchaseDate: new Date(), approvalStatus: 'pending', }; const updatedPurchases = [...purchases, purchase]; setPurchases(updatedPurchases); // Don't add to purchasedAlbums yet - wait for approval setLatestPurchase(purchase); localStorage.setItem('purchases', JSON.stringify(updatedPurchases)); setAlbumToPurchase(null); setShowSuccessModal(true); }; const handleCloseSuccessModal = () => { setShowSuccessModal(false); if (albumToPurchase) { setCurrentAlbum(albumToPurchase); } }; const handleAddToCart = () => { if (album && !isInCart(album.id)) { addToCart(album); } }; const isPurchased = album ? purchasedAlbums.includes(album.id) : false; const inCart = album ? isInCart(album.id) : false; if (!album) { return (

Album not found

); } const totalDuration = album.songs.reduce((total, song) => { const [minutes, seconds] = song.duration.split(':').map(Number); return total + minutes * 60 + seconds; }, 0); const formatTotalDuration = (seconds: number) => { const hours = Math.floor(seconds / 3600); const mins = Math.floor((seconds % 3600) / 60); if (hours > 0) { return `${hours}h ${mins}m`; } return `${mins} min`; }; return ( <>
setCartOpen(true)} />
{/* Back Button */}
{/* Album Header */}
{/* Album Cover */}
{album.coverImage ? ( {album.title} ) : (
{album.title}
)}
{isPurchased && (
Owned
)}
{/* Album Info */}

{album.year} • {album.genre}

{album.title}

{album.description}

{/* Album Stats */}
{album.songs.length} tracks
{formatTotalDuration(totalDuration)}
{/* Price */} {!isPurchased && (
{formatPrice(album.price)}
)} {/* Action Buttons */}
{!isPurchased && ( <> )}
{/* Track List */}

Track List

{album.songs.map((song, index) => ( setCurrentAlbum(album)} >
{String(index + 1).padStart(2, '0')}

{song.title}

{!isPurchased && ( Preview )} {song.duration}
))}
{/* Music Player */} {currentAlbum && ( setCurrentAlbum(null)} onPurchase={setAlbumToPurchase} /> )} {/* Payment Modal */} setAlbumToPurchase(null)} onSuccess={handlePurchaseSuccess} /> {/* Purchase Success Modal */} {/* Cart Sidebar */} setCartOpen(false)} /> ); }