"use client"; import React, { useEffect, useActionState } from "react"; // Removed useRef import { useForm } from "react-hook-form"; // Removed SubmitHandler import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; import { submitContactForm, ContactFormState } from "@/actions/contact"; import Button from "@/components/ui/Button"; // Zod schema for contact form validation const contactSchema = z.object({ name: z.string().min(2, "Full name must be at least 2 characters"), email: z.string().email("Invalid email address"), subject: z.string().min(3, "Subject must be at least 3 characters"), message: z.string().min(10, "Message must be at least 10 characters"), }); type ContactFormData = z.infer; export default function ContactForm() { // React Hook Form setup const { register, formState: { errors, isValid }, reset, } = useForm({ resolver: zodResolver(contactSchema), mode: "onChange", }); const initialState: ContactFormState = { message: null, errors: {}, success: false, }; const [state, formAction] = useActionState(submitContactForm, initialState); // Renamed dispatch to formAction for clarity // Reset form when server action reports success useEffect(() => { if (state.success) { reset(); } }, [state.success, reset]); // Removed onSubmit handler // Pass formAction directly to the form's action prop // Remove onSubmit={handleSubmit(onSubmit)} return (
{/* Name Field */}
{/* Client-side error */} {errors.name && ( )} {/* Server-side error */} {state.errors?.name && state.errors.name.map((err: string) => (

{err}

))}
{/* Email Field */}
{errors.email && ( )} {state.errors?.email && state.errors.email.map((err: string) => (

{err}

))}
{/* Subject Field */}
{errors.subject && ( )} {state.errors?.subject && state.errors.subject.map((err: string) => (

{err}

))}
{/* Message Field */}