"use client"; import { FormEvent, useEffect, useMemo, useState } from "react"; type SubmitState = | { type: "idle"; message: string } | { type: "success"; message: string } | { type: "error"; message: string }; const initialState: SubmitState = { type: "idle", message: "" }; export function ContactForm() { const [submitState, setSubmitState] = useState(initialState); const [isSubmitting, setIsSubmitting] = useState(false); const [captchaPrompt, setCaptchaPrompt] = useState(""); const [captchaToken, setCaptchaToken] = useState(""); const [captchaLoading, setCaptchaLoading] = useState(true); const startedAt = useMemo(() => Date.now().toString(), []); async function loadCaptcha() { setCaptchaLoading(true); try { const response = await fetch("/api/contact/captcha", { cache: "no-store" }); const data = (await response.json()) as { prompt?: string; token?: string }; setCaptchaPrompt(data.prompt ?? ""); setCaptchaToken(data.token ?? ""); } finally { setCaptchaLoading(false); } } useEffect(() => { void loadCaptcha(); }, []); async function handleSubmit(event: FormEvent) { event.preventDefault(); setIsSubmitting(true); setSubmitState(initialState); const form = event.currentTarget; const formData = new FormData(form); try { const response = await fetch("/api/contact", { method: "POST", body: JSON.stringify({ fullName: formData.get("fullName"), email: formData.get("email"), subject: formData.get("subject"), message: formData.get("message"), website: formData.get("website"), startedAt: formData.get("startedAt"), captchaAnswer: formData.get("captchaAnswer"), captchaToken }), headers: { "Content-Type": "application/json" } }); const data = (await response.json()) as { message?: string }; if (!response.ok) { setSubmitState({ type: "error", message: data.message ?? "Pesan gagal dikirim. Silakan coba lagi." }); await loadCaptcha(); return; } form.reset(); await loadCaptcha(); setSubmitState({ type: "success", message: data.message ?? "Pesan berhasil dikirim." }); } catch { setSubmitState({ type: "error", message: "Terjadi kendala jaringan saat mengirim pesan." }); await loadCaptcha(); } finally { setIsSubmitting(false); } } return (