'use client'; import { useState, useEffect, useCallback } from 'react'; import { motion } from 'framer-motion'; import { useRouter } from 'next/navigation'; import { Calendar, Clock, CheckCircle, XCircle, Eye, Loader2, Search, MapPin, DollarSign, Home, ArrowLeft, } from 'lucide-react'; import toast, { Toaster } from 'react-hot-toast'; import AuthService from '../services/AuthService'; import { getRentProperty } from '../utils/api'; const API_BASE = process.env.NEXT_PUBLIC_API_URL || 'https://45.93.137.91.nip.io/api'; const STATUS_MAP = ['pending','ownerConfirmed','depositPaid','depositConfirmed','completed','cancelled']; const STATUS_UI = { pending: { label: 'قيد الانتظار', color: 'bg-yellow-100 text-yellow-800', icon: Clock }, ownerConfirmed: { label: 'مؤكد من المالك', color: 'bg-blue-100 text-blue-800', icon: CheckCircle }, depositPaid: { label: 'تم دفع السلفة', color: 'bg-indigo-100 text-indigo-800', icon: DollarSign }, depositConfirmed: { label: 'مؤكد', color: 'bg-green-100 text-green-800', icon: CheckCircle }, completed: { label: 'منتهي', color: 'bg-green-100 text-green-800', icon: CheckCircle }, cancelled: { label: 'ملغي', color: 'bg-gray-100 text-gray-800', icon: XCircle }, }; function statusLabel(code) { return STATUS_UI[STATUS_MAP[code]]?.label ?? String(code); } function statusColor(code) { return STATUS_UI[STATUS_MAP[code]]?.color ?? 'bg-gray-100 text-gray-700'; } function statusIcon(code) { return STATUS_UI[STATUS_MAP[code]]?.icon ?? Clock; } function StatusBadge({ code }) { const Icon = statusIcon(code); return ( {statusLabel(code)} ); } async function enrich(reservation) { if (!reservation.propertyId) return reservation; try { const prop = await getRentProperty(reservation.propertyId); reservation._prop = prop?.propertyInformation ?? prop ?? null; } catch { /* skip */ } return reservation; } const propAddr = (p) => p?.address ?? ''; const propImages = (p) => Array.isArray(p?.images) ? p.images : []; const propBeds = (p) => p?.numberOfBedRooms ?? 0; const propBaths = (p) => p?.numberOfBathRooms ?? 0; function ReservationCard({ r, onViewDetails }) { const p = r._prop; const imgs = propImages(p); const img = imgs.length > 0 ? `${API_BASE}${imgs[0]}` : null; const addr = propAddr(p); const beds = propBeds(p); const baths = propBaths(p); return (
{img &&
}
{addr &&
{addr}
}
{r.totalPrice?.toLocaleString() ?? '—'}
السعر الإجمالي
{(beds||baths) &&
{beds>0&&{beds} غرف}{baths>0&&{baths} حمامات}
}
من
{new Date(r.startDate).toLocaleDateString('ar')}
إلى
{new Date(r.endDate).toLocaleDateString('ar')}
); } function DetailsModal({ r, isOpen, onClose }) { if (!isOpen || !r) return null; const p = r._prop; return ( e.stopPropagation()}>

تفاصيل الحجز

رقم الحجز: #{r.id}

{p &&

معلومات العقار

العنوان: {propAddr(p)||'—'}

{(propBeds(p)||propBaths(p)) &&
{propBeds(p)>0&&{propBeds(p)} غرف} {propBaths(p)>0&&{propBaths(p)} حمامات}
}
}

تفاصيل الحجز

تاريخ البداية

{new Date(r.startDate).toLocaleDateString('ar')}

تاريخ النهاية

{new Date(r.endDate).toLocaleDateString('ar')}

الحالة

تاريخ الإنشاء

{new Date(r.createdAt).toLocaleDateString('ar')}

المعلومات المالية

الإجمالي{r.totalPrice?.toLocaleString()??'—'}
); } export default function UserReservationsPage() { const router = useRouter(); const [reservations, setReservations] = useState([]); const [filtered, setFiltered] = useState([]); const [loading, setLoading] = useState(true); const [selected, setSelected] = useState(null); const [filterStatus, setFilterStatus] = useState('all'); const [searchTerm, setSearchTerm] = useState(''); useEffect(() => { if (!AuthService.getUser()) { router.push('/login'); return; } loadReservations(); }, [router]); const loadReservations = useCallback(async () => { try { const res = await fetch(`${API_BASE}/Reservations/GetUserResevations`, { headers: { Authorization: `Bearer ${AuthService.getToken()}` }, }); if (!res.ok) throw new Error(`HTTP ${res.status}`); const json = await res.json(); let list = json.data || json || []; if (!Array.isArray(list)) list = []; const enriched = await Promise.all(list.map(enrich)); setReservations(enriched); setFiltered(enriched); } catch (err) { console.error(err); toast.error('فشل تحميل الحجوزات'); setReservations([]); setFiltered([]); } setLoading(false); }, []); useEffect(() => { let r = reservations; if (filterStatus !== 'all') r = r.filter(x => STATUS_MAP[x.status] === filterStatus); if (searchTerm) { const q = searchTerm.toLowerCase(); r = r.filter(x => propAddr(x._prop).toLowerCase().includes(q) || String(x.id).includes(q)); } setFiltered(r); }, [reservations, filterStatus, searchTerm]); const allStatuses = [...new Set(reservations.map(r => STATUS_MAP[r.status]))]; const counts = { all: reservations.length, ...Object.fromEntries(allStatuses.map(s => [s, reservations.filter(r => STATUS_MAP[r.status] === s).length])) }; if (loading) return
; return (
setSelected(null)} />

حجوزاتي

لديك {reservations.length} حجز

{Object.entries(counts).map(([s, c]) => ( setFilterStatus(s)}>
{c}
{s==='all'?'الكل':(STATUS_UI[s]?.label||s)}
))}
setSearchTerm(e.target.value)} className="w-full pl-10 pr-4 py-3 border border-gray-300 rounded-xl focus:outline-none focus:ring-2 focus:ring-amber-500"/>
{filtered.length === 0 ? (

لا توجد حجوزات

لم تقم بأي حجز حتى الآن

) : (
{filtered.map(r => )}
)}
); }