"use client"; import { useRouter } from "next/navigation"; import { useCallback, useMemo, useEffect, useState } from "react"; import { Card, CardHeader, CardContent } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { ChevronLeft, ChevronRight, Loader2 } from "lucide-react"; import { MobileNav, type MobileNavGroup } from "@/components/layout/mobile-nav"; import { JsonLd } from "@/components/seo/json-ld"; import { articleJsonLd } from "@/lib/jsonld"; import { BOOK_NAMES } from "@/lib/constants"; // --------------------------------------------------------------------------- // Types // --------------------------------------------------------------------------- type Synonym = { word: string; meanings: string[]; }; type Verse = { id: string; book: string; division: string | null; chapter: number; verse: number; verseEnd: number | null; reference: string; bookTitle: string; devanagari: string; bengali: string | null; transliteration: string; synonyms: Synonym[]; translation: string; purport: string[]; }; type VerseIndexEntry = { verse: number; verseEnd?: number; reference: string; }; // --------------------------------------------------------------------------- // Props // --------------------------------------------------------------------------- type ChapterViewerProps = { /** The first verse (SSR'd), shown before any client-side fetch */ initialVerse: Verse; /** The verse number of the initial verse */ initialVerseNum: number; /** Lightweight index of ALL verses in the chapter (for the sidebar) */ verseIndex: VerseIndexEntry[]; /** Book key */ book: string; /** Division: null for BG, canto string for SB, lila key for CC */ division: string | null; /** Chapter number */ chapter: number; /** Whether to show the Bengali script field (CC only) */ showBengali?: boolean; /** Base path for verse URLs, e.g. "/books/bg/1" — verse number is appended */ basePath: string; /** Mobile nav groups for the drawer */ mobileNavGroups?: MobileNavGroup[]; /** Book title for the mobile nav drawer header */ mobileNavBookTitle?: string; }; // --------------------------------------------------------------------------- // Navigation buttons (reused at top and bottom) // --------------------------------------------------------------------------- function VerseNav({ currentIdx, total, onPrev, onNext, verseIndex, mobileNavGroups, currentVerseSlug, mobileNavBookTitle, }: { currentIdx: number; total: number; onPrev: () => void; onNext: () => void; verseIndex: VerseIndexEntry[]; mobileNavGroups?: MobileNavGroup[]; currentVerseSlug?: string; mobileNavBookTitle?: string; }) { const hasPrev = currentIdx > 0; const hasNext = currentIdx < total - 1; const current = verseIndex[currentIdx]; const label = current ? current.verseEnd ? `${current.verse}–${current.verseEnd}` : String(current.verse) : ""; return (
{verse.bengali}
{verse.devanagari}
{verse.transliteration}
{verse.synonyms.map((s, i) => ( {s.word}— {s.meanings.join(", ")} {i < verse.synonyms.length - 1 ? "; " : "."} ))}
— a // block element that can't live inside a, so render those // in a
(styled centered + accent via globals.css); plain // prose paragraphs stay as. /^\s*
) : ( ), )}