"use client"; import * as React from "react"; import { useState } from "react"; import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Textarea } from "../ui/textarea"; import { SubmitButton } from "../submit-button"; import Link from "next/link"; import { toast } from "@/hooks/use-toast"; import { sendContactEmail } from "@/actions/auth/contact-us"; import { TValidator } from "@/utils/validator"; export function ContactUsForm() { const typeMessage = [ { value: "1", label: "Request to become a user" }, { value: "2", label: "OTP problem" }, { value: "3", label: "Request for a feature" }, { value: "4", label: "Other" }, ]; // State untuk form data const [formData, setFormData] = useState({ name: "", email: "", phone: "", typeMessage: "", message: "", }); // State untuk error messages const [errors, setErrors] = useState>({}); // Loading state const [isSubmitting, setIsSubmitting] = useState(false); // Handle input change const handleChange = ( e: React.ChangeEvent ) => { const { id, value } = e.target; setFormData((prev) => ({ ...prev, [id]: value })); // Clear error when typing if (errors[id]) { setErrors((prev) => { const newErrors = { ...prev }; delete newErrors[id]; return newErrors; }); } }; // Handle select change const handleSelectChange = (value: string) => { setFormData((prev) => ({ ...prev, typeMessage: value })); // Clear error when selecting if (errors.typeMessage) { setErrors((prev) => { const newErrors = { ...prev }; delete newErrors.typeMessage; return newErrors; }); } }; // Handle form submission const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); // Client-side validation const validation = TValidator.validateContactForm(formData); if (!validation.success) { setErrors(validation.errors); return; } try { setIsSubmitting(true); // Call server action to send email const result = await sendContactEmail(formData); if (!result.success) { // Handle server-side validation errors if (result.errors) { setErrors(result.errors); } else { toast({ title: "Error", description: result.error || "Failed to send message. Please try again.", variant: "destructive", }); } return; } // Success! toast({ title: "Success", description: result.message || "Your message has been sent successfully!", }); // Reset form and errors after successful submission setFormData({ name: "", email: "", phone: "", typeMessage: "", message: "", }); setErrors({}); } catch (error) { console.error("Error submitting form:", error); toast({ title: "Error", description: "An unexpected error occurred. Please try again later.", variant: "destructive", }); } finally { setIsSubmitting(false); } }; return ( Contact Us Fill in the form below to contact the admin
{errors.name && (

{errors.name}

)}
{errors.email && (

{errors.email}

)}
{errors.phone && (

{errors.phone}

)}
{errors.typeMessage && (

{errors.typeMessage}

)}