/** * Component: Series Detail Page * Documentation: documentation/frontend/components.md */ 'use client'; import { use, useCallback } from 'react'; import { useRouter, useSearchParams } from 'next/navigation'; import { Header } from '@/components/layout/Header'; import { AudiobookGrid } from '@/components/audiobooks/AudiobookGrid'; import { SeriesDetailCard, SeriesDetailSkeleton } from '@/components/series/SeriesDetailCard'; import { SimilarSeriesRow, SimilarSeriesSkeleton } from '@/components/series/SimilarSeriesRow'; import { useSeriesDetail } from '@/lib/hooks/useSeries'; import { ProtectedRoute } from '@/components/auth/ProtectedRoute'; import { CardSizeControls } from '@/components/ui/CardSizeControls'; import { SquareCoversToggle } from '@/components/ui/SquareCoversToggle'; import { usePreferences } from '@/contexts/PreferencesContext'; export default function SeriesDetailPage({ params, }: { params: Promise<{ asin: string }>; }) { const { asin } = use(params); const router = useRouter(); const searchParams = useSearchParams(); const fromSeriesTitle = searchParams.get('from'); const { series, isLoading: seriesLoading } = useSeriesDetail(asin); const { cardSize, setCardSize, squareCovers, setSquareCovers } = usePreferences(); const handleBack = useCallback(() => { // Use browser back if we came from within the app, otherwise fallback to /series if (window.history.length > 1) { router.back(); } else { router.push('/series'); } }, [router]); return (
{/* Back navigation */} {/* Series Detail Card */} {seriesLoading ? ( ) : series ? ( ) : (

Series not found

)} {/* Similar Series */} {seriesLoading ? ( ) : series && series.similarSeries.length > 0 ? ( ) : null} {/* Books Section */} {series && (
{/* Sticky Books Header */}

Books in Series

{series.books.length > 0 && ( ({series.books.length} title{series.books.length !== 1 ? 's' : ''}) )}
{/* Books Grid */}
)}
); }