"use client"; import { Check } from "lucide-react"; import { useTranslations } from "next-intl"; import { useState } from "react"; import { useMutation } from "@tanstack/react-query"; import axios from "axios"; import { toast } from "react-toastify"; import httpClient from "@/request/api"; import { endPoints } from "@/request/links"; interface FormData { name: string; surname: string; address: string; theme: string; message: string; agreeToPolicy: boolean; } interface FormErrors { name?: string; surname?: string; address?: string; theme?: string; message?: string; agreeToPolicy?: string; } export default function Form() { const t = useTranslations(); const [formData, setFormData] = useState({ name: "", surname: "", address: "", theme: "", message: "", agreeToPolicy: false, }); const [errors, setErrors] = useState({}); const [isSubmitting, setIsSubmitting] = useState(false); const [submitStatus, setSubmitStatus] = useState< "idle" | "success" | "error" >("idle"); const formRequest = useMutation({ mutationKey: [], mutationFn: (data: FormData) => httpClient.post(endPoints.post.contact, data), onSuccess: () => { setSubmitStatus("success"); setFormData({ name: "", surname: "", address: "", theme: "", message: "", agreeToPolicy: false, }); setIsSubmitting(false); toast.success(t("succes")); setTimeout(() => setSubmitStatus("idle"), 3000); }, onError: (error) => { console.log("error: ", error); setIsSubmitting(false); setSubmitStatus("error"); toast.error(t("error")); setTimeout(() => setSubmitStatus("idle"), 3000); }, }); const validateForm = (): boolean => { const newErrors: FormErrors = {}; if (!formData.name.trim()) { newErrors.name = "First name is required"; } if (!formData.surname.trim()) { newErrors.surname = "Last name is required"; } const phoneNumbers = formData.address.replace(/\D/g, ""); if (phoneNumbers.length !== 12) { newErrors.address = t("validation.phoneRequired") || "To'liq telefon raqam kiriting"; } else if (!phoneNumbers.startsWith("998")) { newErrors.address = t("validation.phoneInvalid") || "Noto'g'ri telefon raqam"; } if (!formData.theme.trim()) { newErrors.theme = "theme is required"; } if (!formData.message.trim()) { newErrors.message = "Message is required"; } if (!formData.agreeToPolicy) { newErrors.agreeToPolicy = "You must agree to the privacy policy"; } setErrors(newErrors); return Object.keys(newErrors).length === 0; }; const formatPhoneNumber = (value: string) => { const numbers = value.replace(/\D/g, ""); if (!numbers.startsWith("998")) { return "+998 "; } let formatted = "+998 "; const rest = numbers.slice(3); if (rest.length > 0) formatted += rest.slice(0, 2); if (rest.length > 2) formatted += " " + rest.slice(2, 5); if (rest.length > 5) formatted += " " + rest.slice(5, 7); if (rest.length > 7) formatted += " " + rest.slice(7, 9); return formatted; }; const handlePhoneChange = (e: React.ChangeEvent) => { const formatted = formatPhoneNumber(e.target.value); setFormData({ ...formData, address: formatted }); if (errors.address) { setErrors({ ...errors, address: "" }); } }; const handleChange = ( e: React.ChangeEvent, ) => { const { name, value } = e.target; setFormData((prev) => ({ ...prev, [name]: value })); if (errors[name as keyof FormErrors]) { setErrors((prev) => ({ ...prev, [name]: undefined })); } }; const handleCheckboxChange = () => { setFormData((prev) => ({ ...prev, agreeToPolicy: !prev.agreeToPolicy })); if (errors.agreeToPolicy) { setErrors((prev) => ({ ...prev, agreeToPolicy: undefined })); } }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!validateForm()) return; setIsSubmitting(true); setSubmitStatus("idle"); formRequest.mutate(formData); }; return (
{/* First Row - Names */}
{errors.name && (

{errors.name}

)}
{errors.surname && (

{errors.surname}

)}
{/* Second Row - address & theme */}
{errors.address && (

{errors.address}

)}
{errors.theme && (

{errors.theme}

)}
{/* Message Textarea */}