/** * SearchBar - Search input with debounced onChange * * @example * console.log('Search:', query)} * placeholder="Search users..." * /> */ import React, { useState, useEffect, useCallback } from 'react'; import styles from './SearchBar.module.css'; interface SearchBarProps { onSearch: (query: string) => void; placeholder?: string; debounceMs?: number; className?: string; } export const SearchBar: React.FC = ({ onSearch, placeholder = 'Search...', debounceMs = 300, className, }) => { const [query, setQuery] = useState(''); const handleSearch = useCallback(() => { if (query.trim()) { onSearch(query); } }, [query, onSearch]); useEffect(() => { const timer = setTimeout(handleSearch, debounceMs); return () => clearTimeout(timer); }, [query, debounceMs, handleSearch]); return (
setQuery(e.target.value)} placeholder={placeholder} className={styles.input} aria-label="Search" />
); };