/** * Component: Search Page * Documentation: documentation/frontend/components.md */ 'use client'; import { useState, useEffect, useCallback, useMemo } from 'react'; import { Header } from '@/components/layout/Header'; import { AudiobookGrid } from '@/components/audiobooks/AudiobookGrid'; import { LoadMoreBar } from '@/components/ui/LoadMoreBar'; import { useSearch, Audiobook } from '@/lib/hooks/useAudiobooks'; import { ProtectedRoute } from '@/components/auth/ProtectedRoute'; import { SectionToolbar } from '@/components/ui/SectionToolbar'; import { usePreferences } from '@/contexts/PreferencesContext'; export default function SearchPage() { const [query, setQuery] = useState(''); const [debouncedQuery, setDebouncedQuery] = useState(''); const { cardSize, setCardSize, squareCovers, setSquareCovers, hideAvailable, setHideAvailable } = usePreferences(); // Debounce search query useEffect(() => { const timer = setTimeout(() => { setDebouncedQuery(query); }, 500); return () => clearTimeout(timer); }, [query]); const { results, totalResults, hasMore, isLoading, isLoadingMore, loadMore } = useSearch(debouncedQuery); // Filter out available titles when hideAvailable is enabled const filteredResults = useMemo( () => hideAvailable ? results.filter((b: Audiobook) => !b.isAvailable && b.requestStatus !== 'completed') : results, [results, hideAvailable] ); const handleSearch = useCallback((e: React.FormEvent) => { e.preventDefault(); }, []); // Header count text: reflects filtered counts const visibleCount = filteredResults.length; const countText = hasMore && totalResults > 0 ? `${visibleCount.toLocaleString()} of ${totalResults.toLocaleString()} result${totalResults !== 1 ? 's' : ''}` : visibleCount > 0 ? `${visibleCount.toLocaleString()} result${visibleCount !== 1 ? 's' : ''}` : ''; return (
{/* Search Header */}

Search Audiobooks

Find and request any audiobook from Audible

{/* Search Form */}
setQuery(e.target.value)} placeholder="Search by title, author, or narrator..." className="w-full pl-12 pr-12 py-4 text-lg border-2 border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 placeholder-gray-400" autoFocus /> {query && ( )}
{/* Results */} {debouncedQuery ? (
{/* Sticky Results Header with Card Size Controls */}

Search Results

{!isLoading && countText && ( ({countText}) )}
{/* Results Grid */} {/* Load More Bar */} {filteredResults.length > 0 && ( )}
) : ( /* Empty State */

Start typing to search for audiobooks

Search by title, author, or narrator name

)}
); }