### Next.js App Router Client Component Fetch Source: https://splitforms.com/docs For real-time UI in Next.js App Router, use a client-component fetch. This example demonstrates the client-side form submission logic. ```typescript "use client"; import { useState } from "react"; export default function ContactForm() { const [status, setStatus] = useState<"idle" | "loading" | "ok" | "err">("idle"); async function handleSubmit(e: React.FormEvent) { e.preventDefault(); setStatus("loading"); const formData = new FormData(e.currentTarget); formData.append("access_key", process.env.NEXT_PUBLIC_SPLITFORMS_KEY!); const res = await fetch("https://splitforms.com/api/submit", { method: "POST", headers: { Accept: "application/json" }, body: formData, }); const data = await res.json(); setStatus(data.success ? "ok" : "err"); } return (
``` -------------------------------- ### React Form Submission with Fetch Source: https://splitforms.com/docs Use fetch from a client component in React. The browser handles FormData encoding. Inject the access key. ```javascript import { useState } from "react"; export default function ContactForm() { const [status, setStatus] = useState("idle"); async function onSubmit(e) { e.preventDefault(); setStatus("loading"); const formData = new FormData(e.target); formData.append("access_key", import.meta.env.VITE_SPLITFORMS_KEY); const res = await fetch("https://splitforms.com/api/submit", { method: "POST", headers: { Accept: "application/json" }, body: formData, }); const json = await res.json(); setStatus(json.success ? "ok" : "err"); if (json.success) e.target.reset(); } return (
``` -------------------------------- ### Static HTML Form for SplitForms Source: https://splitforms.com/docs A standard HTML form for static sites that posts directly to the SplitForms API endpoint. Includes a hidden access key and a redirect URL. ```html --- // src/pages/contact.astro const ACCESS_KEY = import.meta.env.PUBLIC_SPLITFORMS_KEY; ---