"use client"; import { useState, useEffect } from "react"; import { useSearchParams } from "next/navigation"; import Footer from "@/components/Footer"; import InnerBanner from "@/components/InnerBanner"; import PropertyFilters, { FilterState } from "@/components/PropertyFilters"; import PropertyCard from "@/components/PropertyCard"; import { properties } from "@/data/properties"; import { motion } from "framer-motion"; interface PropertiesClientProps { initialFilters?: Partial; headerRenderer?: (props: { filteredCount: number; totalCount: number }) => React.ReactNode; bannerTitle?: string; bannerSubtitle?: string; bannerBackgroundImage?: string; } export default function PropertiesClient({ initialFilters, headerRenderer, bannerTitle = "Our Properties", bannerSubtitle = "Discover your dream home from our exclusive collection of premium properties", bannerBackgroundImage = "/assets/images/projects/projects-banner.webp" }: PropertiesClientProps = {}) { const searchParams = useSearchParams(); const [filteredProperties, setFilteredProperties] = useState(properties); const [initializedFilters, setInitializedFilters] = useState | undefined>(undefined); const [isInitialized, setIsInitialized] = useState(false); useEffect(() => { const search = searchParams.get("search") || ""; const type = searchParams.get("type") || "all"; const initial: Partial = { search, type, budgetMin: "", budgetMax: "", bhk: "all", sortBy: "popularity" }; setInitializedFilters(initial); // Initial filter run const filters = { search, type, budgetMin: "", budgetMax: "", bhk: "all", sortBy: "popularity" }; handleFilterChange(filters); setIsInitialized(true); }, [searchParams]); const handleFilterChange = (filters: FilterState) => { let filtered = [...properties]; // Search filter if (filters.search) { filtered = filtered.filter(p => p.title.toLowerCase().includes(filters.search.toLowerCase()) || p.location.toLowerCase().includes(filters.search.toLowerCase()) || p.builder?.name.toLowerCase().includes(filters.search.toLowerCase()) ); } // Type filter if (filters.type !== "all") { filtered = filtered.filter(p => p.category === filters.type); } // BHK filter if (filters.bhk !== "all") { filtered = filtered.filter(p => p.overview.bhk.includes(filters.bhk)); } // Budget filter if (filters.budgetMin || filters.budgetMax) { filtered = filtered.filter(p => { const priceStr = p.price.replace(/[^0-9.]/g, ""); const price = parseFloat(priceStr); const min = filters.budgetMin ? parseFloat(filters.budgetMin) : 0; const max = filters.budgetMax ? parseFloat(filters.budgetMax) : Infinity; return price >= min && price <= max; }); } // Sort if (filters.sortBy === "price-low") { filtered.sort((a, b) => { const priceA = parseFloat(a.price.replace(/[^0-9.]/g, "")); const priceB = parseFloat(b.price.replace(/[^0-9.]/g, "")); return priceA - priceB; }); } else if (filters.sortBy === "price-high") { filtered.sort((a, b) => { const priceA = parseFloat(a.price.replace(/[^0-9.]/g, "")); const priceB = parseFloat(b.price.replace(/[^0-9.]/g, "")); return priceB - priceA; }); } setFilteredProperties(filtered); }; if (!isInitialized) return null; // Logic to wait for params return (
{headerRenderer ? ( headerRenderer({ filteredCount: filteredProperties.length, totalCount: properties.length }) ) : ( Browse Our Properties )} {/* Property Grid */} {filteredProperties.length > 0 ? (
{filteredProperties.map((property, index) => ( ))}
) : (

No properties found

Try adjusting your filters to see more results

)}
); }