"use client"; import React, { useState } from "react"; import { MaterialIcon } from "@/components/ui/MaterialIcon"; type FormData = { name: string; email: string; message: string; }; type FormErrors = { name?: string; email?: string; message?: string; }; export function ContactForm() { const [formData, setFormData] = useState({ name: "", email: "", message: "", }); const [errors, setErrors] = useState({}); const [isSubmitting, setIsSubmitting] = useState(false); const [showToast, setShowToast] = useState(false); const handleInputChange = ( e: React.ChangeEvent ) => { const { name, value } = e.target; setFormData((prev) => ({ ...prev, [name]: value, })); // Clear error for this field as the user types if (errors[name as keyof FormErrors]) { setErrors((prev) => ({ ...prev, [name]: undefined, })); } }; const validateForm = (): boolean => { const tempErrors: FormErrors = {}; let isValid = true; if (!formData.name.trim()) { tempErrors.name = "Name is required"; isValid = false; } const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; if (!formData.email.trim()) { tempErrors.email = "Email is required"; isValid = false; } else if (!emailRegex.test(formData.email)) { tempErrors.email = "Please enter a valid email address"; isValid = false; } if (!formData.message.trim()) { tempErrors.message = "Message is required"; isValid = false; } else if (formData.message.trim().length < 10) { tempErrors.message = "Message must be at least 10 characters long"; isValid = false; } setErrors(tempErrors); return isValid; }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!validateForm()) return; setIsSubmitting(true); // Simulate API Request delay await new Promise((resolve) => setTimeout(resolve, 1200)); setIsSubmitting(false); setShowToast(true); setFormData({ name: "", email: "", message: "" }); // Auto-hide toast after 5 seconds setTimeout(() => { setShowToast(false); }, 5000); }; return ( <>
{/* Background Accent Mesh */}
Write to us

Send Message

{/* Name field */}
{errors.name && ( {errors.name} )}
{/* Email field */}
{errors.email && ( {errors.email} )}
{/* Message field */}