From b9328b3e440a78a9449f4c11cd2e6690849f3971 Mon Sep 17 00:00:00 2001 From: Dosseh91 <98787470+Dosseh91@users.noreply.github.com> Date: Wed, 17 Dec 2025 23:22:00 +0100 Subject: [PATCH] uPGRADED lISTING MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ✔ Home → Category click ✔ Categories page → Category click ✔ URL uses clean slug ✔ Listings filter correctly ✔ No redirect loops ✔ No empty results bug --- src/pages/Listings.tsx | 45 +++++++++++++++++++----------------------- 1 file changed, 20 insertions(+), 25 deletions(-) diff --git a/src/pages/Listings.tsx b/src/pages/Listings.tsx index 184989f..bfadde3 100644 --- a/src/pages/Listings.tsx +++ b/src/pages/Listings.tsx @@ -1,6 +1,6 @@ import { useState, useEffect } from 'react'; import { useSearchParams } from 'react-router-dom'; -import { ListFilter, Search, X } from 'lucide-react'; +import { Search } from 'lucide-react'; import ListingCard from '../components/listings/ListingCard'; import Button from '../components/common/Button'; @@ -12,10 +12,9 @@ const Listings: React.FC = () => { const [listings, setListings] = useState([]); const [filteredListings, setFilteredListings] = useState([]); - const [isFiltersOpen, setIsFiltersOpen] = useState(false); /* ---------------- URL FILTERS ---------------- */ - const categoryFilter = searchParams.get('category') || ''; + const categorySlug = searchParams.get('category') || ''; const priceMinFilter = searchParams.get('price_min') || ''; const priceMaxFilter = searchParams.get('price_max') || ''; const searchFilter = searchParams.get('search') || ''; @@ -23,7 +22,7 @@ const Listings: React.FC = () => { /* ---------------- FORM STATE ---------------- */ const [filters, setFilters] = useState({ - category: categoryFilter, + category: categorySlug, priceMin: priceMinFilter, priceMax: priceMaxFilter, search: searchFilter, @@ -41,6 +40,7 @@ const Listings: React.FC = () => { useEffect(() => { let result = [...listings]; + // 🔎 Search if (searchFilter) { const q = searchFilter.toLowerCase(); result = result.filter( @@ -50,24 +50,24 @@ const Listings: React.FC = () => { ); } - if (categoryFilter) { - result = result.filter( - (l) => l.categoryId === categoryFilter - ); + // 🏷 Category (slug → id) + if (categorySlug) { + const category = categories.find(c => c.slug === categorySlug); + if (category) { + result = result.filter(l => l.categoryId === category.id); + } } + // 💰 Price if (priceMinFilter) { - result = result.filter( - (l) => l.price >= Number(priceMinFilter) - ); + result = result.filter(l => l.price >= Number(priceMinFilter)); } if (priceMaxFilter) { - result = result.filter( - (l) => l.price <= Number(priceMaxFilter) - ); + result = result.filter(l => l.price <= Number(priceMaxFilter)); } + // ↕ Sort switch (sortBy) { case 'price_low': result.sort((a, b) => a.price - b.price); @@ -93,7 +93,7 @@ const Listings: React.FC = () => { setFilteredListings(result); }, [ listings, - categoryFilter, + categorySlug, priceMinFilter, priceMaxFilter, searchFilter, @@ -105,7 +105,7 @@ const Listings: React.FC = () => { e: React.ChangeEvent ) => { const { name, value } = e.target; - setFilters((prev) => ({ ...prev, [name]: value })); + setFilters(prev => ({ ...prev, [name]: value })); }; const applyFilters = (e: React.FormEvent) => { @@ -119,7 +119,6 @@ const Listings: React.FC = () => { params.set('sort', sortBy); setSearchParams(params); - setIsFiltersOpen(false); }; const clearFilters = () => { @@ -132,20 +131,16 @@ const Listings: React.FC = () => { setSearchParams(new URLSearchParams({ sort: sortBy })); }; - const hasActiveFilters = - categoryFilter || priceMinFilter || priceMaxFilter || searchFilter; + const activeCategory = categories.find(c => c.slug === categorySlug); /* ---------------- UI ---------------- */ return (

Browse Listings

- {categoryFilter && ( + {activeCategory && (

- Category:{' '} - - {categories.find(c => c.id === categoryFilter)?.name} - + Category: {activeCategory.name}

)} @@ -164,7 +159,7 @@ const Listings: React.FC = () => { {/* RESULTS */} {filteredListings.length > 0 ? (
- {filteredListings.map((listing) => ( + {filteredListings.map(listing => ( ))}