"use client"; import { useSearchParams } from "next/navigation"; import { FormEvent, useState } from "react"; type ContactResponse = { success: boolean; message: string; fieldErrors?: Record; }; const projectOptions = [ { value: "", label: "Select a project type" }, { value: "masonry-supplies", label: "Masonry supplies" }, { value: "landscaping-supplies", label: "Landscaping supplies" }, { value: "delivery-quote", label: "Delivery quote" }, { value: "bulk-order", label: "Bulk order" }, { value: "general-question", label: "General question" }, ]; export function ContactForm() { const searchParams = useSearchParams(); const materialInterest = searchParams.get("material") ?? ""; const [formData, setFormData] = useState({ name: "", phone: "", email: "", projectType: "", message: "", }); const [fieldErrors, setFieldErrors] = useState>({}); const [status, setStatus] = useState(null); const [isSubmitting, setIsSubmitting] = useState(false); async function handleSubmit(event: FormEvent) { event.preventDefault(); setIsSubmitting(true); setStatus(null); setFieldErrors({}); try { const response = await fetch("/api/contact", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ ...formData, materialInterest, }), }); const payload = (await response.json()) as ContactResponse; setStatus(payload); setFieldErrors(payload.fieldErrors ?? {}); if (payload.success) { setFormData({ name: "", phone: "", email: "", projectType: "", message: "", }); } } catch { setStatus({ success: false, message: "Something went wrong while sending the form. Please call the yard directly.", }); } finally { setIsSubmitting(false); } } return (
setFormData((current) => ({ ...current, name: event.target.value })) } /> {fieldErrors.name ? {fieldErrors.name} : null}
setFormData((current) => ({ ...current, phone: event.target.value })) } /> {fieldErrors.phone ? {fieldErrors.phone} : null}
setFormData((current) => ({ ...current, email: event.target.value })) } /> {fieldErrors.email ? {fieldErrors.email} : null}
{materialInterest ? (
) : null}