import React, { useEffect, useState } from "react"; import { sendEmail } from "@/app/utils/send-email"; import Link from "next/link"; export type ContactFormData = { name: string; email: string; message: string; }; export default function Contact() { const [isVisible, setIsVisible] = useState(false); const [banner, setBanner] = useState<{ show: boolean; message: string; type: "success" | "error"; }>({ show: false, message: "", type: "success", }); // Record the time when the form is rendered const [formLoadedTimestamp, setFormLoadedTimestamp] = useState(Date.now()); useEffect(() => { setFormLoadedTimestamp(Date.now()); setTimeout(() => { setIsVisible(true); }, 350); }, []); async function onSubmit(e: React.FormEvent) { e.preventDefault(); const form = e.currentTarget as HTMLFormElement; const formData = new FormData(form); // Honeypot check const honeypot = formData.get("hp-field"); if (honeypot) { setBanner({ show: true, message: "Bot detected", type: "error", }); setTimeout(() => setBanner((prev) => ({ ...prev, show: false })), 3000); return; } // Time-based anti-bot check const timestampStr = formData.get("timestamp") as string; const timestamp = parseInt(timestampStr, 10); if (Date.now() - timestamp < 3000) { setBanner({ show: true, message: "Please take your time filling out the form.", type: "error", }); setTimeout(() => setBanner((prev) => ({ ...prev, show: false })), 3000); return; } const data: ContactFormData = { name: formData.get("name") as string, email: formData.get("email") as string, message: formData.get("message") as string, }; const jsonData = JSON.stringify(data); const submitButton = form.querySelector("button[type='submit']"); if (submitButton) { submitButton.setAttribute("disabled", "true"); submitButton.textContent = "Sending..."; const response = await sendEmail(jsonData); if (response.success) { form.reset(); submitButton.textContent = "Sent!"; setTimeout(() => { submitButton.removeAttribute("disabled"); submitButton.textContent = "Send Message"; }, 2000); } setBanner({ show: true, message: response.message, type: response.success ? "success" : "error", }); setTimeout(() => setBanner((prev) => ({ ...prev, show: false })), 3000); } } return (

Get in Touch

{banner.show && (
{banner.message}
)}
{/* Honeypot field */} {/* Hidden timestamp field */}
); }