import { Star, ArrowUpRight, Loader2 } from "lucide-react"; import { cls } from "@/lib/utils"; import ImageOrVideo from "@/components/ui/ImageOrVideo"; import useProducts from "@/hooks/useProducts"; import type { ProductVariant } from "./ProductDetailCard"; type CatalogProduct = { id: string; name: string; price: string; imageSrc: string; category?: string; rating?: number; reviewCount?: string; onClick?: () => void; }; type ProductCatalogProps = { products?: CatalogProduct[]; searchValue?: string; onSearchChange?: (value: string) => void; filters?: ProductVariant[]; }; const ProductCatalog = ({ products: productsProp, searchValue = "", onSearchChange, filters }: ProductCatalogProps) => { const { products: fetchedProducts, isLoading } = useProducts(); const products: CatalogProduct[] = productsProp && productsProp.length > 0 ? productsProp : fetchedProducts.map((p) => ({ id: p.id, name: p.name, price: p.price, imageSrc: p.imageSrc, category: p.brand, rating: p.rating, reviewCount: p.reviewCount, onClick: p.onProductClick, })); if (isLoading && (!productsProp || productsProp.length === 0)) { return ( ); } return ( {(onSearchChange || (filters && filters.length > 0)) && ( {onSearchChange && ( Search onSearchChange(e.target.value)} placeholder="Search products..." className="card px-4 h-9 w-full md:w-80 text-base text-foreground bg-transparent rounded focus:outline-none" /> )} {filters && filters.length > 0 && ( {filters.map((filter) => ( {filter.label} filter.onChange(e.target.value)} className="w-full text-base text-secondary-cta-text bg-transparent cursor-pointer focus:outline-none" > {filter.options.map((option) => ( {option} ))} ))} )} )} {products.length === 0 ? ( No products found ) : ( {products.map((product) => ( {product.category && ( {product.category} )} {product.name} {product.rating && ( {Array.from({ length: 5 }).map((_, i) => ( ))} {product.reviewCount && ( ({product.reviewCount}) )} )} {product.price} ))} )} ); }; export default ProductCatalog; export type { CatalogProduct };
No products found
{product.price}