'use client'; import { useState, useRef, useEffect } from 'react'; import { motion, AnimatePresence } from 'framer-motion'; import { usePathname } from 'next/navigation'; import { ShieldCheck, Lock, Zap, Star, Rocket, Search, MapPin, Home, DollarSign, ChevronDown, Shield, Award, Sparkles, UserCircle, LogOut, Calendar, Building, PlusCircle, Heart, MessageCircle } from 'lucide-react'; import HeroSearch from './components/home/HeroSearch'; import PropertyMapWithMarkers from './components/PropertyMapWithMarkers'; import Link from 'next/link'; import Image from 'next/image'; import { getRentProperties, getSaleProperties } from './utils/api'; import { BuildingTypeKeys, PropertyStatusKeys, extractCity } from './enums'; import AuthService from './services/AuthService'; import { useTranslation } from 'react-i18next'; function mapApiProperty(t, item, index) { const info = item.propertyInformation || {}; const dailyPrice = item.dailyRent ?? 0; const monthlyPrice = item.monthlyRent ?? 0; const salePrice = item.price ?? 0; const isRentListing = Boolean(item.dailyRent != null || item.monthlyRent != null); const price = isRentListing ? (dailyPrice || monthlyPrice || 0) : salePrice; const priceUnit = isRentListing ? (monthlyPrice ? 'monthly' : 'daily') : 'sale'; const propType = BuildingTypeKeys[info.buildingType] ?? BuildingTypeKeys[item.type] ?? (item.type || 'apartment'); const status = PropertyStatusKeys[info.status] ?? PropertyStatusKeys[item.status] ?? 'available'; const features = []; if (item.isSmokeAllow) features.push(t('smoke-allowed')); if (item.isVisitorAllow) features.push(t('visitors-allowed')); if (item.specializedFor) features.push(t('specialized')); if (info.numberOfBedRooms) features.push(`${info.numberOfBedRooms} ${t('rooms')}`); if (info.numberOfBathRooms) features.push(`${info.numberOfBathRooms} ${t('bathrooms')}`); const apiBase = typeof window !== 'undefined' ? (process.env.NEXT_PUBLIC_API_URL || 'https://45.93.137.91.nip.io/api') : ''; const rawImages = Array.isArray(info.images) ? info.images : []; const images = rawImages.length > 0 ? rawImages.map(img => img.startsWith('http') ? img : `${apiBase}${img.startsWith('/') ? '' : '/Pictures/'}${img}`) : ['/property-placeholder.jpg']; const ownerSource = info.ownerType == null && item.ownerType == null ? 'all' : [info.ownerType, item.ownerType].find((value) => value != null) === 1 ? 'agency' : 'owner'; return { id: item.id ?? index + 1, title: info.address || t('propertyWithId', { id: item.id || index + 1 }), description: info.description || '', type: propType, price: price, priceUSD: price, priceUnit, listingType: isRentListing ? 'rent' : 'sale', location: { city: extractCity(info.address) || 'damascus', district: 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, features, images, status, rating: item.rating || 4.5, isNew: false, allowedIdentities: ['syrian', 'passport'], priceDisplay: { daily: dailyPrice, monthly: monthlyPrice, sale: salePrice, }, ownerSource, bookings: [], _raw: item, }; } export default function HomePage() { const { t } = useTranslation(); const mapSectionRef = useRef(null); const [searchFilters, setSearchFilters] = useState(null); const [showMap, setShowMap] = useState(false); const [filteredProperties, setFilteredProperties] = useState([]); const [isScrolling, setIsScrolling] = useState(false); const [user, setUser] = useState(null); const [showUserMenu, setShowUserMenu] = useState(false); const menuRef = useRef(null); const pathname = usePathname(); const [allProperties, setAllProperties] = useState([]); const [rentProperties, setRentProperties] = useState([]); const [saleProperties, setSaleProperties] = useState([]); const [loading, setLoading] = useState(true); useEffect(() => { const authUser = AuthService.getUser(); if (authUser) { setUser({ name: authUser.name || authUser.email, email: authUser.email, role: AuthService.isOwner() ? 'owner' : 'customer', }); } else { setUser(null); } }, [pathname]); useEffect(() => { async function fetchProperties() { try { const [rentData, saleData] = await Promise.all([ getRentProperties().catch(() => []), getSaleProperties().catch(() => []), ]); const rentList = Array.isArray(rentData) ? rentData : []; const saleList = Array.isArray(saleData) ? saleData : []; const mappedRent = rentList.map((p, i) => mapApiProperty(t, p, i)); const mappedSale = saleList.map((p, i) => mapApiProperty(t, p, rentList.length + i)); setRentProperties(mappedRent); setSaleProperties(mappedSale); setAllProperties([...mappedRent, ...mappedSale]); } catch (err) { console.error('[Home] Failed to fetch properties:', err); } finally { setLoading(false); } } fetchProperties(); }, []); useEffect(() => { if (searchFilters) { applyFilters(searchFilters); } }, [rentProperties, saleProperties, searchFilters]); const logout = () => { AuthService.deleteToken(); setUser(null); setShowUserMenu(false); }; const applyFilters = (filters) => { setSearchFilters(filters); let propertiesToFilter = []; if (filters.mode === 'rent') { propertiesToFilter = rentProperties; } else if (filters.mode === 'buy' || filters.mode === 'sell') { propertiesToFilter = saleProperties; } else { propertiesToFilter = allProperties; } const filtered = propertiesToFilter.filter(property => { if (filters.city && filters.city !== 'all' && property.location.city !== filters.city) { return false; } if (filters.propertyType && filters.propertyType !== 'all' && property.type !== filters.propertyType) { return false; } if (filters.priceRange && filters.priceRange !== 'all') { const priceUSD = property.priceUSD; switch (filters.priceRange) { case '0-500': if (priceUSD > 50) return false; break; case '500-1000': if (priceUSD < 51 || priceUSD > 100) return false; break; case '1000-2000': if (priceUSD < 101 || priceUSD > 200) return false; break; case '2000-3000': if (priceUSD < 201 || priceUSD > 300) return false; break; case '3000+': if (priceUSD < 301) return false; break; } } if (filters.ownerSource && filters.ownerSource !== 'all') { if (filters.ownerSource === 'owner' && property.ownerSource !== 'owner') return false; if (filters.ownerSource === 'agency' && property.ownerSource !== 'agency') return false; } if (filters.rentPeriod && filters.rentPeriod !== 'all' && property.listingType === 'rent') { if (filters.rentPeriod === 'daily' && !property.priceDisplay.daily) return false; if (filters.rentPeriod === 'monthly' && !property.priceDisplay.monthly) return false; } if (filters.availableToday) { if (property.status !== 'available') return false; } if (filters.identityType && property.allowedIdentities) { if (!property.allowedIdentities.includes(filters.identityType)) { return false; } } return true; }); setFilteredProperties(filtered); if (!showMap) { setShowMap(true); setTimeout(() => { if (mapSectionRef.current) { setIsScrolling(true); mapSectionRef.current.scrollIntoView({ behavior: 'smooth', block: 'center' }); setTimeout(() => setIsScrolling(false), 1000); } }, 300); } else { if (mapSectionRef.current) { setIsScrolling(true); mapSectionRef.current.scrollIntoView({ behavior: 'smooth', block: 'center' }); setTimeout(() => setIsScrolling(false), 1000); } } }; const resetSearch = () => { setShowMap(false); setSearchFilters(null); setFilteredProperties([]); window.scrollTo({ top: 0, behavior: 'smooth' }); }; const getUserInitial = () => { if (user?.name) { return user.name.charAt(0).toUpperCase(); } return null; }; const isOwner = user?.role === 'owner'; return (
{t("heroTitleLine1")}
{t("heroTitleLine2")}
{t("heroSubtitle")}
{!isOwner && } {isOwner && (

{t("ownerGreeting")} {user?.name}!

{t("ownerDescription")}

{t("manageMyProperties")}
)}
{!showMap && !isOwner && ( window.scrollTo({ top: window.innerHeight, behavior: 'smooth' })} > )}
{!isOwner && (<> {showMap && ( {isScrolling && ( )}

{filteredProperties.length > 0 ? t('searchResults') : t('no-properties')}

{t('newSearch')}
{filteredProperties.length > 0 ? (

{t('foundPropertiesCount', { count: filteredProperties.length })}

) : (

{t('noPropertiesMatchFilters')}

)}
{filteredProperties.length > 0 ? ( ({ ...p, lat: p.location.lat, lng: p.location.lng, address: p.location.address }))} onPropertyClick={() => {}} /> ) : (

{t('no-properties')}

{t('try-changing-search-criteria')}

)}
)}
)}

