'use client' import { useState, useEffect, useCallback } from 'react' import { Input } from '@/components/ui/input' import { Button } from '@/components/ui/button' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select' import { Search, Loader2 } from 'lucide-react' import ProductCard from '@/components/shop/ProductCard' import StructuredData from '@/components/StructuredData' import { generateProductListJsonLd, generateBreadcrumbJsonLd } from '@/lib/structured-data' import { Product, Category } from '@/types' import PageHero from '@/components/sections/PageHero' export default function ProductsPage() { const [products, setProducts] = useState([]) const [categories, setCategories] = useState([]) const [loading, setLoading] = useState(true) const [loadingMore, setLoadingMore] = useState(false) const [search, setSearch] = useState('') const [selectedCategory, setSelectedCategory] = useState('all') const [page, setPage] = useState(1) const [hasMore, setHasMore] = useState(true) const [totalProducts, setTotalProducts] = useState(0) const fetchProducts = useCallback(async (currentPage = 1, isLoadMore = false) => { try { if (!isLoadMore) { setLoading(true) } else { setLoadingMore(true) } const params = new URLSearchParams({ page: currentPage.toString(), limit: '12', }) if (search) params.append('search', search) if (selectedCategory && selectedCategory !== 'all') params.append('category', selectedCategory) const response = await fetch(`/api/products?${params}`) const data = await response.json() if (isLoadMore) { setProducts(prev => [...prev, ...data.products]) setHasMore(data.products.length === 12) } else { setProducts(data.products) setHasMore(data.products.length === 12) } setTotalProducts(data.total || 0) } catch (error) { console.error('Error fetching products:', error) } finally { setLoading(false) setLoadingMore(false) } }, [search, selectedCategory]) useEffect(() => { fetchCategories() fetchProducts(1, false) }, [fetchProducts]) useEffect(() => { setPage(1) fetchProducts(1, false) }, [search, selectedCategory, fetchProducts]) const fetchCategories = async () => { try { const response = await fetch('/api/categories') const data = await response.json() // Handle both old format (array) and new format (object with categories) const categoriesArray = Array.isArray(data) ? data : data.categories || [] setCategories(categoriesArray) } catch (error) { console.error('Error fetching categories:', error) } } const handleLoadMore = () => { const nextPage = page + 1 setPage(nextPage) fetchProducts(nextPage, true) } // Generate structured data const baseUrl = process.env.NEXT_PUBLIC_URL || 'https://padmaajarasooi.com' const productListData = generateProductListJsonLd(products, baseUrl) const breadcrumbData = generateBreadcrumbJsonLd([ { name: 'Home', url: '/' }, { name: 'Products', url: '/products' } ], baseUrl) return (
{/* Structured Data */} {/* Hero Section */}
{/* Filters */}
setSearch(e.target.value)} className="pl-10" />
{/* Products Grid */} {loading ? (
{[...Array(8)].map((_, i) => (
))}
) : (
{products.map((product, index) => ( ))}
)} {products.length === 0 && !loading && (

No products found

Try adjusting your search or filter criteria

)} {/* Load More Button */} {!loading && hasMore && products.length > 0 && (
)}
) }