import { useState, useEffect, useRef, useCallback } from 'react' import { Search, X } from 'lucide-react' import { debounce } from '@/lib/debounce' import { cn } from '@/lib/utils' interface SearchInputProps { value?: string onSearch: (value: string) => void placeholder?: string className?: string } export function SearchInput({ value = '', onSearch, placeholder = 'Search...', className }: SearchInputProps) { const [localValue, setLocalValue] = useState(value) const debouncedRef = useRef | null>(null) useEffect(() => { setLocalValue(value) }, [value]) useEffect(() => { debouncedRef.current = debounce((v: string) => { onSearch(v) }, 300) return () => { debouncedRef.current?.cancel() } }, [onSearch]) const handleChange = useCallback((e: React.ChangeEvent) => { const v = e.target.value setLocalValue(v) debouncedRef.current?.(v) }, []) const handleClear = () => { setLocalValue('') onSearch('') } return (
{localValue && ( )}
) } export default SearchInput