export const dynamic = "force-dynamic"; import type { Metadata } from "next"; import Link from "next/link"; import { notFound } from "next/navigation"; import { getIsoContent, getIsoSidebarItems, type IsoVerse, type IsoIntroSegment, type IsoSidebarItem, } from "@/lib/iso"; import { ogForChapter, extractQuoteFromHl, buildOgMeta } from "@/lib/og"; import { PageHeader } from "@/components/layout/page-header"; import { JsonLd } from "@/components/seo/json-ld"; import { articleJsonLd } from "@/lib/jsonld"; import { Card, CardContent } from "@/components/ui/card"; import { buttonVariants } from "@/components/ui/button"; import { ChevronLeft, ChevronRight } from "lucide-react"; import { cn } from "@/lib/utils"; import { MobileNav, type MobileNavGroup } from "@/components/layout/mobile-nav"; import { FindInPage } from "@/components/layout/find-in-page"; // --------------------------------------------------------------------------- // Type guards // --------------------------------------------------------------------------- function isVerse(content: IsoVerse | IsoIntroSegment): content is IsoVerse { return "mantra" in content && "devanagari" in content; } function isIntroSegment( content: IsoVerse | IsoIntroSegment, ): content is IsoIntroSegment { return "paragraphs" in content && "order" in content; } // --------------------------------------------------------------------------- // Metadata // --------------------------------------------------------------------------- export async function generateMetadata({ params, searchParams, }: { params: Promise<{ mantra: string }>; searchParams: Promise>; }): Promise { const { mantra: slug } = await params; const sp = await searchParams; const content = await getIsoContent(slug); const isVerse_ = content && "mantra" in content && "devanagari" in content; const paragraphs = content ? isVerse_ ? [ (content as unknown as IsoVerse).translation, ...(content as unknown as IsoVerse).purport, ] : (content as unknown as IsoIntroSegment).paragraphs : undefined; const quote = extractQuoteFromHl(sp, paragraphs); if (quote) { return buildOgMeta({ title: "Śrī Īśopaniṣad", detail: `Mantra ${slug}`, quote, }); } const title = isVerse_ ? `${(content as unknown as IsoVerse).reference}` : content && "title" in content ? (content as IsoIntroSegment).title : `Mantra ${slug}`; return ogForChapter("iso", title); } // --------------------------------------------------------------------------- // Page // --------------------------------------------------------------------------- export default async function IsoMantraPage({ params, }: { params: Promise<{ mantra: string }>; }) { const { mantra: slug } = await params; const content = await getIsoContent(slug); if (!content) notFound(); const sidebarItems = await getIsoSidebarItems(); const currentIdx = sidebarItems.findIndex((item) => item.slug === slug); const prev = currentIdx > 0 ? sidebarItems[currentIdx - 1] : null; const next = currentIdx < sidebarItems.length - 1 ? sidebarItems[currentIdx + 1] : null; // Build the page title for the header const verse = isVerse(content) ? content : null; const intro = isIntroSegment(content) ? content : null; return (
← Śrī Īśopaniṣad

{verse && ( <> {verse.reference}: {verse.bookTitle} )} {intro && intro.title}

{/* Left sidebar */} {/* Main content */}
{/* Top navigation */} {/* Content */} {verse && } {intro && } {/* Bottom navigation */}
); } // --------------------------------------------------------------------------- // Verse content (Devanagari, transliteration, synonyms, translation, purport) // --------------------------------------------------------------------------- function VerseContent({ verse }: { verse: IsoVerse }) { return ( {/* Devanagari */}
{verse.devanagari}
{/* Transliteration */}
{verse.transliteration}
{/* Synonyms */} {verse.synonyms.length > 0 && (

Synonyms

{verse.synonyms.map((s, i) => ( {i > 0 && "; "} {s.word} {"—"} {s.meanings.join(", ")} ))}
)} {/* Translation */}

Translation

{/* Purport */} {verse.purport.length > 0 && (

Purport

{verse.purport.map((p, i) => (
))}
)}
); } // --------------------------------------------------------------------------- // Intro segment content (paragraphs) // --------------------------------------------------------------------------- function IntroContent({ intro }: { intro: IsoIntroSegment }) { return (
{intro.paragraphs.map((paragraph, i) => (
))}
); } // --------------------------------------------------------------------------- // Sidebar // --------------------------------------------------------------------------- function IsoSidebar({ items, currentSlug, }: { items: IsoSidebarItem[]; currentSlug: string; }) { // Front matter items (front-pages + introduction) const frontMatterItems = items.filter( (item) => item.slug === "intro-front-pages" || item.slug === "intro-introduction", ); // Mantras = invocation + 1-18 const mantraItems = items.filter((item) => item.type === "verse"); // about-the-author comes last const aboutAuthorItem = items.find( (item) => item.slug === "intro-about-the-author", ); return ( ); } function SidebarLink({ item, isActive, }: { item: IsoSidebarItem; isActive: boolean; }) { return ( {item.label} ); } // --------------------------------------------------------------------------- // Prev / Next navigation // --------------------------------------------------------------------------- function IsoNav({ prev, next, sidebarItems, currentSlug, }: { prev: IsoSidebarItem | null; next: IsoSidebarItem | null; sidebarItems: IsoSidebarItem[]; currentSlug: string; }) { const mobileNavGroups: MobileNavGroup[] = []; // Front matter (front-pages + introduction) const frontMatterItems = sidebarItems.filter( (i) => i.slug === "intro-front-pages" || i.slug === "intro-introduction", ); if (frontMatterItems.length > 0) { mobileNavGroups.push({ title: "Front Matter", items: frontMatterItems.map((i) => ({ slug: i.slug, label: i.label, href: `/books/iso/${i.slug}`, type: i.type, })), }); } // Mantras (invocation + 1-18) const mantraItems = sidebarItems.filter((i) => i.type === "verse"); if (mantraItems.length > 0) { mobileNavGroups.push({ title: "Mantras", items: mantraItems.map((i) => ({ slug: i.slug, label: i.label, href: `/books/iso/${i.slug}`, type: i.type, })), }); } // Back matter (about-the-author) const backMatterItems = sidebarItems.filter( (i) => i.slug === "intro-about-the-author", ); if (backMatterItems.length > 0) { mobileNavGroups.push({ title: "Back Matter", items: backMatterItems.map((i) => ({ slug: i.slug, label: i.label, href: `/books/iso/${i.slug}`, type: i.type, })), }); } return (
{prev ? ( {prev.type === "verse" && prev.mantra != null && prev.mantra > 0 ? `Mantra ${prev.mantra}` : prev.label} Previous ) : (
)}
{next ? ( {next.type === "verse" && next.mantra != null && next.mantra > 0 ? `Mantra ${next.mantra}` : next.label} Next ) : (
)}
); }