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 => (
))}