'use client'; import { useState, useEffect, useCallback, useMemo } from 'react'; import { Header } from '@/components/Header'; import { ProductCard } from '@/components/ProductCard'; import { ProductFilters } from '@/components/ProductFilters'; import { AiSuggestion } from '@/components/AiSuggestion'; import { Input } from '@/components/ui/input'; import { Button } from '@/components/ui/button'; import { Search, SlidersHorizontal, Loader2 } from 'lucide-react'; import { searchProducts } from '@/services/product-api'; import type { Product } from '@/lib/types'; import { Sheet, SheetContent, SheetTrigger } from '@/components/ui/sheet'; export default function Home() { const [searchQuery, setSearchQuery] = useState(''); const [debouncedSearchQuery, setDebouncedSearchQuery] = useState(''); const [products, setProducts] = useState([]); const [isLoading, setIsLoading] = useState(false); const [priceRange, setPriceRange] = useState<{ min: number | undefined, max: number | undefined }>({ min: undefined, max: undefined }); const [minRating, setMinRating] = useState(0); const [country, setCountry] = useState('US'); const [language, setLanguage] = useState('en'); // Debounce search query useEffect(() => { const handler = setTimeout(() => { setDebouncedSearchQuery(searchQuery); }, 300); // 300ms debounce delay return () => { clearTimeout(handler); }; }, [searchQuery]); useEffect(() => { const fetchProducts = async () => { if (!debouncedSearchQuery) { setProducts([]); setIsLoading(false); return; } setIsLoading(true); try { const results = await searchProducts(debouncedSearchQuery, { priceRange, minRating }); setProducts(results); } catch (error) { console.error("Failed to fetch products:", error); setProducts([]); } finally { setIsLoading(false); } }; fetchProducts(); }, [debouncedSearchQuery, priceRange, minRating]); const onFiltersChange = useCallback( (newFilters: { priceRange: { min: number | undefined; max: number | undefined }; minRating: number; }) => { setPriceRange(newFilters.priceRange); setMinRating(newFilters.minRating); }, [] ); const filtersComponent = ( ); const aiFilters = useMemo(() => ({ price: priceRange, rating: minRating, country, language, }), [priceRange, minRating, country, language]); return (
setSearchQuery(e.target.value)} />
{filtersComponent}
{isLoading ? (

Searching for products...

) : products.length > 0 ? (
{products.map((product) => ( ))}
) : null}
); }