'use client'; import { useState, useRef, useEffect } from 'react'; import { createPortal } from 'react-dom'; import { useTranslations, useLocale } from 'next-intl'; import { cn } from '@/components/ui/utils'; import { requestBrochureAction } from '@/app/actions/brochure'; import { useAnalytics } from './analytics/useAnalytics'; import { AnalyticsEvents } from './analytics/analytics-events'; interface Props { className?: string; compact?: boolean; } /** * BrochureCTA — Shows a button that opens a modal asking for an email address. * The full-catalog PDF is ONLY revealed after email submission. * No direct download link is exposed anywhere. */ export default function BrochureCTA({ className, compact = false }: Props) { const t = useTranslations('Brochure'); const locale = useLocale(); const { trackEvent } = useAnalytics(); const formRef = useRef(null); const [open, setOpen] = useState(false); const [mounted, setMounted] = useState(false); const [phase, setPhase] = useState<'form' | 'loading' | 'success' | 'error'>('form'); const [err, setErr] = useState(''); useEffect(() => { setMounted(true); }, []); function openModal() { setOpen(true); } function closeModal() { setOpen(false); setPhase('form'); setErr(''); } useEffect(() => { if (!open) return; const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape') closeModal(); }; document.addEventListener('keydown', onKey); document.body.style.overflow = 'hidden'; return () => { document.removeEventListener('keydown', onKey); document.body.style.overflow = ''; }; }, [open]); async function handleSubmit(e: React.FormEvent) { e.preventDefault(); if (!formRef.current) return; setPhase('loading'); const fd = new FormData(formRef.current); fd.set('locale', locale); try { const res = await requestBrochureAction(fd); if (res.success) { setPhase('success'); trackEvent(AnalyticsEvents.DOWNLOAD, { file_name: `klz-product-catalog-${locale}.pdf`, file_type: 'brochure', location: 'brochure_modal', }); } else { setErr(res.error || 'Error'); setPhase('error'); } } catch { setErr('Network error'); setPhase('error'); } } // ── Trigger Button ───────────────────────────────────────────────── const trigger = (
); // ── Modal ────────────────────────────────────────────────────────── const modal = mounted && open ? createPortal(
{/* Backdrop */}
{/* Panel */}
{/* Green top bar */}
{/* Close */}
{/* Header */}

{t('title')}

{t('subtitle')}

{phase === 'success' ? (

{locale === 'de' ? 'Erfolgreich gesendet' : 'Successfully sent'}

{locale === 'de' ? 'Bitte prüfen Sie Ihren Posteingang.' : 'Please check your inbox.'}

) : (
{phase === 'error' && err && (

{err}

)}

{t('privacyNote')}

)}
, document.body, ) : null; return ( <> {trigger} {modal} ); }