'use client' import React, { useState, useCallback } from 'react' import type { FDNewsletterBlock as FDNewsletterBlockProps } from '@/payload-types' // Navy is always dark. White/gray adapt to OS dark mode. const bgClasses: Record = { white: 'bg-white dark:bg-fd-navy', navy: 'bg-fd-navy', gray: 'bg-fd-surface-alt dark:bg-fd-navy', yellow: 'bg-fd-yellow', } export const FDNewsletterBlockComponent: React.FC = ({ heading = 'Håll dig uppdaterad', description, submitEndpoint, buttonText = 'Prenumerera', successMessage = 'Tack! Du är nu prenumerant.', consentText, privacyPolicyLink = '/integritetspolicy', collectName = false, collectCompany = false, layout = 'inline', sectionBackground = 'navy', textColor = 'auto', }) => { const [email, setEmail] = useState('') const [name, setName] = useState('') const [company, setCompany] = useState('') const [consented, setConsented] = useState(false) const [status, setStatus] = useState<'idle' | 'loading' | 'success' | 'error'>('idle') const [errorMsg, setErrorMsg] = useState('') const isDark = sectionBackground === 'navy' const headingColor = textColor === 'white' ? 'text-white' : textColor === 'navy' ? 'text-fd-navy' : isDark ? 'text-fd-yellow' : 'text-fd-navy dark:text-fd-yellow' const bodyColor = textColor === 'white' ? 'text-white' : textColor === 'navy' ? 'text-fd-navy' : isDark ? 'text-white' : 'text-fd-navy dark:text-white' const bgClass = bgClasses[sectionBackground ?? 'navy'] || 'bg-fd-navy' const inputClass = 'w-full px-5 py-3 rounded-full text-fd-navy font-joey text-fd-body focus:outline-none focus:ring-2 focus:ring-fd-yellow bg-white border border-gray-200' const handleSubmit = useCallback( async (e: React.FormEvent) => { e.preventDefault() if (!email || !consented) return setStatus('loading') setErrorMsg('') try { const payload: Record = { email } if (collectName && name) payload.name = name if (collectCompany && company) payload.company = company const response = await fetch(submitEndpoint || '/api/newsletter', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload), }) if (!response.ok) throw new Error(`HTTP ${response.status}`) setStatus('success') setEmail('') setName('') setCompany('') setConsented(false) } catch (err) { setStatus('error') setErrorMsg('Något gick fel. Försök igen senare.') } }, [email, name, company, consented, submitEndpoint, collectName, collectCompany], ) if (status === 'success') { return (

{successMessage}

) } const isCard = layout === 'card' const isInline = layout === 'inline' return (
{isCard ? (
{heading && (

{heading}

)} {description && (

{description}

)}
{collectName && ( setName(e.target.value)} className={`${inputClass} mb-3`} /> )} {collectCompany && ( setCompany(e.target.value)} className={`${inputClass} mb-3`} /> )} setEmail(e.target.value)} className={`${inputClass} mb-4`} /> {status === 'error' && (

{errorMsg}

)}
) : ( <>
{heading && (

{heading}

)} {description && (

{description}

)}
{collectName && ( setName(e.target.value)} className={`${inputClass} mb-3`} /> )} {collectCompany && ( setCompany(e.target.value)} className={`${inputClass} mb-3`} /> )} {isInline ? (
setEmail(e.target.value)} className={`${inputClass} flex-1`} />
) : ( <> setEmail(e.target.value)} className={`${inputClass} mb-4`} /> )}
{status === 'error' && (

{errorMsg}

)}
)}
) } interface ConsentCheckboxProps { consented: boolean setConsented: (v: boolean) => void consentText?: string | null privacyPolicyLink?: string | null isDark: boolean bodyColor: string } const ConsentCheckbox: React.FC = ({ consented, setConsented, consentText, privacyPolicyLink, isDark, bodyColor, }) => ( )