import React, { useState, useEffect } from 'react'; import { useLocation, useSearchParams } from 'react-router-dom'; import { ListFilter, Search, ChevronDown, X } from 'lucide-react'; import ListingCard from '../components/listings/ListingCard'; import Button from '../components/common/Button'; import { Listing } from '../types'; import { listings as mockListings, categories } from '../data/mockData'; const Listings: React.FC = () => { const [searchParams, setSearchParams] = useSearchParams(); const location = useLocation(); const [listings, setListings] = useState([]); const [filteredListings, setFilteredListings] = useState([]); const [isFiltersOpen, setIsFiltersOpen] = useState(false); // Parse filters from URL const categoryFilter = searchParams.get('category') || ''; const priceMinFilter = searchParams.get('price_min') || ''; const priceMaxFilter = searchParams.get('price_max') || ''; const searchFilter = searchParams.get('search') || ''; const sortBy = searchParams.get('sort') || 'newest'; // Form state const [filters, setFilters] = useState({ category: categoryFilter, priceMin: priceMinFilter, priceMax: priceMaxFilter, search: searchFilter, }); // Initialize with mock data (only approved listings) useEffect(() => { const approvedListings = mockListings.filter(listing => listing.status === 'approved'); setListings(approvedListings); }, []); // Apply filters useEffect(() => { let result = [...listings]; // Apply search filter if (searchFilter) { const searchLower = searchFilter.toLowerCase(); result = result.filter(listing => listing.title.toLowerCase().includes(searchLower) || listing.description.toLowerCase().includes(searchLower) ); } // Apply category filter if (categoryFilter) { result = result.filter(listing => listing.categoryId === categoryFilter); } // Apply price filters if (priceMinFilter) { const min = parseFloat(priceMinFilter); result = result.filter(listing => listing.price >= min); } if (priceMaxFilter) { const max = parseFloat(priceMaxFilter); result = result.filter(listing => listing.price <= max); } // Apply sorting if (sortBy === 'price_low') { result.sort((a, b) => a.price - b.price); } else if (sortBy === 'price_high') { result.sort((a, b) => b.price - a.price); } else if (sortBy === 'oldest') { result.sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime()); } else { // Default: newest first result.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()); } setFilteredListings(result); }, [listings, categoryFilter, priceMinFilter, priceMaxFilter, searchFilter, sortBy]); const handleFilterChange = (e: React.ChangeEvent) => { const { name, value } = e.target; setFilters(prev => ({ ...prev, [name]: value })); }; const applyFilters = (e: React.FormEvent) => { e.preventDefault(); // Update URL with filters const newSearchParams = new URLSearchParams(); if (filters.category) newSearchParams.set('category', filters.category); if (filters.priceMin) newSearchParams.set('price_min', filters.priceMin); if (filters.priceMax) newSearchParams.set('price_max', filters.priceMax); if (filters.search) newSearchParams.set('search', filters.search); if (sortBy) newSearchParams.set('sort', sortBy); setSearchParams(newSearchParams); // Close mobile filters setIsFiltersOpen(false); }; const clearFilters = () => { setFilters({ category: '', priceMin: '', priceMax: '', search: '', }); setSearchParams(new URLSearchParams({ sort: sortBy })); }; const hasActiveFilters = categoryFilter || priceMinFilter || priceMaxFilter || searchFilter; const handleSortChange = (e: React.ChangeEvent) => { const newSortValue = e.target.value; // Update URL with new sort parameter but keep existing filters const newSearchParams = new URLSearchParams(searchParams); newSearchParams.set('sort', newSortValue); setSearchParams(newSearchParams); }; return (

Browse Listings

Explore our collection of quality, verified listings from professional agencies

{/* Search and filter bar */}
{/* Filter panel */} {isFiltersOpen && (

Filters

)} {/* Active filters badges */} {hasActiveFilters && (
Active Filters: {categoryFilter && ( {categories.find(c => c.id === categoryFilter)?.name || 'Category'} )} {priceMinFilter && ( Min: ${priceMinFilter} )} {priceMaxFilter && ( Max: ${priceMaxFilter} )} {searchFilter && ( Search: "{searchFilter}" )}
)} {/* Results count */}

Showing {filteredListings.length} results {hasActiveFilters ? ' with applied filters' : ''}

{/* Listings grid */} {filteredListings.length > 0 ? (
{filteredListings.map(listing => ( ))}
) : (

No Listings Found

We couldn't find any listings matching your criteria.

)}
); }; export default Listings;