import React, { useState, useRef, useEffect, useCallback, useMemo } from "react"; import { View, Dimensions } from "react-native"; import { useRouter, useLocalSearchParams } from "expo-router"; import { tw, useManualRefresh, useMarkDataFetchers, MyFlatList, MyText, SearchBar, } from "common-ui"; import MaterialIcons from "@expo/vector-icons/MaterialIcons"; import Fuse from "fuse.js"; import { useAllProducts } from "@/src/hooks/prominent-api-hooks"; import ProductCard from "@/components/ProductCard"; import FloatingCartBar from "@/components/floating-cart-bar"; // 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; } const { width: screenWidth } = Dimensions.get("window"); const itemWidth = (screenWidth - 48) / 2; export default function SearchResults() { const router = useRouter(); const { q } = useLocalSearchParams(); const query = (q as string) || ""; const [inputQuery, setInputQuery] = useState(query); const searchInputRef = useRef(null); // Debounce the search query for automatic search const debouncedQuery = useDebounce(inputQuery, 300); useEffect(() => { // Focus with requestAnimationFrame for better timing 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]); useManualRefresh(() => { refetch(); }); useMarkDataFetchers(() => { refetch(); }); const handleSearch = useCallback(() => { // Search is now automatic via debounce, but keep this for manual submit }, []); return ( ( router.push(`/(drawer)/(tabs)/home/product-detail/${item.id}`) } showDeliveryInfo={false} useAddToCartDialog={true} /> )} keyExtractor={(item) => item.id.toString()} columnWrapperStyle={{ gap: 16, justifyContent: "center" }} contentContainerStyle={[tw`pb-24`, { gap: 16 }]} ListEmptyComponent={ isLoading ? ( Loading products... ) : ( No products found {debouncedQuery && ( Try adjusting your search for "{debouncedQuery}" )} ) } ListHeaderComponent={ {debouncedQuery ? `Search Results for "${debouncedQuery}"` : "All Products"} } /> ); }