"use client"; import React, { useState, useEffect, type FC } from "react"; import { type ClientSession } from "@/utils/helperFun"; import { Spinner } from "../UI"; const API_BASE = process.env.NEXT_PUBLIC_API_BASE_URL!; // ─── Types ─────────────────────────────────── export interface ClientAddress { _id: string; label: string; branchName: string | null; contactPerson: { name: string; phone: string }; details: { city: string; district?: string; street: string; buildingNo?: string; unitNo?: string; zipCode?: string; }; } 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; } interface InputProps extends React.InputHTMLAttributes { label: string; error?: string; } const Input: FC = ({ label, error, className = "", ...rest }) => (
{error &&

{error}

}
); interface BtnProps extends React.ButtonHTMLAttributes { loading?: boolean; } const PrimaryBtn: FC = ({ loading, children, className = "", disabled, ...rest }) => ( ); const Alert: FC<{ type?: "error" | "info" | "success"; message: string; onClose?: () => void }> = ({ type = "error", message, onClose, }) => { const styles = { error: "bg-red-50 border-red-200 text-red-700", info: "bg-blue-50 border-blue-200 text-blue-700", success: "bg-emerald-50 border-emerald-200 text-emerald-700", }; const icons = { error: "⚠", info: "ℹ", success: "✓" }; return (
{icons[type]} {message} {onClose && ( )}
); }; // ─── AddressStep ───────────────────────────── interface AddressStepProps { session: ClientSession; onSuccess: () => void; } const LABEL_OPTIONS = ["عام", "المنزل", "المكتب الرئيسي", "المستودع", "الفرع"]; 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: "", }); // get saved addresses on mount useEffect(() => { (async () => { try { const res = await fetch(`${API_BASE}/client/${session.id}/addresses`); const data = await res.json(); if (res.ok) { // api might return either { addresses: [...] } or just [...] const list: ClientAddress[] = Array.isArray(data) ? data : (data.addresses ?? []); setSavedAddresses(list); // auto-select first address if available if (list.length > 0) setSelectedId(list[0]._id); } } catch { // ignore fetch errors, user can add address manually 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) { // existing address selected → proceed without API call setLoading(true); await new Promise(r => setTimeout(r, 400)); setLoading(false); onSuccess(); return; } if (showNew && !validateAddress()) return; setLoading(true); setApiError(""); try { const res = await fetch(`${API_BASE}/client/${session.id}/addresses`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ 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, }, }), }); const data = await res.json(); if (!res.ok) throw new Error(data.message ?? "تعذّر حفظ العنوان"); onSuccess(); } catch (err: unknown) { setApiError(err instanceof Error ? err.message : "تعذّر حفظ العنوان، يرجى المحاولة مجددًا."); } finally { setLoading(false); } }; return (
تم إنشاء الحساب

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

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

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

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

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

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

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

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

)}
التالي — عرض الطلبات
); }; export default AddressStep;