"use client"; import { useTranslations } from "next-intl"; import Image from "next/image"; import { useState, useEffect } from "react"; import { X } from "lucide-react"; import { usePriceModalStore } from "@/store/useProceModalStore"; import { useMutation } from "@tanstack/react-query"; import httpClient from "@/request/api"; import { endPoints } from "@/request/links"; import { toast } from "react-toastify"; interface FormType { name: string; product: number; number: number; // ✅ String bo'lishi kerak } export function PriceModal() { const t = useTranslations("priceModal"); const { isOpen, product, closeModal } = usePriceModalStore(); const [formData, setFormData] = useState({ name: "", number: "+998 ", }); const [errors, setErrors] = useState({ name: "", number: "", }); const formRequest = useMutation({ mutationFn: (data: FormType) => httpClient.post(endPoints.post.productContact, data), onSuccess: () => { setFormData({ name: "", number: "+998 ", }); toast.success(t("success") || "Muvaffaqiyatli yuborildi!"); closeModal(); }, onError: (error) => { console.error("Error:", error); toast.error(t("error") || "Xatolik yuz berdi"); }, }); // Reset form when modal closes for github useEffect(() => { if (!isOpen) { setFormData({ name: "", number: "+998 ", }); setErrors({ name: "", number: "", }); } }, [isOpen]); // Prevent body scroll when modal is open useEffect(() => { if (isOpen) { document.body.style.overflow = "hidden"; } else { document.body.style.overflow = "unset"; } return () => { document.body.style.overflow = "unset"; }; }, [isOpen]); 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, number: formatted }); if (errors.number) { setErrors({ ...errors, number: "" }); } }; const handleInputChange = (e: React.ChangeEvent) => { const { name, value } = e.target; setFormData({ ...formData, [name]: value }); if (errors[name as keyof typeof errors]) { setErrors({ ...errors, [name]: "" }); } }; const validateForm = () => { const newErrors = { name: "", number: "", }; // Name validation if (!formData.name.trim()) { newErrors.name = t("validation.nameRequired") || "Ism kiritilishi shart"; } // Phone validation const phoneNumbers = formData.number.replace(/\D/g, ""); if (phoneNumbers.length !== 12) { newErrors.number = t("validation.phoneRequired") || "To'liq telefon raqam kiriting"; } else if (!phoneNumbers.startsWith("998")) { newErrors.number = t("validation.phoneInvalid") || "Noto'g'ri telefon raqam"; } setErrors(newErrors); return !newErrors.name && !newErrors.number; }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!validateForm()) { return; } // Telefon raqamni tozalash (faqat raqamlar) const cleanPhone = formData.number.replace(/\D/g, ""); const sendedData: FormType = { name: formData.name, number: Number(cleanPhone.slice(3)), // ✅ String sifatida yuborish product: product?.id || 0, }; formRequest.mutate(sendedData); }; if (!isOpen || !product) return null; return (
{/* Backdrop */}
{/* Modal */}
{/* Close button */} {/* Content */}

{t("title") || "Narx so'rash"}

{/* Product Info */}
{product.name}

{product.name}

{product.inStock ? t("product.inStock") || "Sotuvda mavjud" : t("product.outOfStock") || "Sotuvda yo'q"}
{/* Form */}
{/* Name */}
{errors.name && (

{errors.name}

)}
{/* Phone */}
{errors.number && (

{errors.number}

)}
{/* Submit Button */}
); }