"use client"; import React, { useState, useEffect } from "react"; import { motion, AnimatePresence } from "motion/react"; import { X, MapPin, User, Phone, Hash, Save, Check } from "lucide-react"; import { toPersian, cn } from "../lib/utils"; import { Address } from "../lib/store/userStore"; import { toast } from "sonner"; interface AddressModalProps { isOpen: boolean; onClose: () => void; onSave: (address: Address) => void; editingAddress?: Address | null; } export default function AddressModal({ isOpen, onClose, onSave, editingAddress }: AddressModalProps) { const [formData, setFormData] = useState>({ title: "", receptorName: "", phone: "", province: "", city: "", detail: "", zipCode: "", isDefault: false }); const [errors, setErrors] = useState>({}); const [isSubmitting, setIsSubmitting] = useState(false); useEffect(() => { if (editingAddress) { setFormData({ title: editingAddress.title, receptorName: editingAddress.receptorName, phone: editingAddress.phone, province: editingAddress.province, city: editingAddress.city, detail: editingAddress.detail, zipCode: editingAddress.zipCode, isDefault: editingAddress.isDefault }); } else { setFormData({ title: "", receptorName: "", phone: "", province: "", city: "", detail: "", zipCode: "", isDefault: false }); } setErrors({}); setIsSubmitting(false); }, [editingAddress, isOpen]); const normalizeDigits = (str: string) => { const persianDigits = [/۰/g, /۱/g, /۲/g, /۳/g, /۴/g, /۵/g, /۶/g, /۷/g, /۸/g, /۹/g]; const arabicDigits = [/٠/g, /١/g, /٢/g, /٣/g, /٤/g, /٥/g, /٦/g, /٧/g, /٨/g, /٩/g]; for (let i = 0; i < 10; i++) { str = str.replace(persianDigits[i], i.toString()).replace(arabicDigits[i], i.toString()); } return str; }; const validate = () => { const newErrors: Record = {}; if (!formData.title) newErrors.title = "لطفاً عنوان آدرس را وارد کنید"; if (!formData.receptorName) newErrors.receptorName = "نام گیرنده را وارد کنید"; const normalizedPhone = normalizeDigits(formData.phone); if (!normalizedPhone) { newErrors.phone = "شماره تماس الزامی است"; } else if (!/^09\d{9}$/.test(normalizedPhone)) { newErrors.phone = "شماره موبایل وارد شده معتبر نیست"; } if (!formData.province) newErrors.province = "استان را مشخص کنید"; if (!formData.city) newErrors.city = "شهر را مشخص کنید"; if (!formData.detail) newErrors.detail = "آدرس دقیق پستی را وارد کنید"; const normalizedZip = normalizeDigits(formData.zipCode); if (!normalizedZip) { newErrors.zipCode = "کد پستی الزامی است"; } else if (!/^\d{10}$/.test(normalizedZip)) { newErrors.zipCode = "کد پستی باید ۱۰ رقم باشد"; } setErrors(newErrors); return Object.keys(newErrors).length === 0; }; const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); if (validate()) { setIsSubmitting(true); // Simulate small delay for UX setTimeout(() => { onSave({ ...formData, phone: normalizeDigits(formData.phone), zipCode: normalizeDigits(formData.zipCode), id: editingAddress?.id || Math.random().toString(36).substr(2, 9), isDefault: formData.isDefault }); toast.success(editingAddress ? "تغییرات آدرس با موفقیت ذخیره شد" : "آدرس جدید با موفقیت اضافه شد"); setIsSubmitting(false); onClose(); }, 600); } else { toast.error("لطفاً موارد خطای فرم را اصلاح کنید"); } }; return ( {isOpen && (

{editingAddress ? "ویرایش آدرس ارسال" : "افزودن آدرس جدید"}

{/* Row 1: Title */}
setFormData({...formData, title: e.target.value})} className={cn("w-full bg-medical-gray-50 border rounded-2xl py-3 px-5 outline-none font-bold transition-all focus:ring-2 focus:ring-canina-blue/20", errors.title ? "border-red-300" : "border-medical-gray-100")} placeholder="مثال: منزل اصلی" /> {errors.title &&

{errors.title}

}
{/* Row 2: Name & Phone */}
setFormData({...formData, receptorName: e.target.value})} className={cn("w-full bg-medical-gray-50 border rounded-2xl py-3 px-5 outline-none font-bold transition-all focus:ring-2 focus:ring-canina-blue/20", errors.receptorName ? "border-red-300" : "border-medical-gray-100")} placeholder="نام و نام‌خانوادگی..." /> {errors.receptorName &&

{errors.receptorName}

}
setFormData({...formData, phone: e.target.value})} className={cn("w-full bg-medical-gray-50 border rounded-2xl py-3 px-5 outline-none font-bold transition-all focus:ring-2 focus:ring-canina-blue/20 text-left", errors.phone ? "border-red-300" : "border-medical-gray-100")} placeholder="09120000000" dir="ltr" /> {errors.phone &&

{errors.phone}

}
{/* Row 3: Province & City */}
setFormData({...formData, province: e.target.value})} className={cn("w-full bg-medical-gray-50 border rounded-2xl py-3 px-5 outline-none font-bold transition-all focus:ring-2 focus:ring-canina-blue/20", errors.province ? "border-red-300" : "border-medical-gray-100")} placeholder="نام استان..." /> {errors.province &&

{errors.province}

}
setFormData({...formData, city: e.target.value})} className={cn("w-full bg-medical-gray-50 border rounded-2xl py-3 px-5 outline-none font-bold transition-all focus:ring-2 focus:ring-canina-blue/20", errors.city ? "border-red-300" : "border-medical-gray-100")} placeholder="نام شهر..." /> {errors.city &&

{errors.city}

}
{/* Row 4: Detail Address */}