'use client'; import { useState } from 'react'; import { Loader2, CheckCircle, AlertCircle } from 'lucide-react'; import { useTranslations } from 'next-intl'; import { isValidUnsubscribeUrl } from '@/lib/validation'; interface UnsubscribeBannerProps { listUnsubscribe: { http?: string; mailto?: string; preferred?: 'http' | 'mailto'; }; senderEmail: string; onDismiss: () => void; } export function UnsubscribeBanner({ listUnsubscribe, senderEmail: _senderEmail, onDismiss }: UnsubscribeBannerProps) { const t = useTranslations(); const [showConfirm, setShowConfirm] = useState(false); const [processing, setProcessing] = useState(false); const [success, setSuccess] = useState(false); const [error, setError] = useState(false); const unsubMethod = listUnsubscribe.preferred; const unsubUrl = unsubMethod === 'http' ? listUnsubscribe.http : listUnsubscribe.mailto; if (!unsubUrl || !unsubMethod) { return null; } const handleUnsubscribe = async () => { if (!isValidUnsubscribeUrl(unsubUrl)) { setError(true); setProcessing(false); return; } setProcessing(true); try { if (unsubMethod === 'http') { window.open(unsubUrl, '_blank', 'noopener,noreferrer'); setSuccess(true); setProcessing(false); setTimeout(onDismiss, 3000); } else { const link = document.createElement('a'); link.href = unsubUrl; link.style.display = 'none'; document.body.appendChild(link); link.click(); document.body.removeChild(link); setSuccess(true); setProcessing(false); setTimeout(onDismiss, 3000); } } catch (err) { console.error('Unsubscribe error:', err); setError(true); setProcessing(false); } }; if (success) { return (
{t(unsubMethod === 'http' ? 'email_viewer.unsubscribe_banner.success_http' : 'email_viewer.unsubscribe_banner.success_mailto' )}
); } if (error) { return (
{t('email_viewer.unsubscribe_banner.error')}
); } return (
{showConfirm ? ( <> {t('email_viewer.unsubscribe_banner.confirm_title')} ) : ( )}
); }