'use client'; import { useState, useCallback } from 'react'; import debounce from 'lodash/debounce'; interface ParkSearchProps { onSearch: (query: string) => void; } export function ParkSearch({ onSearch }: ParkSearchProps) { const [query, setQuery] = useState(''); const [isLoading, setIsLoading] = useState(false); const [suggestions, setSuggestions] = useState>([]); const debouncedFetchSuggestions = useCallback( debounce(async (searchQuery: string) => { if (!searchQuery.trim()) { setSuggestions([]); return; } try { setIsLoading(true); const response = await fetch(`/api/parks/suggest?search=${encodeURIComponent(searchQuery)}`); const data = await response.json(); if (data.success) { setSuggestions(data.data || []); } } catch (error) { console.error('Failed to fetch suggestions:', error); setSuggestions([]); } finally { setIsLoading(false); } }, 300), [] ); const handleSearch = (searchQuery: string) => { setQuery(searchQuery); debouncedFetchSuggestions(searchQuery); onSearch(searchQuery); }; const handleSuggestionClick = (suggestion: { name: string; slug: string }) => { setQuery(suggestion.name); setSuggestions([]); onSearch(suggestion.name); }; return (
handleSearch(e.target.value)} placeholder="Search parks..." className="w-full border-gray-300 rounded-lg form-input dark:border-gray-600 dark:bg-gray-700 dark:text-white" aria-label="Search parks" aria-controls="search-results" aria-expanded={suggestions.length > 0} /> {isLoading && (
Searching...
)}
{suggestions.length > 0 && (
    {suggestions.map((suggestion) => (
  • handleSuggestionClick(suggestion)} > {suggestion.name}
  • ))}
)}
); }