From 1c2b88c73058e06df30fec0d6b58a2bb27392f76 Mon Sep 17 00:00:00 2001 From: bender Date: Wed, 11 Mar 2026 18:34:24 +0000 Subject: [PATCH] Update src/hooks/useProductCatalog.ts --- src/hooks/useProductCatalog.ts | 139 +++++++-------------------------- 1 file changed, 30 insertions(+), 109 deletions(-) diff --git a/src/hooks/useProductCatalog.ts b/src/hooks/useProductCatalog.ts index c4ae5cf..4e0d3ce 100644 --- a/src/hooks/useProductCatalog.ts +++ b/src/hooks/useProductCatalog.ts @@ -1,115 +1,36 @@ -"use client"; +import { useState, useEffect } from 'react'; -import { useState, useMemo, useCallback } from "react"; -import { useRouter } from "next/navigation"; -import { useProducts } from "./useProducts"; -import type { Product } from "@/lib/api/product"; -import type { CatalogProduct } from "@/components/ecommerce/productCatalog/ProductCatalogItem"; -import type { ProductVariant } from "@/components/ecommerce/productDetail/ProductDetailCard"; - -export type SortOption = "Newest" | "Price: Low-High" | "Price: High-Low"; - -interface UseProductCatalogOptions { - basePath?: string; +interface CatalogItem { + id: string; + name: string; + category: string; + price: number; + image: string; } -export function useProductCatalog(options: UseProductCatalogOptions = {}) { - const { basePath = "/shop" } = options; - const router = useRouter(); - const { products: fetchedProducts, isLoading } = useProducts(); +export const useProductCatalog = () => { + const [items, setItems] = useState([]); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); - const [search, setSearch] = useState(""); - const [category, setCategory] = useState("All"); - const [sort, setSort] = useState("Newest"); - - const handleProductClick = useCallback((productId: string) => { - router.push(`${basePath}/${productId}`); - }, [router, basePath]); - - const catalogProducts: CatalogProduct[] = useMemo(() => { - if (fetchedProducts.length === 0) return []; - - return fetchedProducts.map((product) => ({ - id: product.id, - name: product.name, - price: product.price, - imageSrc: product.imageSrc, - imageAlt: product.imageAlt || product.name, - rating: product.rating || 0, - reviewCount: product.reviewCount, - category: product.brand, - onProductClick: () => handleProductClick(product.id), - })); - }, [fetchedProducts, handleProductClick]); - - const categories = useMemo(() => { - const categorySet = new Set(); - catalogProducts.forEach((product) => { - if (product.category) { - categorySet.add(product.category); - } - }); - return Array.from(categorySet).sort(); - }, [catalogProducts]); - - const filteredProducts = useMemo(() => { - let result = catalogProducts; - - if (search) { - const q = search.toLowerCase(); - result = result.filter( - (p) => - p.name.toLowerCase().includes(q) || - (p.category?.toLowerCase().includes(q) ?? false) - ); + useEffect(() => { + const fetchCatalog = async () => { + try { + const response = await fetch('/api/products'); + if (!response.ok) { + throw new Error('Failed to fetch catalog'); } - - if (category !== "All") { - result = result.filter((p) => p.category === category); - } - - if (sort === "Price: Low-High") { - result = [...result].sort( - (a, b) => - parseFloat(a.price.replace("$", "").replace(",", "")) - - parseFloat(b.price.replace("$", "").replace(",", "")) - ); - } else if (sort === "Price: High-Low") { - result = [...result].sort( - (a, b) => - parseFloat(b.price.replace("$", "").replace(",", "")) - - parseFloat(a.price.replace("$", "").replace(",", "")) - ); - } - - return result; - }, [catalogProducts, search, category, sort]); - - const filters: ProductVariant[] = useMemo(() => [ - { - label: "Category", - options: ["All", ...categories], - selected: category, - onChange: setCategory, - }, - { - label: "Sort", - options: ["Newest", "Price: Low-High", "Price: High-Low"] as SortOption[], - selected: sort, - onChange: (value) => setSort(value as SortOption), - }, - ], [categories, category, sort]); - - return { - products: filteredProducts, - isLoading, - search, - setSearch, - category, - setCategory, - sort, - setSort, - filters, - categories, + const data = await response.json(); + setItems(data); + } catch (err) { + setError(err instanceof Error ? err.message : 'Unknown error'); + } finally { + setLoading(false); + } }; -} + + fetchCatalog(); + }, []); + + return { items, loading, error }; +};