/** * Component: Authors Page * Documentation: documentation/frontend/components.md */ 'use client'; import { Suspense, useState, useEffect, useCallback } from 'react'; import { useSearchParams, useRouter } from 'next/navigation'; import { Header } from '@/components/layout/Header'; import { AuthorGrid } from '@/components/authors/AuthorGrid'; import { useAuthorSearch } from '@/lib/hooks/useAuthors'; import { ProtectedRoute } from '@/components/auth/ProtectedRoute'; import { CardSizeControls } from '@/components/ui/CardSizeControls'; import { usePreferences } from '@/contexts/PreferencesContext'; function AuthorsPageContent() { const searchParams = useSearchParams(); const router = useRouter(); const initialQuery = searchParams.get('q') || ''; const [query, setQuery] = useState(initialQuery); const [debouncedQuery, setDebouncedQuery] = useState(initialQuery); const { cardSize, setCardSize } = usePreferences(); // Debounce search query and sync to URL useEffect(() => { const timer = setTimeout(() => { setDebouncedQuery(query); // Update URL without adding history entries const trimmed = query.trim(); if (trimmed) { router.replace(`/authors?q=${encodeURIComponent(trimmed)}`, { scroll: false }); } else { router.replace('/authors', { scroll: false }); } }, 500); return () => clearTimeout(timer); }, [query, router]); const { authors, isLoading } = useAuthorSearch(debouncedQuery); const handleSearch = useCallback((e: React.FormEvent) => { e.preventDefault(); }, []); return (
{/* Page Header */}

Browse Authors

Search for your favorite audiobook authors

{/* Search Form */}
setQuery(e.target.value)} placeholder="Search by author name..." 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 */}

Authors

{!isLoading && authors.length > 0 && ( ({authors.length} result{authors.length !== 1 ? 's' : ''}) )}
{/* Author Grid */}
) : ( /* Empty State */

Start typing to search for authors

Search by author name to discover their works

)}
); } export default function AuthorsPage() { return ( ); }