import { createFileRoute, useNavigate, useSearch } from '@tanstack/react-router' import { useState, useEffect, useMemo, useRef, useCallback } from 'react' import Fuse from 'fuse.js' import { useAllProducts } from '../hooks/prominent-api-hooks' import { SearchBar } from 'web-components' import { ProductCard } from '../components/ProductCard' import { SearchX, Loader2, ChevronLeft } from 'lucide-react' import { AppLayout } from '../components/AppLayout' import AddToCartDialog from '../components/AddToCartDialog' import { useCartStore } from '../lib/stores/cart-store' export const Route = createFileRoute('/home/search')({ component: SearchPage, validateSearch: (search: Record) => ({ q: search.q || '', }), }) // Debounce hook for search function useDebounce(value: T, delay: number): T { const [debouncedValue, setDebouncedValue] = useState(value) useEffect(() => { const timer = setTimeout(() => { setDebouncedValue(value) }, delay) return () => { clearTimeout(timer) } }, [value, delay]) return debouncedValue } function SearchPage() { const navigate = useNavigate() const { q } = useSearch({ from: '/home/search' }) const [inputQuery, setInputQuery] = useState(q) const searchInputRef = useRef(null) const { setAddedToCartProduct } = useCartStore() // Debounce the search query for automatic search const debouncedQuery = useDebounce(inputQuery, 300) // Focus search input on mount useEffect(() => { requestAnimationFrame(() => { searchInputRef.current?.focus() }) }, []) const { data: productsData, isLoading, error, refetch } = useAllProducts() const allProducts = productsData?.products || [] // Client-side search filtering using Fuse.js const products = useMemo(() => { if (!debouncedQuery.trim()) return allProducts const fuse = new Fuse(allProducts, { keys: ['name', 'shortDescription'], threshold: 0.3, includeScore: true, shouldSort: true, }) const fuseResults = fuse.search(debouncedQuery) return fuseResults.map((result) => result.item) }, [allProducts, debouncedQuery]) const handleSearch = useCallback(() => { // Search is now automatic via debounce, but keep this for manual submit // Update URL with search query navigate({ to: '/home/search', search: { q: inputQuery }, }) }, [inputQuery, navigate]) const handleProductPress = (id: number) => { navigate({ to: '/home/product/$id', params: { id: String(id) }, }) } const handleAddToCart = (product: any) => { setAddedToCartProduct({ productId: product.id, product }) } if (isLoading) { return (

Loading products...

) } if (error) { return (

Failed to load products

) } return (
{/* Search Header */}

{debouncedQuery ? `Search Results for "${debouncedQuery}"` : 'All Products'}

{products.length} items

{/* Products Grid */}
{products.length === 0 ? (

No products found

{debouncedQuery && (

Try adjusting your search for "{debouncedQuery}"

)}
) : (
{products.map((product: any) => ( handleProductPress(product.id)} showDeliveryInfo={false} miniView={true} useAddToCartDialog={true} /> ))}
)}
) }