'use client'; import { useState } from 'react'; import { motion, AnimatePresence } from 'framer-motion'; import { FaTimes, FaCreditCard, FaLock } from 'react-icons/fa'; import { Album } from '@/lib/types'; import { formatPrice } from '@/lib/utils'; interface PaymentModalProps { album: Album | null; onClose: () => void; onSuccess: (albumId: string, transactionId: string) => void; } export default function PaymentModal({ album, onClose, onSuccess }: PaymentModalProps) { const [cardNumber, setCardNumber] = useState(''); const [cardName, setCardName] = useState(''); const [phoneNumber, setPhoneNumber] = useState(''); const [email, setEmail] = useState(''); const [txReceipt, setTxReceipt] = useState(''); const [processing, setProcessing] = useState(false); const [error, setError] = useState(''); const formatCardNumber = (value: string) => { const numbers = value.replace(/\s/g, ''); const groups = numbers.match(/.{1,4}/g); return groups ? groups.join(' ') : numbers; }; const formatPhoneNumber = (value: string) => { const numbers = value.replace(/\D/g, ''); if (numbers.length <= 3) return numbers; if (numbers.length <= 6) return `(${numbers.slice(0, 3)}) ${numbers.slice(3)}`; return `(${numbers.slice(0, 3)}) ${numbers.slice(3, 6)}-${numbers.slice(6, 10)}`; }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(''); // Basic validation if (cardNumber.replace(/\s/g, '').length !== 16) { setError('Invalid card number'); return; } if (!cardName.trim()) { setError('Name is required'); return; } if (phoneNumber.replace(/\D/g, '').length < 10) { setError('Invalid phone number'); return; } const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; if (!emailRegex.test(email)) { setError('Invalid email address'); return; } if (!txReceipt.trim()) { setError('Transaction receipt is required'); return; } if (!album) return; setProcessing(true); try { // Use the provided transaction receipt as the ID const transactionId = txReceipt.trim() || 'TXN-' + Date.now() + '-' + Math.random().toString(36).substr(2, 9).toUpperCase(); // Create purchase via API const response = await fetch('/api/purchases', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ albumId: album.id, transactionId, customerName: cardName.trim(), email: email.trim(), phoneNumber: phoneNumber, txReceipt: txReceipt.trim(), purchaseDate: new Date().getTime(), }), }); if (!response.ok) { const data = await response.json(); throw new Error(data.error || 'Failed to process purchase'); } setProcessing(false); onSuccess(album.id, transactionId); } catch (err: any) { setProcessing(false); setError(err.message || 'Failed to process payment'); } }; if (!album) return null; return ( {album && ( e.stopPropagation()} className="glass-effect rounded-2xl max-w-md w-full p-8 border-2 border-accent-cyan/30" > {/* Header */}

Purchase Album

{/* Album Info */}

{album.title}

{album.songs.length} tracks • {album.genre}

{formatPrice(album.price)}

{/* Payment Form */}
{/* Card Number */}
{ const formatted = formatCardNumber(e.target.value.replace(/\D/g, '').slice(0, 16)); setCardNumber(formatted); }} placeholder="1234 5678 9012 3456" className="w-full px-4 py-3 bg-white/5 border border-white/10 rounded-lg focus:border-accent-cyan focus:outline-none focus:ring-2 focus:ring-accent-cyan/50 text-white placeholder-gray-500" required />
{/* Card Name */}
setCardName(e.target.value)} placeholder="John Doe" className="w-full px-4 py-3 bg-white/5 border border-white/10 rounded-lg focus:border-accent-cyan focus:outline-none focus:ring-2 focus:ring-accent-cyan/50 text-white placeholder-gray-500" required />
{/* Phone Number */}
{ const formatted = formatPhoneNumber(e.target.value); setPhoneNumber(formatted); }} placeholder="(123) 456-7890" className="w-full px-4 py-3 bg-white/5 border border-white/10 rounded-lg focus:border-accent-cyan focus:outline-none focus:ring-2 focus:ring-accent-cyan/50 text-white placeholder-gray-500" required />
{/* Email */}
setEmail(e.target.value)} placeholder="john@example.com" className="w-full px-4 py-3 bg-white/5 border border-white/10 rounded-lg focus:border-accent-cyan focus:outline-none focus:ring-2 focus:ring-accent-cyan/50 text-white placeholder-gray-500" required />
{/* Transaction Receipt */}
setTxReceipt(e.target.value)} placeholder="TXN-123456789" className="w-full px-4 py-3 bg-white/5 border border-white/10 rounded-lg focus:border-accent-cyan focus:outline-none focus:ring-2 focus:ring-accent-cyan/50 text-white placeholder-gray-500" required />
{/* Error Message */} {error && ( {error} )} {/* Submit Button */} {/* Security Notice */}

This is a demo payment form. No real charges will be made.

)}
); }