"use client"; import { GradientSpinner } from "@/components/ui/GradientSpinner"; import { useImageColor } from "@/hooks/useImageColor"; import { formatTime } from "@/utils/formatTime"; // Hooks import { useAudiobookData } from "@/features/audiobook/hooks/useAudiobookData"; import { useAudiobookActions } from "@/features/audiobook/hooks/useAudiobookActions"; // Components import { AudiobookHero } from "@/features/audiobook/components/AudiobookHero"; import { AudiobookActionBar } from "@/features/audiobook/components/AudiobookActionBar"; export default function AudiobookDetailPage() { // Data hook const { audiobookId, audiobook, isLoading, refetch, heroImage, metadata } = useAudiobookData(); // Extract colors from the hero image const { colors } = useImageColor(heroImage); // Action hooks const { isThisBookPlaying, isPlaying, currentTime, handlePlayPause, handleMarkAsCompleted, handleResetProgress, } = useAudiobookActions(audiobookId, audiobook, refetch); // Loading state if (isLoading) { return (
); } if (!audiobook) { return (

Audiobook not found

); } // Clean up description - strip HTML and clean whitespace const cleanDescription = audiobook.description ? audiobook.description .replace(/<[^>]*>/g, " ") .replace(/\s+/g, " ") .trim() : null; const showDescription = cleanDescription && !cleanDescription.match(/^(Read by|Narrated by):/i) && cleanDescription.length > 20; return (
{/* Main Content */}
{/* Description / About */} {showDescription && (

About

{cleanDescription}

)} {/* Series info */} {audiobook.series && (

Series

{audiobook.series.name} Book {audiobook.series.sequence}
)} {/* Playback hint - more subtle */}

Use the player controls in the bottom bar for playback speed, seeking, and volume.

); }