{t('whyChooseUsTitle')}

{t('whyChooseUsSubtitle')}

{t('feature1Title')}

{t('feature1Description')}

{t('feature2Title')}

{t('feature2Description')}

{t('feature3Title')}

{t('feature3Description')}

{filteredProperties.length > 0 && searchFilters && (
{t('filterPropertyTypeLabel')} {searchFilters.propertyType === 'all' ? t('all') : searchFilters.propertyType === 'apartment' ? t('buildingType.apartment') : searchFilters.propertyType === 'villa' ? t('buildingType.villa') : t('house')}
{t('filterPriceRangeLabel')} {searchFilters.priceRange === 'all' ? t('allPrices') : searchFilters.priceRange === '0-500' ? t('priceRangeUnder500') : searchFilters.priceRange === '500-1000' ? t('priceRange50to100') : searchFilters.priceRange === '1000-2000' ? t('priceRange100to200') : searchFilters.priceRange === '2000-3000' ? t('priceRange200to300') : t('priceRangeOver300')}
{t('filterSourceLabel')} {searchFilters.ownerSource === 'all' ? t('all') : searchFilters.ownerSource === 'owner' ? t('fromOwner') : t('fromAgency')}
{t('filterRentTypeLabel')} {searchFilters.rentPeriod === 'all' ? t('all') : searchFilters.rentPeriod === 'daily' ? t('dailyRent') : t('monthlyRent')}
{searchFilters.availableToday && (
{t('availableFromToday')}
)}
)}
); }