import React, { useState, useEffect, useMemo } from "react"; import { useSearchParams } from "react-router-dom"; import axios from "axios"; import { Search, SlidersHorizontal, X, Grid3X3, LayoutList, } from "lucide-react"; import { Button } from "../components/ui/button"; import { Input } from "../components/ui/input"; import { Badge } from "../components/ui/badge"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "../components/ui/select"; import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetTrigger, } from "../components/ui/sheet"; import { Slider } from "../components/ui/slider"; import ProductCard from "../components/cards/ProductCard"; import { getCached, setCache } from "../utils/apiCache"; const API = `${process.env.REACT_APP_BACKEND_URL}/api`; const Products = () => { const [searchParams, setSearchParams] = useSearchParams(); const [products, setProducts] = useState([]); const [loading, setLoading] = useState(true); const [search, setSearch] = useState(searchParams.get("search") || ""); const [category, setCategory] = useState( searchParams.get("category") || "all", ); const [priceRange, setPriceRange] = useState([0, 3000]); const [sortBy, setSortBy] = useState("name"); const [viewMode, setViewMode] = useState("grid"); const [filtersOpen, setFiltersOpen] = useState(false); const categories = [ { value: "all", label: "All Products" }, { value: "phones", label: "Phones" }, { value: "laptops", label: "Laptops" }, { value: "tablets", label: "Tablets" }, { value: "wearables", label: "Wearables" }, { value: "accessories", label: "Accessories" }, ]; useEffect(() => { // Scroll to top when component mounts window.scrollTo(0, 0); }, []); useEffect(() => { fetchProducts(); }, [category, search]); // Auto-refresh every 5 seconds for real-time updates useEffect(() => { const interval = setInterval(() => { fetchProducts(true); // Silent refresh without loading spinner }, 5000); // 5 seconds return () => clearInterval(interval); }, [category, search]); // Refresh products when user returns to the tab useEffect(() => { const handleVisibilityChange = () => { if (!document.hidden) { fetchProducts(); } }; document.addEventListener("visibilitychange", handleVisibilityChange); return () => document.removeEventListener("visibilitychange", handleVisibilityChange); }, [category, search]); const fetchProducts = async (silent = false) => { if (!silent) setLoading(true); try { const params = new URLSearchParams(); if (category && category !== "all") params.append("category", category); if (search) params.append("search", search); const response = await axios.get(`${API}/products?${params.toString()}`); setProducts(response.data); } catch (error) { console.error("Failed to fetch products:", error); } finally { setLoading(false); } }; const handleSearch = (e) => { e.preventDefault(); setSearchParams({ search, category }); fetchProducts(); }; const handleCategoryChange = (value) => { setCategory(value); setSearchParams({ search, category: value }); }; const clearFilters = () => { setSearch(""); setCategory("all"); setPriceRange([0, 3000]); setSearchParams({}); }; const filteredProducts = products .filter((p) => p.price >= priceRange[0] && p.price <= priceRange[1]) .sort((a, b) => { if (sortBy === "price-low") return a.price - b.price; if (sortBy === "price-high") return b.price - a.price; return a.name.localeCompare(b.name); }); const activeFiltersCount = [ category !== "all", search !== "", priceRange[0] > 0 || priceRange[1] < 3000, ].filter(Boolean).length; const FilterContent = () => (
Discover our wide range of premium electronics
Try adjusting your search or filters
Showing {filteredProducts.length} products