import React, { useState, useEffect, useCallback } from 'react'; import { Search, X } from 'lucide-react'; import useLocalize from '~/hooks/useLocalize'; import { useDebounce } from '~/hooks'; import { Input } from '~/components/ui'; /** * Props for the SearchBar component */ interface SearchBarProps { /** Current search query value */ value: string; /** Callback fired when the search query changes */ onSearch: (query: string) => void; /** Additional CSS classes */ className?: string; } /** * SearchBar - Component for searching agents with debounced input * * Provides a search input with clear button and debounced search functionality. * Includes proper ARIA attributes for accessibility and visual indicators. * Uses 300ms debounce delay to prevent excessive API calls during typing. */ const SearchBar: React.FC = ({ value, onSearch, className = '' }) => { const localize = useLocalize(); const [searchTerm, setSearchTerm] = useState(value); // Debounced search value (300ms delay) const debouncedSearchTerm = useDebounce(searchTerm, 300); // Update internal state when props change useEffect(() => { setSearchTerm(value); }, [value]); // Trigger search when debounced value changes useEffect(() => { // Only trigger search if the debounced value matches current searchTerm // This prevents stale debounced values from triggering after clear if (debouncedSearchTerm !== value && debouncedSearchTerm === searchTerm) { onSearch(debouncedSearchTerm); } }, [debouncedSearchTerm, onSearch, value, searchTerm]); /** * Handle search input changes * * @param e - Input change event */ const handleChange = (e: React.ChangeEvent) => { setSearchTerm(e.target.value); }; /** * Clear the search input and reset results */ const handleClear = useCallback(() => { // Immediately call parent onSearch to clear the URL parameter onSearch(''); // Also clear local state setSearchTerm(''); }, [onSearch]); return (
{/* Search icon with proper accessibility */} {/* Hidden instructions for screen readers */}
{localize('com_agents_search_instructions')}
{/* Show clear button only when search has value - Google style */} {searchTerm && ( )}
); }; export default SearchBar;