"use client"; import { useRef, useState } from "react"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; import { useTranslations } from "next-intl"; import { Link } from "@/i18n/navigation"; import { useCartStore } from "@/store/cart"; const formSchema = z.object({ name: z.string().min(2).max(120), phone: z.string().min(6).max(40), email: z.string().email().max(120), company: z.string().max(160).optional().or(z.literal("")), message: z.string().max(2000).optional().or(z.literal("")), }); type FormValues = z.infer; const inputClass = "mt-1.5 w-full rounded-lg border border-neutral-200 bg-white px-3 py-2.5 text-sm font-normal text-neutral-800 outline-none transition duration-150 placeholder:text-neutral-400 focus:border-brand-navy600 focus:ring-2 focus:ring-brand-navy/8"; export function CheckoutForm() { const t = useTranslations("checkout"); const items = useCartStore((s) => s.items); const clear = useCartStore((s) => s.clear); const refInput = useRef(null); const proformaInput = useRef(null); const [status, setStatus] = useState< "idle" | "sending" | "success" | "error" >("idle"); const [requestId, setRequestId] = useState(null); const [emailWarn, setEmailWarn] = useState(false); const [errorMsg, setErrorMsg] = useState(null); const { register, trigger, getValues, formState: { errors }, } = useForm({ resolver: zodResolver(formSchema), defaultValues: { company: "", message: "" }, }); if (items.length === 0 && status !== "success") { return (

{t("cartEmpty")}

{t("goCart")}
); } if (status === "success" && requestId) { return (

{t("successTitle")}

{t("successBody")}{" "} {requestId}

{emailWarn ? (

{t("emailWarn")}

) : null} {t("successCta")}
); } async function onFormSubmit(e: React.FormEvent) { e.preventDefault(); const ok = await trigger(); if (!ok) return; const values = getValues(); setStatus("sending"); setErrorMsg(null); try { const fd = new FormData(); fd.set("name", values.name); fd.set("phone", values.phone); fd.set("email", values.email); fd.set("company", values.company ?? ""); fd.set("message", values.message ?? ""); fd.set("website", ""); fd.set("cart", JSON.stringify(items)); const refs = refInput.current?.files; if (refs) { for (let i = 0; i < refs.length; i += 1) { fd.append("referenceImages", refs[i]); } } const pro = proformaInput.current?.files?.[0]; if (pro && pro.size > 0) { fd.set("proforma", pro); } const res = await fetch("/api/quote-request", { method: "POST", body: fd, }); const data = (await res.json()) as { ok?: boolean; requestId?: string; emailSent?: boolean; error?: string; }; if (!res.ok) { setStatus("error"); setErrorMsg(data.error ?? "Request failed"); return; } if (data.requestId) { setRequestId(data.requestId); setEmailWarn(data.emailSent === false); clear(); setStatus("success"); } else { setStatus("error"); setErrorMsg("Invalid response"); } } catch { setStatus("error"); setErrorMsg("Network error"); } } return (
{errors.name ? (

{errors.name.message}

) : null}
{errors.phone ? (

{errors.phone.message}

) : null}
{errors.email ? (

{errors.email.message}

) : null}