'use client'; import { useState, useEffect, useMemo } from 'react'; import { motion, AnimatePresence } from 'framer-motion'; import toast, { Toaster } from 'react-hot-toast'; import Link from 'next/link'; import { useParams, useRouter } from 'next/navigation'; import { MapPin, Bed, Bath, Square, DollarSign, Heart, Share2, Phone, Mail, MessageCircle, Calendar, Shield, Star, ChevronLeft, ChevronRight, Check, X, Wifi, Car, Wind, Camera, Home, Building2, Users, Clock, FileText, LogIn, Loader2, ArrowLeft, ImageIcon, ChevronDown, Layers, Sofa, DoorOpen, School, Hospital, Store, TreePine, Building, GraduationCap, ExternalLink, Smile, Ban, Wine, Dog, CassetteTape, Info } from 'lucide-react'; import { getRentProperty, getSaleProperty, getSalePropertyById, bookReservation, getAvailableDateRanges, getOwnerContactInformation } from '../../utils/api'; import AuthService from '../../services/AuthService'; import { useFavorites } from '@/app/contexts/FavoritesContext'; import { BuildingTypeKeys, PropertyStatusKeys, extractCity } from '../../enums'; import PropertyRatingList from '@/app/components/ratings/PropertyRatingList'; import PropertyRatingForm from '@/app/components/ratings/PropertyRatingForm'; import StarRating from '@/app/components/ratings/StarRating'; import { getPropertyAverageRating } from '../../utils/ratings'; import dynamic from 'next/dynamic'; import 'leaflet/dist/leaflet.css'; const MapContainer = dynamic(() => import('react-leaflet').then(m => m.MapContainer), { ssr: false }); const TileLayer = dynamic(() => import('react-leaflet').then(m => m.TileLayer), { ssr: false }); const Marker = dynamic(() => import('react-leaflet').then(m => m.Marker), { ssr: false }); const Popup = dynamic(() => import('react-leaflet').then(m => m.Popup), { ssr: false }); function formatCurrency(amount) { if (!amount || isNaN(amount)) return '0'; return Number(amount).toLocaleString('ar-SA'); } function buildImageUrl(img) { if (!img) return ''; const apiBase = typeof window !== 'undefined' ? (process.env.NEXT_PUBLIC_API_URL || 'https://45.93.137.91.nip.io/api') : ''; if (img.startsWith('http')) return img; return `${apiBase}${img.startsWith('/') ? '' : '/Pictures/'}${img}`; } const serviceLabels = { Electricity: 'كهرباء', Internet: 'إنترنت', Heating: 'تدفئة', Water: 'ماء', Pool: 'مسبح', PrivateGarden: 'حديقة خاصة', Parking: 'موقف سيارات', Security247: 'حراسة 24 س', CentralHeating: 'تدفئة مركزية', CentralAirConditioning: 'تكييف مركزي', EquippedKitchen: 'مطبخ مجهز', MaidsRoom: 'غرفة خادمة', Elevator: 'مصعد', Gym: 'نادي رياضي', Sauna: 'ساونا', Jacuzzi: 'جاكوزي', Balcony: 'بلكونة', Rooftop: 'سطح', Furnished: 'مفروش', AirConditioning: 'تكييف', SatelliteTV: 'تلفاز', Fireplace: 'مدفأة', StudyRoom: 'غرفة دراسة', Storage: 'مستودع', Laundry: 'غرفة غسيل', SmartHome: 'منزل ذكي', }; const termLabels = { NoSmoking: 'ممنوع التدخين', NoAnimals: 'ممنوع الحيوانات الأليفة', NoParties: 'ممنوع الحفلات', NoAlcohol: 'ممنوع الكحول', SuitableForChildren: 'مناسب للأطفال', SuitableForFamilies: 'مناسب للعائلات', SuitableForStudents: 'مناسب للطلاب', SuitableForElderly: 'مناسب لكبار السن', OnlyFemales: 'إناث فقط', OnlyMales: 'ذكور فقط', }; const proximityLabels = { School: 'مدرسة', Hospital: 'مستشفى', Restaurant: 'مطعم', University: 'جامعة', Park: 'حديقة', Mall: 'مركز تسوق', Supermarket: 'سوبر ماركت', Pharmacy: 'صيدلية', Mosque: 'مسجد', Bank: 'بنك', Airport: 'مطار', BusStation: 'موقف باص', }; function mapApiDetail(item) { if (!item) return null; const info = item.propertyInformation || {}; const details = typeof info.detailsJSON === 'object' && info.detailsJSON ? info.detailsJSON : (() => { try { return JSON.parse(info.detailsJSON || '{}'); } catch { return {}; } })(); const isRent = item.dailyRent != null || item.monthlyRent != null; const dailyPrice = item.dailyRent || 0; const monthlyPrice = item.monthlyRent || 0; const salePrice = item.price || 0; const price = isRent ? (monthlyPrice || dailyPrice) : salePrice; const priceUnit = isRent ? (monthlyPrice ? 'monthly' : 'daily') : 'sale'; const propType = BuildingTypeKeys[info.buildingType] ?? BuildingTypeKeys[item.type] ?? 'apartment'; const typeLabel = { apartment: 'شقة', villa: 'فيلا', house: 'بيت', sweet: 'سويت', studio: 'استوديو', office: 'مكتب', shop: 'متجر', warehouse: 'مستودع', farms: 'مزرعة', room: 'غرفة ضمن شقة' }[propType] || 'عقار'; const status = PropertyStatusKeys[info.status] ?? PropertyStatusKeys[item.status] ?? 'available'; const statusLabel = { available: 'متاح', booked: 'محجوز', notAvailable: 'غير متاح', maintenance: 'صيانة' }[status] || 'متاح'; const rawImages = Array.isArray(info.images) ? info.images : []; const photosFallback = Array.isArray(details.photos) ? details.photos : []; const allRaw = rawImages.length > 0 ? rawImages : photosFallback; const images = allRaw.length > 0 ? allRaw.map(buildImageUrl) : []; // Normalize services: Flutter sends list of strings or object with boolean values const rawServices = details.services || {}; const serviceList = Array.isArray(rawServices) ? rawServices : Object.keys(rawServices).filter(k => rawServices[k]); const serviceDetails = details.serviceDetails || {}; const services = {}; serviceList.forEach(s => { services[s] = serviceDetails[s] || true; }); const rawTerms = details.terms || {}; const terms = Array.isArray(rawTerms) ? rawTerms.reduce((acc, t) => ({ ...acc, [t]: true }), {}) : rawTerms; // Try multiple key aliases like Flutter does const floor = details.floorNumber ?? details.floor ?? 0; const salons = details.numberOfSalons ?? details.salonsCount ?? details.salons ?? 0; const balconies = details.numberOfBalconies ?? details.balconiesCount ?? details.balconies ?? 0; const rawProximity = details.nearbyDistances || details.proximity || {}; const proximity = {}; Object.entries(rawProximity).forEach(([k, v]) => { if (!v) return; const normalizedKey = k.charAt(0).toUpperCase() + k.slice(1); proximity[normalizedKey] = v; }); const roomDetails = details.room || details.roomDetails || {}; const displayType = details.displayType || (isRent ? (monthlyPrice && dailyPrice ? 'Both' : monthlyPrice ? 'Monthly' : 'Daily') : 'Sale'); const propertyCondition = details.propertyCondition || ''; const furnished = propertyCondition.toLowerCase().includes('furniture') ? propertyCondition.toLowerCase() === 'withfurniture' : !!item.isFurnished; return { id: item.id, propertyInformationId: info.id, title: details.description || info.address || `عقار #${item.id}`, description: details.description || info.description || '', type: propType, typeLabel, price, priceUnit, priceDisplay: { daily: dailyPrice, monthly: monthlyPrice, sale: salePrice }, isRent, displayType, propertyCondition, furnished, location: { city: extractCity(info.address) || 'دمشق', address: info.address || '', lat: parseFloat(info.cordsX) || 0, lng: parseFloat(info.cordsY) || 0, }, bedrooms: info.numberOfBedRooms || 0, bathrooms: info.numberOfBathRooms || 0, area: info.space || 0, floor, salons, balconies, images, status, statusLabel, services, terms, proximity, roomDetails, details, bookedCount: details.bookedCount || 0, deposit: item.deposit || 0, currencyId: item.currencyId, isSmokeAllow: item.isSmokeAllow, isVisitorAllow: item.isVisitorAllow, specializedFor: item.specializedFor, _raw: item, }; } export default function PropertyDetailsPage() { const params = useParams(); const router = useRouter(); const { isFavorite, addFavorite, removeFavorite } = useFavorites(); const [property, setProperty] = useState(null); const [loading, setLoading] = useState(true); const [currentImage, setCurrentImage] = useState(0); const [showLoginDialog, setShowLoginDialog] = useState(false); const [bookingDates, setBookingDates] = useState({ start: '', end: '' }); const [bookingLoading, setBookingLoading] = useState(false); const [bookingError, setBookingError] = useState(null); const [bookingSuccess, setBookingSuccess] = useState(false); const [availableRanges, setAvailableRanges] = useState([]); const [bookingStep, setBookingStep] = useState('entry'); const [selectedStart, setSelectedStart] = useState(null); const [selectedEnd, setSelectedEnd] = useState(null); const [calendarMonth, setCalendarMonth] = useState(() => new Date().getMonth()); const [calendarYear, setCalendarYear] = useState(() => new Date().getFullYear()); const [pricingMode, setPricingMode] = useState('daily'); const [favLoading, setFavLoading] = useState(false); const [avgRating, setAvgRating] = useState(null); const [showRatingForm, setShowRatingForm] = useState(false); const [showContact, setShowContact] = useState(false); const [contactInfo, setContactInfo] = useState(null); const [ownerData, setOwnerData] = useState(null); useEffect(() => { const id = params.id; if (!id) return; setLoading(true); async function fetchProperty() { try { let data = null; try { data = await getRentProperty(id); } catch {} if (!data) { try { data = await getSalePropertyById(id) || await getSaleProperty(id); } catch {} } if (!data) { try { data = await getSaleProperty(id); } catch {} } if (data) { const mapped = mapApiDetail(data); setProperty(mapped); if (mapped) fetchAvgRating(mapped.id); if (mapped && mapped.isRent) { try { const propInfoId = mapped._raw?.propertyInformationId || mapped.id; const ranges = await getAvailableDateRanges(propInfoId); if (ranges && Array.isArray(ranges)) { setAvailableRanges(ranges); } } catch (e) { console.warn('Failed to fetch date ranges', e); } } } } catch (err) { console.error('[PropertyDetail] Failed:', err); } finally { setLoading(false); } } fetchProperty(); }, [params.id]); const fetchAvgRating = async (propId) => { try { const avg = await getPropertyAverageRating(propId); setAvgRating(avg); } catch {} }; const fetchContactInfo = async () => { if (!property) return; try { const info = await getOwnerContactInformation(property._raw?.propertyInformationId || property.id); setContactInfo(info); setShowContact(true); } catch (err) { toast.error('فشل تحميل معلومات الاتصال'); } }; const handleFavorite = async () => { if (!AuthService.isAuthenticated()) { setShowLoginDialog(true); return; } if (!property) return; setFavLoading(true); try { if (isFavorite(property.id)) { await removeFavorite(property.id); } else { await addFavorite(property.id); } } catch (err) { toast.error('حدث خطأ'); } finally { setFavLoading(false); } }; const handleBookNow = async () => { if (!AuthService.isAuthenticated()) { setShowLoginDialog(true); return; } if (!bookingDates.start || !bookingDates.end) { setBookingError('يرجى تحديد تاريخ البداية والنهاية'); return; } setBookingLoading(true); setBookingError(null); try { await bookReservation(property._raw?.propertyInformationId || property.id, bookingDates.start, bookingDates.end); setBookingSuccess(true); toast.success('تم إرسال طلب الحجز بنجاح'); } catch (err) { setBookingError(err.message || 'فشل الحجز'); } finally { setBookingLoading(false); } }; const MONTHS_AR = ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر']; const DAYS_AR = ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س']; const availableDatesSet = useMemo(() => { const dates = new Set(); if (!Array.isArray(availableRanges)) return dates; availableRanges.forEach(r => { const start = new Date(r.startDate || r.start); const end = new Date(r.endDate || r.end); for (let d = new Date(start); d <= end; d.setDate(d.getDate() + 1)) { dates.add(d.toISOString().split('T')[0]); } }); return dates; }, [availableRanges]); const isDateAvailable = (dateStr) => availableDatesSet.has(dateStr); const isPastDate = (dateStr) => { const today = new Date(); today.setHours(0, 0, 0, 0); return new Date(dateStr) < today; }; const handleDayClick = (dateStr) => { if (bookingStep === 'entry') { setSelectedStart(dateStr); setSelectedEnd(null); setBookingStep('exit'); } else { if (new Date(dateStr) <= new Date(selectedStart)) { setSelectedStart(dateStr); setSelectedEnd(null); setBookingStep('exit'); } else { setSelectedEnd(dateStr); setBookingStep('entry'); } } }; const handleBookingConfirm = async () => { if (!AuthService.isAuthenticated()) { setShowLoginDialog(true); return; } if (!selectedStart || !selectedEnd) { setBookingError('يرجى تحديد تاريخ البداية والنهاية'); return; } setBookingLoading(true); setBookingError(null); try { const propInfoId = property._raw?.propertyInformationId || property.id; const startDate = new Date(selectedStart + 'T00:00:00.000').toISOString(); const endDate = new Date(selectedEnd + 'T00:00:00.000').toISOString(); await bookReservation(propInfoId, startDate, endDate); setBookingSuccess(true); toast.success('تم إرسال طلب الحجز بنجاح'); } catch (err) { setBookingError(err.message || 'فشل الحجز'); } finally { setBookingLoading(false); } }; const navigateMonth = (delta) => { let month = calendarMonth + delta; let year = calendarYear; if (month < 0) { month = 11; year--; } if (month > 11) { month = 0; year++; } setCalendarMonth(month); setCalendarYear(year); }; const handleRatingSuccess = () => { setShowRatingForm(false); if (property) fetchAvgRating(property.id); }; if (loading) { return (

جاري تحميل العقار...

); } if (!property) { return (

العقار غير موجود

لم يتم العثور على العقار المطلوب

العودة إلى العقارات
); } const isFav = isFavorite(property.id); const isRoomType = property.type === 'room'; const isMostRequested = avgRating !== null && avgRating >= 4.5; const showPricingToggle = property.isRent && property.priceDisplay?.daily > 0 && property.priceDisplay?.monthly > 0; const effectivePricingMode = showPricingToggle ? pricingMode : (property.isRent && property.priceDisplay?.monthly > 0 ? 'monthly' : 'daily'); return (
العودة إلى العقارات
{/* Image Gallery */}
{property.images.length > 0 ? ( {property.title} ) : (

لا توجد صور

)} {isMostRequested && (
الأكثر طلباً
)} {property.images.length > 1 && ( <> )}
{property.statusLabel} {property.typeLabel}
{currentImage + 1} / {property.images.length || 1}
{property.images.length > 1 && (
{property.images.map((img, idx) => ( ))}
)}
{/* Property Info */}
{property.typeLabel} {property.statusLabel} {property.isRent && property.displayType && ( {(() => { const dt = property.displayType.toLowerCase(); if (dt === 'both' || dt.includes('both')) return 'يومي وشهري'; if (dt.includes('daily')) return 'يومي'; if (dt.includes('monthly')) return 'شهري'; return dt; })()} )} {property.furnished ? 'مفروش' : 'غير مفروش'}

{property.title}

{property.location.address || property.location.city}
{/* Price */}
{property.isRent ? (
{property.priceDisplay.monthly > 0 && (
{formatCurrency(property.priceDisplay.monthly)} ل.س / شهرياً
)} {property.priceDisplay.daily > 0 && (
{formatCurrency(property.priceDisplay.daily)} ل.س / يومياً
)} {property.deposit > 0 && (
تأمين: {formatCurrency(property.deposit)} ل.س
)}
) : (
{formatCurrency(property.price)} ل.س للبيع
)}
{/* Specs Tiles */}
{property.bedrooms > 0 && (
{property.bedrooms}
غرف نوم
)} {property.bathrooms > 0 && (
{property.bathrooms}
حمامات
)} {property.area > 0 && (
{property.area}
م²
)} {property.floor > 0 && (
{property.floor}
طابق
)} {property.salons > 0 && (
{property.salons}
صالونات
)} {property.balconies > 0 && (
{property.balconies}
بلكونات
)} {avgRating !== null && avgRating > 0 && (
{avgRating.toFixed(1)}
التقييم
)} {property.bookedCount > 0 && (
{property.bookedCount}
حجوزات
)}
{/* Description */} {property.description && (

الوصف

{property.description}

)} {/* Features */}
{property.isSmokeAllow && يسمح بالتدخين} {!property.isSmokeAllow && ممنوع التدخين} {property.isVisitorAllow && يسمح بالزوار} {property.specializedFor && {property.specializedFor}}
{/* Services with detail text */} {property.services && (Array.isArray(property.services) ? property.services.length > 0 : Object.keys(property.services).length > 0) && (

الخدمات

{Array.isArray(property.services) ? ( property.services.map((svc, i) => ( {serviceLabels[svc] || svc} )) ) : ( Object.entries(property.services).map(([key, val]) => { if (!val) return null; const detail = typeof val === 'object' && val.detail ? val.detail : (typeof val === 'string' ? val : null); return ( {serviceLabels[key] || key} {detail && · {detail}} ); }) )}
)} {/* Room Details (only for room type) */} {isRoomType && Object.keys(property.roomDetails).length > 0 && (

تفاصيل الغرفة

{(() => { const rd = property.roomDetails; const items = []; if (rd.areaType) items.push({ label: 'نوع المساحة', value: rd.areaType === 'private room' ? 'غرفة خاصة' : rd.areaType === 'shared room' ? 'غرفة مشتركة' : rd.areaType }); if (rd.peopleAllowed) items.push({ label: 'عدد الأشخاص', value: rd.peopleAllowed }); if (rd.furnitureDetails || rd.furniture) items.push({ label: 'الأثاث', value: rd.furnitureDetails || rd.furniture }); if (rd.entranceType) items.push({ label: 'نوع المدخل', value: rd.entranceType === 'shared entrance' ? 'مدخل مشترك' : rd.entranceType === 'independent entrance' ? 'مدخل مستقل' : rd.entranceType }); if (rd.bathroomType) items.push({ label: 'الحمام', value: rd.bathroomType === 'room specific' ? 'خاص بالغرفة' : rd.bathroomType === 'shared' ? 'مشترك' : rd.bathroomType }); if (rd.kitchenType) items.push({ label: 'المطبخ', value: rd.kitchenType === 'shared' ? 'مشترك' : rd.kitchenType === 'not available' ? 'غير متوفر' : rd.kitchenType }); if (rd.homeResidentsCount ?? rd.residents) items.push({ label: 'عدد السكان', value: rd.homeResidentsCount ?? rd.residents }); if (rd.currentPopulationGender) items.push({ label: 'جنس السكان', value: rd.currentPopulationGender === 'men' ? 'رجال' : rd.currentPopulationGender === 'women' ? 'نساء' : rd.currentPopulationGender === 'family' ? 'عائلة' : rd.currentPopulationGender }); if (rd.dedicatedTo) items.push({ label: 'مخصص لـ', value: rd.dedicatedTo === 'men only' ? 'رجال فقط' : rd.dedicatedTo === 'women only' ? 'نساء فقط' : rd.dedicatedTo === 'families only' ? 'عائلات فقط' : rd.dedicatedTo === 'everyone' ? 'الجميع' : rd.dedicatedTo }); if (rd.hasRestrictedOwnerAreas !== undefined) items.push({ label: 'مناطق ممنوعة', value: rd.hasRestrictedOwnerAreas ? 'نعم' : 'لا' }); if (rd.hasChildren !== undefined) items.push({ label: 'أطفال', value: rd.hasChildren ? 'مسموح' : 'غير مسموح' }); if (rd.hasPets !== undefined) items.push({ label: 'حيوانات أليفة', value: rd.hasPets ? 'مسموح' : 'غير مسموح' }); if (rd.languageDialect) items.push({ label: 'اللغة', value: rd.languageDialect }); if (rd.visitorsAllowed !== undefined) items.push({ label: 'الزوار', value: rd.visitorsAllowed ? 'مسموح' : 'ممنوع' }); if (rd.quietTimesEnabled ?? rd.quietTimes) items.push({ label: 'أوقات الهدوء', value: rd.quietTimesDetails || rd.quietTimes || (rd.quietTimesEnabled ? 'مفعلة' : '') }); return items.map((item, i) => (
{item.label}
{item.value}
)); })()}
)} {/* Proximity */} {Object.keys(property.proximity).length > 0 && (

القرب من الخدمات

{Object.entries(property.proximity).map(([key, val]) => { if (!val) return null; const dist = typeof val === 'object' ? val.distance : val; return (
{key === 'School' && } {key === 'Hospital' && } {key === 'Restaurant' && } {key === 'University' && } {key === 'Park' && } {key === 'Mall' && } {!['School','Hospital','Restaurant','University','Park','Mall'].includes(key) && }
{proximityLabels[key] || key}
{dist} {typeof dist === 'number' ? 'كم' : ''}
); })}
)} {/* Terms as checklist */} {Object.keys(property.terms).length > 0 && (

الشروط

{Object.entries(property.terms).map(([key, val]) => { if (!val) return null; return (
{key.startsWith('No') || key.startsWith('Only') ? ( ) : ( )} {termLabels[key] || key}
); })}
)}
{/* Map */} {property.location.lat && property.location.lng && (
{property.title}
موقع تقريبي — يظهر الموقع الدقيق بعد تأكيد الحجز
)} {/* Ratings Section */} {AuthService.isAuthenticated() && !showRatingForm && ( setShowRatingForm(true)}>

قيّم هذا العقار

شارك تجربتك مع المستأجرين الآخرين

)} {showRatingForm && ( setShowRatingForm(false)} /> )}
{/* Sidebar */}
{/* Booking Card */} {property.isRent && (

حجز العقار

{bookingSuccess ? (

تم إرسال طلب الحجز

سيتم مراجعة طلبك من قبل المالك

) : ( <> {/* Pricing Mode Toggle */} {showPricingToggle && (
)} {/* Step Indicator */}
تحديد تاريخ البداية
تحديد تاريخ النهاية
{/* Calendar */} {effectivePricingMode === 'daily' ? (
{MONTHS_AR[calendarMonth]} {calendarYear}
{DAYS_AR.map((d, i) => (
{d}
))}
{(() => { const firstDay = new Date(calendarYear, calendarMonth, 1).getDay(); const daysInMonth = new Date(calendarYear, calendarMonth + 1, 0).getDate(); const adjustedFirstDay = (firstDay + 1) % 7; const cells = []; for (let i = 0; i < adjustedFirstDay; i++) { cells.push(
); } for (let day = 1; day <= daysInMonth; day++) { const dateStr = `${calendarYear}-${String(calendarMonth + 1).padStart(2, '0')}-${String(day).padStart(2, '0')}`; const past = isPastDate(dateStr); const available = isDateAvailable(dateStr); const isSelStart = dateStr === selectedStart; const isSelEnd = dateStr === selectedEnd; const inRange = selectedStart && selectedEnd && new Date(dateStr) > new Date(selectedStart) && new Date(dateStr) < new Date(selectedEnd); const disabled = past || !available; cells.push( ); } return
{cells}
; })()}
) : (
{calendarYear}
{MONTHS_AR.map((name, idx) => { const monthStr = `${calendarYear}-${String(idx + 1).padStart(2, '0')}`; const isSelStart = selectedStart && selectedStart.startsWith(monthStr); const isSelEnd = selectedEnd && selectedEnd.startsWith(monthStr); const inRange = selectedStart && selectedEnd && monthStr > selectedStart.substring(0, 7) && monthStr < selectedEnd.substring(0, 7); return ( ); })}
)} {/* Summary */} {selectedStart && (
تاريخ البداية {selectedStart}
{selectedEnd && ( <>
تاريخ النهاية {selectedEnd}
{effectivePricingMode === 'daily' ? 'عدد الأيام' : 'عدد الأشهر'} {effectivePricingMode === 'daily' ? Math.max(1, Math.round((new Date(selectedEnd) - new Date(selectedStart)) / (1000 * 60 * 60 * 24)) + 1) : (new Date(selectedEnd).getMonth() - new Date(selectedStart).getMonth() + (new Date(selectedEnd).getFullYear() - new Date(selectedStart).getFullYear()) * 12) + 1}
المجموع {formatCurrency(effectivePricingMode === 'daily' ? Math.max(1, Math.round((new Date(selectedEnd) - new Date(selectedStart)) / (1000 * 60 * 60 * 24)) + 1) * property.priceDisplay.daily : ((new Date(selectedEnd).getMonth() - new Date(selectedStart).getMonth() + (new Date(selectedEnd).getFullYear() - new Date(selectedStart).getFullYear()) * 12) + 1) * property.priceDisplay.monthly)} ل.س
{property.deposit > 0 && (
تأمين {formatCurrency(property.deposit)} ل.س
)} )}
)} {bookingError && (
{bookingError}
)} )} )} {/* Contact Card */}

معلومات المالك

{showContact && contactInfo ? (
{contactInfo.phone || contactInfo.phoneNumber || '—'}
{contactInfo.whatsAppNumber && ( {contactInfo.whatsAppNumber} )}
) : ( )}
{/* Login Dialog */} {showLoginDialog && (
setShowLoginDialog(false)}>
e.stopPropagation()}>

تسجيل الدخول مطلوب

للحجز أو إضافة المفضلة، سجل دخولك.

تسجيل الدخول إنشاء حساب
)}
); }