"use client"; import React, { useState, useEffect, type FC } from "react"; import { type ClientSession } from "@/lib/session"; import { clientService } from "@/services/client.service"; import type { ClientAddress } from "@/types/client"; import { Spinner } from "../../Components/UI"; import { Alert } from "../../Components/UI"; import { Button } from "../../Components/UI"; import { Input } from "../../Components/UI"; interface AddrForm { label: string; branchName: string; contactName: string; contactPhone: string; city: string; district: string; street: string; buildingNo: string; unitNo: string; zipCode: string; } interface AddrErrors { city?: string; street?: string; zipCode?: string; contactPhone?: string; } const LABEL_OPTIONS = ["عام", "المنزل", "المكتب الرئيسي", "المستودع", "الفرع"]; interface AddressStepProps { session: ClientSession; onSuccess: () => void; } const AddressStep: FC = ({ session, onSuccess }) => { const [savedAddresses, setSavedAddresses] = useState([]); const [loadingAddrs, setLoadingAddrs] = useState(true); const [selectedId, setSelectedId] = useState(null); const [showNew, setShowNew] = useState(false); const [loading, setLoading] = useState(false); const [apiError, setApiError] = useState(""); const [formErrors, setFormErrors] = useState({}); const [form, setForm] = useState({ label: "عام", branchName: "", contactName: "", contactPhone: "", city: "", district: "", street: "", buildingNo: "", unitNo: "", zipCode: "", }); useEffect(() => { clientService.getAddresses(session.id) .then(list => { setSavedAddresses(list); if (list.length > 0) setSelectedId(list[0]._id); }) .catch(() => setShowNew(true)) .finally(() => setLoadingAddrs(false)); }, [session.id]); const setF = (field: keyof AddrForm) => (e: React.ChangeEvent) => { setForm(p => ({ ...p, [field]: e.target.value })); if (formErrors[field as keyof AddrErrors]) setFormErrors(p => ({ ...p, [field]: undefined })); }; const validateAddress = (): boolean => { const e: AddrErrors = {}; if (!form.city.trim()) e.city = "المدينة مطلوبة"; if (!form.street.trim()) e.street = "الشارع مطلوب"; if (form.zipCode && !/^\d{5}$/.test(form.zipCode)) e.zipCode = "الرمز البريدي يجب أن يتكون من 5 أرقام"; if (form.contactPhone && !/^(\+966|0)?[5][0-9]{8}$/.test(form.contactPhone.replace(/\s/g, ""))) e.contactPhone = "أدخل رقم جوال سعودي صحيح"; setFormErrors(e); return Object.keys(e).length === 0; }; const canProceed = selectedId !== null || showNew; const handleNext = async () => { if (selectedId) { setLoading(true); await new Promise(r => setTimeout(r, 400)); setLoading(false); onSuccess(); return; } if (showNew && !validateAddress()) return; setLoading(true); setApiError(""); try { await clientService.addAddress(session.id, { label: form.label, branchName: form.branchName || null, contactPerson: { name: form.contactName, phone: form.contactPhone }, details: { city: form.city.trim(), district: form.district.trim() || undefined, street: form.street.trim(), buildingNo: form.buildingNo.trim() || undefined, unitNo: form.unitNo.trim() || undefined, zipCode: form.zipCode.trim() || undefined, }, }); onSuccess(); } catch (err: unknown) { setApiError(err instanceof Error ? err.message : "تعذّر حفظ العنوان، يرجى المحاولة مجددًا."); } finally { setLoading(false); } }; return (
تم إنشاء الحساب

اختر عنوان التوصيل

العنوان مطلوب قبل تقديم أي طلب.

{apiError && (
setApiError("")} />
)} {loadingAddrs ? (
جارٍ تحميل العناوين…
) : ( <> {/* Saved addresses */} {savedAddresses.length > 0 && (

العناوين المحفوظة

{savedAddresses.map(addr => ( ))}
)} {/* New address toggle */} {/* New address form */} {showNew && (

تفاصيل العنوان الجديد


)} )} {!canProceed && !loadingAddrs && (

يرجى اختيار عنوان أو إضافة عنوان جديد للمتابعة.

)}
); }; export default AddressStep;