ProductList.jsx 2.83 KB
import React, { useState, useEffect } from 'react'
import { useSearchParams } from 'react-router-dom'
import { productService } from '../services/api/productService'
import ProductList from '../components/product/ProductList'
import ProductFilter from '../components/product/ProductFilter'
import Pagination from '../components/common/Pagination'
import LoadingSpinner from '../components/common/LoadingSpinner'

const ProductListPage = () => {
  const [products, setProducts] = useState([])
  const [loading, setLoading] = useState(true)
  const [totalPages, setTotalPages] = useState(1)
  const [searchParams, setSearchParams] = useSearchParams()

  const page = parseInt(searchParams.get('page')) || 1
  const search = searchParams.get('search') || ''
  const category = searchParams.get('category') || ''
  const sort = searchParams.get('sort') || ''

  useEffect(() => {
    const loadProducts = async () => {
      try {
        setLoading(true)
        const params = {
          page,
          limit: 12,
          search,
          category,
          sort
        }
        
        const response = await productService.getProducts(params)
        setProducts(response.products)
        setTotalPages(response.totalPages)
      } catch (error) {
        console.error('Failed to load products:', error)
      } finally {
        setLoading(false)
      }
    }

    loadProducts()
  }, [page, search, category, sort])

  const handleFilterChange = (newFilters) => {
    const params = new URLSearchParams(searchParams)
    params.set('page', '1')
    
    Object.entries(newFilters).forEach(([key, value]) => {
      if (value) {
        params.set(key, value)
      } else {
        params.delete(key)
      }
    })
    
    setSearchParams(params)
  }

  const handlePageChange = (newPage) => {
    const params = new URLSearchParams(searchParams)
    params.set('page', newPage.toString())
    setSearchParams(params)
  }

  if (loading) {
    return <LoadingSpinner />
  }

  return (
    <div className="product-list-page">
      <div className="container">
        <div className="page-header">
          <h1>Products</h1>
          {search && <p>Search results for: "{search}"</p>}
        </div>

        <div className="product-list-content">
          <aside className="filters-sidebar">
            <ProductFilter 
              onFilterChange={handleFilterChange}
              currentFilters={{ search, category, sort }}
            />
          </aside>

          <main className="products-main">
            <ProductList products={products} />
            
            {products.length > 0 && (
              <Pagination
                currentPage={page}
                totalPages={totalPages}
                onPageChange={handlePageChange}
              />
            )}
          </main>
        </div>
      </div>
    </div>
  )
}

export default ProductListPage