"use client"; import { useRouter } from "next/navigation"; import { useState, type FormEvent } from "react"; type FormType = "start" | "ask"; type FieldErrors = Record; export function SubmissionForm({ type }: { type: FormType }) { const router = useRouter(); const [errors, setErrors] = useState({}); const [status, setStatus] = useState<"idle" | "submitting" | "error">("idle"); async function handleSubmit(event: FormEvent) { event.preventDefault(); setErrors({}); setStatus("submitting"); const form = new FormData(event.currentTarget); const payload = Object.fromEntries(form.entries()); const response = await fetch("/api/submissions", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ ...payload, type, consentAccepted: form.get("consentAccepted") === "on", sourcePath: type === "start" ? "/start" : "/ask" }) }); const result = await response.json().catch(() => ({})); if (!response.ok) { setErrors(result.issues || { form: [result.error || "Submission failed"] }); setStatus("error"); return; } router.push(`/thanks?submission_id=${encodeURIComponent(result.submission_id)}`); } return (
{type === "start" ? : } {errors.form?.length ?
{errors.form[0]}
: null}
File upload is intentionally disabled until storage, size limits, access control, and privacy handling are approved.
); } function StartFields({ errors }: { errors: FieldErrors }) { return ( <>