/** * SearchInput - Reusable search input with debounce */ import { useState, useEffect, useCallback } from 'react'; import { Search, X } from 'lucide-react'; import clsx from 'clsx'; import { SEARCH_DEBOUNCE_MS } from '../../utils'; interface SearchInputProps { value: string; onChange: (value: string) => void; placeholder?: string; debounceMs?: number; className?: string; autoFocus?: boolean; } export function SearchInput({ value, onChange, placeholder = 'Buscar...', debounceMs = SEARCH_DEBOUNCE_MS, className, autoFocus = false, }: SearchInputProps) { const [localValue, setLocalValue] = useState(value); useEffect(() => { setLocalValue(value); }, [value]); useEffect(() => { const timer = setTimeout(() => { if (localValue !== value) { onChange(localValue); } }, debounceMs); return () => clearTimeout(timer); }, [localValue, debounceMs, onChange, value]); const handleClear = useCallback(() => { setLocalValue(''); onChange(''); }, [onChange]); return (
setLocalValue(e.target.value)} autoFocus={autoFocus} /> {localValue && ( )}
); }