import { useState, useEffect } from 'react' import type { ChangeEvent } from 'react' import { useNavigate, useSearchParams } from 'react-router-dom' const EMAIL_REGEX = /^[a-zA-Z0-9._%+\-]{1,64}@[a-zA-Z0-9.\-]{1,253}\.[a-zA-Z]{2,}$/ interface ContactFields { firstName: string lastName: string email: string message: string messageType: string } export default function ContactForm() { const navigate = useNavigate() const [searchParams] = useSearchParams() const source = searchParams.get('source') const studyName = searchParams.get('study') const [fields, setFields] = useState({ firstName: '', lastName: '', email: '', message: '', messageType: source === 'community' ? 'community' : 'question', }) useEffect(() => { if (source === 'community' && studyName) { setFields(f => ({ ...f, messageType: 'community', message: f.message.startsWith('[From ') ? f.message : `[From ${decodeURIComponent(studyName)} community]\n\n${f.message}`, })) } }, [source, studyName]) const [subscribe, setSubscribe] = useState(true) const [notifyOnAnswer, setNotifyOnAnswer] = useState(true) const [honey, setHoney] = useState('') const [status, setStatus] = useState<'idle' | 'submitting' | 'error'>('idle') const [errorMsg, setErrorMsg] = useState('') const [fieldErrors, setFieldErrors] = useState<{ email?: string }>({}) function handleChange(e: ChangeEvent) { const { name, value } = e.target setFields(f => ({ ...f, [name]: value })) if (name === 'email' && fieldErrors.email) { setFieldErrors(prev => ({ ...prev, email: undefined })) } } function handleEmailBlur() { if (!fields.email) return if (!EMAIL_REGEX.test(fields.email)) { setFieldErrors(prev => ({ ...prev, email: 'Please enter a valid email address.' })) } else { setFieldErrors(prev => ({ ...prev, email: undefined })) } } function handleSelectChange(e: ChangeEvent) { setFields(f => ({ ...f, [e.target.name]: e.target.value })) } async function handleSubmit(e: React.FormEvent) { e.preventDefault() setStatus('submitting') setErrorMsg('') try { const res = await fetch('/api/contact', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ ...fields, subscribe, notifyOnAnswer: fields.messageType === 'question' ? notifyOnAnswer : false, _honey: honey }), }) if (!res.ok) { const data = await res.json().catch(() => ({})) setErrorMsg((data as { message?: string }).message ?? 'Something went wrong. Please try again.') setStatus('error') return } navigate('/thanks') } catch { setErrorMsg('Could not connect. Please try again later.') setStatus('error') } } return (
setHoney(e.target.value)} />