'use client' import { Button } from '@thedaviddias/design-system/button' import { Input } from '@thedaviddias/design-system/input' import { Label } from '@thedaviddias/design-system/label' import { AlertCircle, CheckCircle, Loader2 } from 'lucide-react' import { type FormEvent, useId, useState } from 'react' interface EmailSubscriptionFormProps { /** Form title */ title?: string /** Form description */ description?: string /** Compact mode (inline form) */ compact?: boolean /** Custom CSS classes */ className?: string } interface FormData { email: string } /** Email subscription form for newsletter signups */ export function EmailSubscriptionForm({ title = 'Never miss an update from llms.txt hub!', description = 'Join our newsletter for AI documentation insights and best practices.', compact = false, className = '' }: EmailSubscriptionFormProps) { const emailId = useId() const [formData, setFormData] = useState({ email: '' }) const [isSubmitting, setIsSubmitting] = useState(false) const [submitStatus, setSubmitStatus] = useState<'idle' | 'success' | 'error'>('idle') const [errorMessage, setErrorMessage] = useState('') /** Updates the email field in form state */ const handleEmailChange = (value: string) => { setFormData({ email: value }) } /** Submits the newsletter subscription */ const handleSubmit = async (e: FormEvent) => { e.preventDefault() setIsSubmitting(true) setSubmitStatus('idle') setErrorMessage('') try { // Get CSRF token from meta tag if it exists const csrfToken = typeof document !== 'undefined' ? document.querySelector('meta[name="csrf-token"]')?.getAttribute('content') || '' : '' const response = await fetch('/api/newsletter/subscribe', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-Token': csrfToken }, body: JSON.stringify({ email: formData.email // Groups are handled server-side based on provider configuration }) }) const result = await response.json() if (response.ok) { setSubmitStatus('success') // Reset form after successful submission setFormData({ email: '' }) } else { setSubmitStatus('error') setErrorMessage(result.error || 'Failed to subscribe. Please try again.') } } catch (_error) { setSubmitStatus('error') setErrorMessage('Network error. Please check your connection and try again.') } finally { setIsSubmitting(false) } } if (submitStatus === 'success') { return (

{title}

{description}

Successfully subscribed!

Thank you for subscribing! Please check your email to confirm your subscription.

) } return (

{title}

{description}

{/* Email Field */}
handleEmailChange(e.target.value)} required className="px-4 py-2 rounded-lg flex-1" />
{/* Error Message */} {submitStatus === 'error' && (
{errorMessage}
)} {/* Privacy Notice */}

By subscribing, you agree to receive email updates. You can unsubscribe at any time.

) }