'use client'; import { useEffect, useState, useMemo } from 'react'; // Core columns for performance and usability const columns = [ 'uuid', 'sku', 'brandName', 'productName', 'department', 'category', 'subcategory', 'retailPrice', 'salePrice', 'imageUrl', ]; export default function AdminProductsPage() { const [products, setProducts] = useState([]); const [total, setTotal] = useState(0); const [page, setPage] = useState(1); const [limit, setLimit] = useState(50); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); // Filter state const [brand, setBrand] = useState(''); const [department, setDepartment] = useState(''); const [category, setCategory] = useState(''); const [subcategory, setSubcategory] = useState(''); useEffect(() => { setLoading(true); setError(null); fetch(`/api/products?page=${page}&limit=${limit}`) .then(res => res.json()) .then(data => { setProducts(data.data || []); setTotal(data.total || 0); setLoading(false); }) .catch(err => { setError(err.message || 'Error fetching products'); setLoading(false); }); }, [page, limit]); // Get unique filter options from current page's products const brandOptions = useMemo(() => Array.from(new Set(products.map(p => p.brandName).filter(Boolean))).sort(), [products]); const departmentOptions = useMemo(() => Array.from(new Set(products.map(p => p.department).filter(Boolean))).sort(), [products]); const categoryOptions = useMemo(() => Array.from(new Set(products.map(p => p.category).filter(Boolean))).sort(), [products]); const subcategoryOptions = useMemo(() => Array.from(new Set(products.map(p => p.subcategory).filter(Boolean))).sort(), [products]); // Filter products before rendering const filteredProducts = useMemo(() => { return products.filter(p => (!brand || p.brandName === brand) && (!department || p.department === department) && (!category || p.category === category) && (!subcategory || p.subcategory === subcategory) ); }, [products, brand, department, category, subcategory]); // Reset to page 1 when filters change useEffect(() => { setPage(1); }, [brand, department, category, subcategory]); return (

Admin Products

{error &&
{error}
} {/* Filters */}
{columns.map(col => ( ))} {loading ? ( ) : filteredProducts.length === 0 ? ( ) : ( filteredProducts.map((product, i) => ( {columns.map(col => ( ))} )) )}
{col}
Loading...
No products found.
{col === 'imageUrl' && product[col] ? ( thumb ) : ( product[col] ?? '' )}
{/* Pagination Controls */}
Page {page} of {Math.ceil(total / limit) || 1} Total: {total}
); }