'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 BrochureModalProps { isOpen: boolean; onClose: () => void; } export default function BrochureModal({ isOpen, onClose }: BrochureModalProps) { const t = useTranslations('Brochure'); const locale = useLocale(); const { trackEvent } = useAnalytics(); const formRef = useRef(null); const [state, setState] = useState<'idle' | 'submitting' | 'success' | 'error'>('idle'); const [errorMsg, setErrorMsg] = useState(''); // Close on escape + lock scroll useEffect(() => { const handleEsc = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose(); }; if (isOpen) { document.addEventListener('keydown', handleEsc); document.body.style.overflow = 'hidden'; } else { document.body.style.overflow = ''; } return () => { document.removeEventListener('keydown', handleEsc); document.body.style.overflow = ''; }; }, [isOpen, onClose]); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!formRef.current) return; setState('submitting'); setErrorMsg(''); try { const formData = new FormData(formRef.current); formData.set('locale', locale); const result = await requestBrochureAction(formData); if (result.success) { setState('success'); trackEvent(AnalyticsEvents.DOWNLOAD, { file_name: `klz-product-catalog-${locale}.pdf`, file_type: 'brochure', location: 'brochure_modal', }); } else { setState('error'); setErrorMsg(result.error || 'Something went wrong'); } } catch { setState('error'); setErrorMsg('Network error'); } }; const handleClose = () => { setState('idle'); setErrorMsg(''); onClose(); }; if (!isOpen) return null; const modal = (
{/* Backdrop */}