"use client"; import { useState } from "react"; import { useTranslations } from "next-intl"; import { motion } from "framer-motion"; import { X, Sparkles, ArrowRight, Check, Loader2 } from "lucide-react"; import { useAnalytics } from "@/lib/analytics"; interface EmailCapturePopupProps { isOpen: boolean; onClose: () => void; onSubscribe?: () => void; trigger: "scroll" | "exit"; locale: string; country: string; countryCode: string; } function getUtmParams() { if (typeof window === "undefined") return {}; const params = new URLSearchParams(window.location.search); return { utmSource: params.get("utm_source") || "", utmMedium: params.get("utm_medium") || "", utmCampaign: params.get("utm_campaign") || "", utmContent: params.get("utm_content") || "", fbclid: params.get("fbclid") || "", }; } function getDeviceInfo() { if (typeof window === "undefined") return { deviceName: "", deviceOS: "", userAgent: "" }; const userAgent = navigator.userAgent; let deviceName = "Unknown"; let deviceOS = "Unknown"; if (userAgent.match(/Windows/i)) deviceOS = "Windows"; else if (userAgent.match(/Mac/i)) deviceOS = "MacOS"; else if (userAgent.match(/Linux/i)) deviceOS = "Linux"; else if (userAgent.match(/Android/i)) deviceOS = "Android"; else if (userAgent.match(/iPhone|iPad|iPod/i)) deviceOS = "iOS"; if (userAgent.match(/Mobile/i)) deviceName = "Mobile"; else if (userAgent.match(/Tablet/i)) deviceName = "Tablet"; else deviceName = "Desktop"; return { deviceName, deviceOS, userAgent }; } export default function EmailCapturePopup({ isOpen, onClose, onSubscribe, trigger, locale, country, countryCode, }: EmailCapturePopupProps) { const t = useTranslations("Popup"); const { trackPopupSubmit, trackPopupCtaClick } = useAnalytics(); const [firstName, setFirstName] = useState(""); const [email, setEmail] = useState(""); const [isSubmitting, setIsSubmitting] = useState(false); const [status, setStatus] = useState<"idle" | "success" | "alreadySubscribed" | "error">("idle"); const [pageLoadTime] = useState(() => Date.now()); const handleCTAClick = () => { trackPopupCtaClick({ locale }); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!email || !email.includes("@")) return; setIsSubmitting(true); trackPopupSubmit({ trigger, locale, country: countryCode }); const timeOnPage = Math.floor((Date.now() - pageLoadTime) / 1000); const utmParams = getUtmParams(); const deviceInfo = getDeviceInfo(); try { const response = await fetch("/api/email-capture", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ firstName: firstName.trim(), email, locale, country, countryCode, source: "popup", trigger, timeOnPage, referrer: document.referrer || "", pageUrl: window.location.href, pageLanguage: navigator.language || "", preferredLocale: locale, ...deviceInfo, ...utmParams, }), }); if (response.ok) { const data = await response.json(); if (data.alreadySubscribed) { setStatus("alreadySubscribed"); } else { setStatus("success"); } onSubscribe?.(); } else { setStatus("error"); } } catch (error) { setStatus("error"); } finally { setIsSubmitting(false); } }; if (!isOpen) return null; return (
{status === "idle" && (
{t("badge")}

{t("title")}

{t("subtitle")}

{t.raw("bullets").map((bullet: string, index: number) => (

{bullet}

))}
setFirstName(e.target.value)} placeholder={t("firstNamePlaceholder")} className="w-full px-4 py-4 bg-gray-50 border border-gray-200 rounded-xl focus:outline-none focus:ring-2 focus:ring-[#c9a962]/50 focus:border-[#c9a962] transition-all text-gray-900 placeholder:text-gray-400" />
setEmail(e.target.value)} placeholder={t("emailPlaceholder")} className="w-full px-4 py-4 bg-gray-50 border border-gray-200 rounded-xl focus:outline-none focus:ring-2 focus:ring-[#c9a962]/50 focus:border-[#c9a962] transition-all text-gray-900 placeholder:text-gray-400" required />

{t("privacyNote")}

)} {status === "success" && (

{t("successTitle")}

{t("successMessage")}

)} {status === "alreadySubscribed" && (

{t("alreadySubscribedTitle")}

{t("alreadySubscribed")}

)} {status === "error" && (

{t("errorTitle")}

{t("errorMessage")}

)}
); }