'use client';
import { useState, useEffect, useCallback } from 'react';
import { motion, AnimatePresence } from 'framer-motion';
import {
Home, Star, MapPin, Calendar, Clock, Check, X, Loader2,
User, MessageCircle, ChevronDown, Image as ImageIcon,
} from 'lucide-react';
import toast, { Toaster } from 'react-hot-toast';
import { getUserReservations } from '../utils/api';
import AuthService from '../services/AuthService';
import PropertyRatingForm from '../components/ratings/PropertyRatingForm';
const STATUS_MAP = ['pending', 'ownerConfirmed', 'depositPaid', 'depositConfirmed', 'completed', 'cancelled'];
const STATUS_CONFIG = {
pending: { label: 'قيد الانتظار', color: 'bg-yellow-100 text-yellow-800 border-yellow-300' },
ownerConfirmed: { label: 'مؤكد من المالك', color: 'bg-blue-100 text-blue-800 border-blue-300' },
depositPaid: { label: 'تم دفع السلفة', color: 'bg-orange-100 text-orange-800 border-orange-300' },
depositConfirmed: { label: 'مؤكد', color: 'bg-green-100 text-green-800 border-green-300' },
completed: { label: 'منتهي', color: 'bg-teal-100 text-teal-800 border-teal-300' },
cancelled: { label: 'ملغي', color: 'bg-red-100 text-red-800 border-red-300' },
};
const API_BASE = process.env.NEXT_PUBLIC_API_URL || 'https://45.93.137.91.nip.io/api';
function StatusBadge({ code }) {
const key = STATUS_MAP[code] || 'pending';
const cfg = STATUS_CONFIG[key];
return (
{cfg.label}
);
}
function ReservationCard({ reservation: r, onRate }) {
const isCompleted = STATUS_MAP[r.status] === 'completed';
const imgSrc = r.propertyImage || r._prop?.images?.[0] || (r.propertyInfo?.images?.[0]);
const imageUrl = imgSrc ? `${API_BASE}${imgSrc}` : null;
const address = r.propertyAddress || r._prop?.address || '';
const beds = r._prop?.numberOfBedRooms ?? r.numberOfBedRooms ?? 0;
const baths = r._prop?.numberOfBathRooms ?? r.numberOfBathRooms ?? 0;
return (
عقار #{r.propertyId || r.id}
{imageUrl ? (
) : (
)}
{address && (
{address}
)}
{(beds > 0 || baths > 0) && (
{beds > 0 && {beds} غرف}
{baths > 0 && {baths} حمامات}
)}
من
{new Date(r.startDate).toLocaleDateString('ar')}
إلى
{new Date(r.endDate).toLocaleDateString('ar')}
{r.totalPrice?.toLocaleString() ?? '—'}
السعر الإجمالي
رقم الحجز: #{r.id}
{isCompleted && (
)}
);
}
export default function BookedPropertiesPage() {
const [reservations, setReservations] = useState([]);
const [loading, setLoading] = useState(true);
const [ratingReservation, setRatingReservation] = useState(null);
const [expandedId, setExpandedId] = useState(null);
useEffect(() => {
if (!AuthService.getToken()) {
toast.error('يرجى تسجيل الدخول أولاً');
setLoading(false);
return;
}
loadReservations();
}, []);
const loadReservations = useCallback(async () => {
try {
const data = await getUserReservations();
setReservations(Array.isArray(data) ? data : []);
} catch (err) {
console.error(err);
toast.error('فشل تحميل الحجوزات');
setReservations([]);
} finally {
setLoading(false);
}
}, []);
if (loading) {
return (
);
}
return (
العقارات المحجوزة
لديك {reservations.length} حجز
{reservations.length > 0 && (
)}
{reservations.length === 0 ? (
لا توجد حجوزات
لم تقم بحجز أي عقار حتى الآن
) : (
{reservations.map((r, i) => (
setRatingReservation(r)} />
))}
)}
{reservations.filter(r => STATUS_MAP[r.status] === 'completed').length > 0 && (
تقييم العقارات
يمكنك تقييم العقارات المنتهية حجزها لمساعدة المستأجرين الآخرين
)}
{ratingReservation && (
setRatingReservation(null)}>
e.stopPropagation()}>
{ setRatingReservation(null); toast.success('تم إرسال التقييم بنجاح!'); }}
onCancel={() => setRatingReservation(null)}
/>
)}
);
}