'use client'; import { Input } from '@/components/ui/input'; import { Search, Loader2 } from 'lucide-react'; import { useState, useEffect, useCallback } from 'react'; import { useDebounce } from 'use-debounce'; interface SearchInputProps { onSearch: (query: string) => void; isSearching?: boolean; } export function SearchInput({ onSearch, isSearching = false }: SearchInputProps) { const [query, setQuery] = useState(''); const [debouncedQuery] = useDebounce(query, 300); // Show typing indicator when input differs from debounced value const isTyping = query !== debouncedQuery && query.length > 0; useEffect(() => { // Only trigger search when debounced value changes if (debouncedQuery.length >= 2 || debouncedQuery.length === 0) { onSearch(debouncedQuery); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [debouncedQuery]); // Only depend on debouncedQuery, not onSearch return (
setQuery(e.target.value)} disabled={isSearching} className="pl-10 pr-10" /> {(isSearching || isTyping) && (
)}
); }