feat: add metadata generator for remaining books
This commit is contained in:
@@ -1,6 +1,20 @@
|
|||||||
|
export const dynamic = "force-dynamic";
|
||||||
|
|
||||||
|
import type { Metadata } from "next";
|
||||||
import { redirect } from "next/navigation";
|
import { redirect } from "next/navigation";
|
||||||
import { notFound } from "next/navigation";
|
import { notFound } from "next/navigation";
|
||||||
import { getChapterVerseIndex } from "@/lib/api";
|
import { getChapterVerseIndex } from "@/lib/api";
|
||||||
|
import { buildOgMeta } from "@/lib/og";
|
||||||
|
import { BOOK_NAMES } from "@/lib/constants";
|
||||||
|
|
||||||
|
export async function generateMetadata({
|
||||||
|
params,
|
||||||
|
}: {
|
||||||
|
params: Promise<{ chapter: string }>;
|
||||||
|
}): Promise<Metadata> {
|
||||||
|
const { chapter } = await params;
|
||||||
|
return buildOgMeta({ title: BOOK_NAMES["bg"], detail: `Chapter ${chapter}` });
|
||||||
|
}
|
||||||
|
|
||||||
export default async function ChapterPage({
|
export default async function ChapterPage({
|
||||||
params,
|
params,
|
||||||
|
|||||||
@@ -1,6 +1,11 @@
|
|||||||
|
export const dynamic = "force-dynamic";
|
||||||
|
|
||||||
|
import type { Metadata } from "next";
|
||||||
import { redirect } from "next/navigation";
|
import { redirect } from "next/navigation";
|
||||||
import { notFound } from "next/navigation";
|
import { notFound } from "next/navigation";
|
||||||
import { getChapterVerseIndex } from "@/lib/api";
|
import { getChapterVerseIndex } from "@/lib/api";
|
||||||
|
import { buildOgMeta } from "@/lib/og";
|
||||||
|
import { BOOK_NAMES } from "@/lib/constants";
|
||||||
import { Card, CardContent } from "@/components/ui/card";
|
import { Card, CardContent } from "@/components/ui/card";
|
||||||
import { PageHeader } from "@/components/page-header";
|
import { PageHeader } from "@/components/page-header";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
@@ -15,6 +20,15 @@ type IntroSegment = {
|
|||||||
paragraphs: string[];
|
paragraphs: string[];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export async function generateMetadata({
|
||||||
|
params,
|
||||||
|
}: {
|
||||||
|
params: Promise<{ chapter: string }>;
|
||||||
|
}): Promise<Metadata> {
|
||||||
|
const { chapter } = await params;
|
||||||
|
return buildOgMeta({ title: BOOK_NAMES["bs"], detail: `Chapter ${chapter}` });
|
||||||
|
}
|
||||||
|
|
||||||
export default async function BsChapterPage({
|
export default async function BsChapterPage({
|
||||||
params,
|
params,
|
||||||
}: {
|
}: {
|
||||||
|
|||||||
@@ -1,6 +1,11 @@
|
|||||||
|
export const dynamic = "force-dynamic";
|
||||||
|
|
||||||
|
import type { Metadata } from "next";
|
||||||
import { redirect } from "next/navigation";
|
import { redirect } from "next/navigation";
|
||||||
import { notFound } from "next/navigation";
|
import { notFound } from "next/navigation";
|
||||||
import { getChapterVerseIndex } from "@/lib/api";
|
import { getChapterVerseIndex } from "@/lib/api";
|
||||||
|
import { buildOgMeta } from "@/lib/og";
|
||||||
|
import { BOOK_NAMES } from "@/lib/constants";
|
||||||
import { Card, CardContent } from "@/components/ui/card";
|
import { Card, CardContent } from "@/components/ui/card";
|
||||||
import { PageHeader } from "@/components/page-header";
|
import { PageHeader } from "@/components/page-header";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
@@ -15,6 +20,15 @@ type IntroSegment = {
|
|||||||
paragraphs: string[];
|
paragraphs: string[];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export async function generateMetadata({
|
||||||
|
params,
|
||||||
|
}: {
|
||||||
|
params: Promise<{ chapter: string }>;
|
||||||
|
}): Promise<Metadata> {
|
||||||
|
const { chapter } = await params;
|
||||||
|
return buildOgMeta({ title: BOOK_NAMES["mm"], detail: `Chapter ${chapter}` });
|
||||||
|
}
|
||||||
|
|
||||||
export default async function MmChapterPage({
|
export default async function MmChapterPage({
|
||||||
params,
|
params,
|
||||||
}: {
|
}: {
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
export const dynamic = "force-dynamic";
|
||||||
|
|
||||||
|
import type { Metadata } from "next";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
import { notFound } from "next/navigation";
|
import { notFound } from "next/navigation";
|
||||||
import {
|
import {
|
||||||
@@ -6,6 +9,9 @@ import {
|
|||||||
type MogChapter,
|
type MogChapter,
|
||||||
type MogSidebarItem,
|
type MogSidebarItem,
|
||||||
} from "@/lib/mog";
|
} from "@/lib/mog";
|
||||||
|
import { getProseChapter } from "@/lib/api";
|
||||||
|
import { ogForChapter, extractQuoteFromHl, buildOgMeta } from "@/lib/og";
|
||||||
|
import { BOOK_NAMES } from "@/lib/constants";
|
||||||
import { PageHeader } from "@/components/page-header";
|
import { PageHeader } from "@/components/page-header";
|
||||||
import { Card, CardContent } from "@/components/ui/card";
|
import { Card, CardContent } from "@/components/ui/card";
|
||||||
import { buttonVariants } from "@/components/ui/button";
|
import { buttonVariants } from "@/components/ui/button";
|
||||||
@@ -13,7 +19,26 @@ import { ChevronLeft, ChevronRight } from "lucide-react";
|
|||||||
import { cn } from "@/lib/utils";
|
import { cn } from "@/lib/utils";
|
||||||
import { MobileNav, type MobileNavGroup } from "@/components/mobile-nav";
|
import { MobileNav, type MobileNavGroup } from "@/components/mobile-nav";
|
||||||
|
|
||||||
export const dynamic = "force-dynamic";
|
// ---------------------------------------------------------------------------
|
||||||
|
// Metadata
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
export async function generateMetadata({
|
||||||
|
params,
|
||||||
|
searchParams,
|
||||||
|
}: {
|
||||||
|
params: Promise<{ chapter: string }>;
|
||||||
|
searchParams: Promise<Record<string, string | string[] | undefined>>;
|
||||||
|
}): Promise<Metadata> {
|
||||||
|
const { chapter: slug } = await params;
|
||||||
|
const sp = await searchParams;
|
||||||
|
const chapter = await getProseChapter("mog", 0, slug);
|
||||||
|
const hlQuote = extractQuoteFromHl(sp, chapter?.paragraphs);
|
||||||
|
if (hlQuote) {
|
||||||
|
return buildOgMeta({ title: BOOK_NAMES["mog"], quote: hlQuote });
|
||||||
|
}
|
||||||
|
return ogForChapter("mog", chapter?.title || "");
|
||||||
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
// Page
|
// Page
|
||||||
|
|||||||
@@ -1,6 +1,11 @@
|
|||||||
|
export const dynamic = "force-dynamic";
|
||||||
|
|
||||||
|
import type { Metadata } from "next";
|
||||||
import { redirect } from "next/navigation";
|
import { redirect } from "next/navigation";
|
||||||
import { notFound } from "next/navigation";
|
import { notFound } from "next/navigation";
|
||||||
import { getChapterVerseIndex } from "@/lib/api";
|
import { getChapterVerseIndex } from "@/lib/api";
|
||||||
|
import { buildOgMeta } from "@/lib/og";
|
||||||
|
import { BOOK_NAMES } from "@/lib/constants";
|
||||||
import { Card, CardContent } from "@/components/ui/card";
|
import { Card, CardContent } from "@/components/ui/card";
|
||||||
import { PageHeader } from "@/components/page-header";
|
import { PageHeader } from "@/components/page-header";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
@@ -15,6 +20,18 @@ type IntroSegment = {
|
|||||||
paragraphs: string[];
|
paragraphs: string[];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export async function generateMetadata({
|
||||||
|
params,
|
||||||
|
}: {
|
||||||
|
params: Promise<{ chapter: string }>;
|
||||||
|
}): Promise<Metadata> {
|
||||||
|
const { chapter } = await params;
|
||||||
|
return buildOgMeta({
|
||||||
|
title: BOOK_NAMES["nbs"],
|
||||||
|
detail: `Chapter ${chapter}`,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
export default async function NbsChapterPage({
|
export default async function NbsChapterPage({
|
||||||
params,
|
params,
|
||||||
}: {
|
}: {
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
export const dynamic = "force-dynamic";
|
||||||
|
|
||||||
|
import type { Metadata } from "next";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
import { notFound } from "next/navigation";
|
import { notFound } from "next/navigation";
|
||||||
import {
|
import {
|
||||||
@@ -6,6 +9,9 @@ import {
|
|||||||
type NodChapter,
|
type NodChapter,
|
||||||
type NodSidebarItem,
|
type NodSidebarItem,
|
||||||
} from "@/lib/nod";
|
} from "@/lib/nod";
|
||||||
|
import { getProseChapter } from "@/lib/api";
|
||||||
|
import { ogForChapter, extractQuoteFromHl, buildOgMeta } from "@/lib/og";
|
||||||
|
import { BOOK_NAMES } from "@/lib/constants";
|
||||||
import { PageHeader } from "@/components/page-header";
|
import { PageHeader } from "@/components/page-header";
|
||||||
import { Card, CardContent } from "@/components/ui/card";
|
import { Card, CardContent } from "@/components/ui/card";
|
||||||
import { buttonVariants } from "@/components/ui/button";
|
import { buttonVariants } from "@/components/ui/button";
|
||||||
@@ -13,6 +19,27 @@ import { ChevronLeft, ChevronRight } from "lucide-react";
|
|||||||
import { cn } from "@/lib/utils";
|
import { cn } from "@/lib/utils";
|
||||||
import { MobileNav, type MobileNavGroup } from "@/components/mobile-nav";
|
import { MobileNav, type MobileNavGroup } from "@/components/mobile-nav";
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// Metadata
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
export async function generateMetadata({
|
||||||
|
params,
|
||||||
|
searchParams,
|
||||||
|
}: {
|
||||||
|
params: Promise<{ chapter: string }>;
|
||||||
|
searchParams: Promise<Record<string, string | string[] | undefined>>;
|
||||||
|
}): Promise<Metadata> {
|
||||||
|
const { chapter: slug } = await params;
|
||||||
|
const sp = await searchParams;
|
||||||
|
const chapter = await getProseChapter("nod", 0, slug);
|
||||||
|
const hlQuote = extractQuoteFromHl(sp, chapter?.paragraphs);
|
||||||
|
if (hlQuote) {
|
||||||
|
return buildOgMeta({ title: BOOK_NAMES["nod"], quote: hlQuote });
|
||||||
|
}
|
||||||
|
return ogForChapter("nod", chapter?.title || "");
|
||||||
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
// Page
|
// Page
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
export const dynamic = "force-dynamic";
|
||||||
|
|
||||||
|
import type { Metadata } from "next";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
import { notFound } from "next/navigation";
|
import { notFound } from "next/navigation";
|
||||||
import {
|
import {
|
||||||
@@ -6,6 +9,9 @@ import {
|
|||||||
type OchkmChapter,
|
type OchkmChapter,
|
||||||
type OchkmSidebarItem,
|
type OchkmSidebarItem,
|
||||||
} from "@/lib/ochkm";
|
} from "@/lib/ochkm";
|
||||||
|
import { getProseChapter } from "@/lib/api";
|
||||||
|
import { ogForChapter, extractQuoteFromHl, buildOgMeta } from "@/lib/og";
|
||||||
|
import { BOOK_NAMES } from "@/lib/constants";
|
||||||
import { PageHeader } from "@/components/page-header";
|
import { PageHeader } from "@/components/page-header";
|
||||||
import { Card, CardContent } from "@/components/ui/card";
|
import { Card, CardContent } from "@/components/ui/card";
|
||||||
import { buttonVariants } from "@/components/ui/button";
|
import { buttonVariants } from "@/components/ui/button";
|
||||||
@@ -13,6 +19,27 @@ import { ChevronLeft, ChevronRight } from "lucide-react";
|
|||||||
import { cn } from "@/lib/utils";
|
import { cn } from "@/lib/utils";
|
||||||
import { MobileNav, type MobileNavGroup } from "@/components/mobile-nav";
|
import { MobileNav, type MobileNavGroup } from "@/components/mobile-nav";
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// Metadata
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
export async function generateMetadata({
|
||||||
|
params,
|
||||||
|
searchParams,
|
||||||
|
}: {
|
||||||
|
params: Promise<{ chapter: string }>;
|
||||||
|
searchParams: Promise<Record<string, string | string[] | undefined>>;
|
||||||
|
}): Promise<Metadata> {
|
||||||
|
const { chapter: slug } = await params;
|
||||||
|
const sp = await searchParams;
|
||||||
|
const chapter = await getProseChapter("ochkm", 0, slug);
|
||||||
|
const hlQuote = extractQuoteFromHl(sp, chapter?.paragraphs);
|
||||||
|
if (hlQuote) {
|
||||||
|
return buildOgMeta({ title: BOOK_NAMES["ochkm"], quote: hlQuote });
|
||||||
|
}
|
||||||
|
return ogForChapter("ochkm", chapter?.title || "");
|
||||||
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
// Page
|
// Page
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
export const dynamic = "force-dynamic";
|
||||||
|
|
||||||
|
import type { Metadata } from "next";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
import { notFound } from "next/navigation";
|
import { notFound } from "next/navigation";
|
||||||
import {
|
import {
|
||||||
@@ -6,6 +9,9 @@ import {
|
|||||||
type OwkChapter,
|
type OwkChapter,
|
||||||
type OwkSidebarItem,
|
type OwkSidebarItem,
|
||||||
} from "@/lib/owk";
|
} from "@/lib/owk";
|
||||||
|
import { getProseChapter } from "@/lib/api";
|
||||||
|
import { ogForChapter, extractQuoteFromHl, buildOgMeta } from "@/lib/og";
|
||||||
|
import { BOOK_NAMES } from "@/lib/constants";
|
||||||
import { PageHeader } from "@/components/page-header";
|
import { PageHeader } from "@/components/page-header";
|
||||||
import { Card, CardContent } from "@/components/ui/card";
|
import { Card, CardContent } from "@/components/ui/card";
|
||||||
import { buttonVariants } from "@/components/ui/button";
|
import { buttonVariants } from "@/components/ui/button";
|
||||||
@@ -13,6 +19,27 @@ import { ChevronLeft, ChevronRight } from "lucide-react";
|
|||||||
import { cn } from "@/lib/utils";
|
import { cn } from "@/lib/utils";
|
||||||
import { MobileNav, type MobileNavGroup } from "@/components/mobile-nav";
|
import { MobileNav, type MobileNavGroup } from "@/components/mobile-nav";
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// Metadata
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
export async function generateMetadata({
|
||||||
|
params,
|
||||||
|
searchParams,
|
||||||
|
}: {
|
||||||
|
params: Promise<{ chapter: string }>;
|
||||||
|
searchParams: Promise<Record<string, string | string[] | undefined>>;
|
||||||
|
}): Promise<Metadata> {
|
||||||
|
const { chapter: slug } = await params;
|
||||||
|
const sp = await searchParams;
|
||||||
|
const chapter = await getProseChapter("owk", 0, slug);
|
||||||
|
const hlQuote = extractQuoteFromHl(sp, chapter?.paragraphs);
|
||||||
|
if (hlQuote) {
|
||||||
|
return buildOgMeta({ title: BOOK_NAMES["owk"], quote: hlQuote });
|
||||||
|
}
|
||||||
|
return ogForChapter("owk", chapter?.title || "");
|
||||||
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
// Page
|
// Page
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
export const dynamic = "force-dynamic";
|
||||||
|
|
||||||
|
import type { Metadata } from "next";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
import { notFound } from "next/navigation";
|
import { notFound } from "next/navigation";
|
||||||
import {
|
import {
|
||||||
@@ -6,6 +9,9 @@ import {
|
|||||||
type PkChapter,
|
type PkChapter,
|
||||||
type PkSidebarItem,
|
type PkSidebarItem,
|
||||||
} from "@/lib/pk";
|
} from "@/lib/pk";
|
||||||
|
import { getProseChapter } from "@/lib/api";
|
||||||
|
import { ogForChapter, extractQuoteFromHl, buildOgMeta } from "@/lib/og";
|
||||||
|
import { BOOK_NAMES } from "@/lib/constants";
|
||||||
import { PageHeader } from "@/components/page-header";
|
import { PageHeader } from "@/components/page-header";
|
||||||
import { Card, CardContent } from "@/components/ui/card";
|
import { Card, CardContent } from "@/components/ui/card";
|
||||||
import { buttonVariants } from "@/components/ui/button";
|
import { buttonVariants } from "@/components/ui/button";
|
||||||
@@ -13,7 +19,26 @@ import { ChevronLeft, ChevronRight } from "lucide-react";
|
|||||||
import { cn } from "@/lib/utils";
|
import { cn } from "@/lib/utils";
|
||||||
import { MobileNav, type MobileNavGroup } from "@/components/mobile-nav";
|
import { MobileNav, type MobileNavGroup } from "@/components/mobile-nav";
|
||||||
|
|
||||||
export const dynamic = "force-dynamic";
|
// ---------------------------------------------------------------------------
|
||||||
|
// Metadata
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
export async function generateMetadata({
|
||||||
|
params,
|
||||||
|
searchParams,
|
||||||
|
}: {
|
||||||
|
params: Promise<{ chapter: string }>;
|
||||||
|
searchParams: Promise<Record<string, string | string[] | undefined>>;
|
||||||
|
}): Promise<Metadata> {
|
||||||
|
const { chapter: slug } = await params;
|
||||||
|
const sp = await searchParams;
|
||||||
|
const chapter = await getProseChapter("pk", 0, slug);
|
||||||
|
const hlQuote = extractQuoteFromHl(sp, chapter?.paragraphs);
|
||||||
|
if (hlQuote) {
|
||||||
|
return buildOgMeta({ title: BOOK_NAMES["pk"], quote: hlQuote });
|
||||||
|
}
|
||||||
|
return ogForChapter("pk", chapter?.title || "");
|
||||||
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
// Page
|
// Page
|
||||||
@@ -204,9 +229,7 @@ function PkNav({
|
|||||||
>
|
>
|
||||||
<ChevronLeft className="size-4" />
|
<ChevronLeft className="size-4" />
|
||||||
<span className="hidden sm:inline truncate max-w-[180px]">
|
<span className="hidden sm:inline truncate max-w-[180px]">
|
||||||
{prev.chapter != null
|
{prev.chapter != null ? `Prayer ${prev.chapter}` : prev.label}
|
||||||
? `Prayer ${prev.chapter}`
|
|
||||||
: prev.label}
|
|
||||||
</span>
|
</span>
|
||||||
<span className="sm:hidden">Previous</span>
|
<span className="sm:hidden">Previous</span>
|
||||||
</Link>
|
</Link>
|
||||||
@@ -224,9 +247,7 @@ function PkNav({
|
|||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<span className="hidden sm:inline truncate max-w-[180px]">
|
<span className="hidden sm:inline truncate max-w-[180px]">
|
||||||
{next.chapter != null
|
{next.chapter != null ? `Prayer ${next.chapter}` : next.label}
|
||||||
? `Prayer ${next.chapter}`
|
|
||||||
: next.label}
|
|
||||||
</span>
|
</span>
|
||||||
<span className="sm:hidden">Next</span>
|
<span className="sm:hidden">Next</span>
|
||||||
<ChevronRight className="size-4" />
|
<ChevronRight className="size-4" />
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
export const dynamic = "force-dynamic";
|
||||||
|
|
||||||
|
import type { Metadata } from "next";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
import { notFound } from "next/navigation";
|
import { notFound } from "next/navigation";
|
||||||
import {
|
import {
|
||||||
@@ -6,6 +9,9 @@ import {
|
|||||||
type PoyChapter,
|
type PoyChapter,
|
||||||
type PoySidebarItem,
|
type PoySidebarItem,
|
||||||
} from "@/lib/poy";
|
} from "@/lib/poy";
|
||||||
|
import { getProseChapter } from "@/lib/api";
|
||||||
|
import { ogForChapter, extractQuoteFromHl, buildOgMeta } from "@/lib/og";
|
||||||
|
import { BOOK_NAMES } from "@/lib/constants";
|
||||||
import { PageHeader } from "@/components/page-header";
|
import { PageHeader } from "@/components/page-header";
|
||||||
import { Card, CardContent } from "@/components/ui/card";
|
import { Card, CardContent } from "@/components/ui/card";
|
||||||
import { buttonVariants } from "@/components/ui/button";
|
import { buttonVariants } from "@/components/ui/button";
|
||||||
@@ -13,6 +19,27 @@ import { ChevronLeft, ChevronRight } from "lucide-react";
|
|||||||
import { cn } from "@/lib/utils";
|
import { cn } from "@/lib/utils";
|
||||||
import { MobileNav, type MobileNavGroup } from "@/components/mobile-nav";
|
import { MobileNav, type MobileNavGroup } from "@/components/mobile-nav";
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// Metadata
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
export async function generateMetadata({
|
||||||
|
params,
|
||||||
|
searchParams,
|
||||||
|
}: {
|
||||||
|
params: Promise<{ chapter: string }>;
|
||||||
|
searchParams: Promise<Record<string, string | string[] | undefined>>;
|
||||||
|
}): Promise<Metadata> {
|
||||||
|
const { chapter: slug } = await params;
|
||||||
|
const sp = await searchParams;
|
||||||
|
const chapter = await getProseChapter("poy", 0, slug);
|
||||||
|
const hlQuote = extractQuoteFromHl(sp, chapter?.paragraphs);
|
||||||
|
if (hlQuote) {
|
||||||
|
return buildOgMeta({ title: BOOK_NAMES["poy"], quote: hlQuote });
|
||||||
|
}
|
||||||
|
return ogForChapter("poy", chapter?.title || "");
|
||||||
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
// Page
|
// Page
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
export const dynamic = "force-dynamic";
|
||||||
|
|
||||||
|
import type { Metadata } from "next";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
import { notFound } from "next/navigation";
|
import { notFound } from "next/navigation";
|
||||||
import {
|
import {
|
||||||
@@ -6,6 +9,9 @@ import {
|
|||||||
type PqpaChapter,
|
type PqpaChapter,
|
||||||
type PqpaSidebarItem,
|
type PqpaSidebarItem,
|
||||||
} from "@/lib/pqpa";
|
} from "@/lib/pqpa";
|
||||||
|
import { getProseChapter } from "@/lib/api";
|
||||||
|
import { ogForChapter, extractQuoteFromHl, buildOgMeta } from "@/lib/og";
|
||||||
|
import { BOOK_NAMES } from "@/lib/constants";
|
||||||
import { PageHeader } from "@/components/page-header";
|
import { PageHeader } from "@/components/page-header";
|
||||||
import { Card, CardContent } from "@/components/ui/card";
|
import { Card, CardContent } from "@/components/ui/card";
|
||||||
import { buttonVariants } from "@/components/ui/button";
|
import { buttonVariants } from "@/components/ui/button";
|
||||||
@@ -13,6 +19,27 @@ import { ChevronLeft, ChevronRight } from "lucide-react";
|
|||||||
import { cn } from "@/lib/utils";
|
import { cn } from "@/lib/utils";
|
||||||
import { MobileNav, type MobileNavGroup } from "@/components/mobile-nav";
|
import { MobileNav, type MobileNavGroup } from "@/components/mobile-nav";
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// Metadata
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
export async function generateMetadata({
|
||||||
|
params,
|
||||||
|
searchParams,
|
||||||
|
}: {
|
||||||
|
params: Promise<{ chapter: string }>;
|
||||||
|
searchParams: Promise<Record<string, string | string[] | undefined>>;
|
||||||
|
}): Promise<Metadata> {
|
||||||
|
const { chapter: slug } = await params;
|
||||||
|
const sp = await searchParams;
|
||||||
|
const chapter = await getProseChapter("pqpa", 0, slug);
|
||||||
|
const hlQuote = extractQuoteFromHl(sp, chapter?.paragraphs);
|
||||||
|
if (hlQuote) {
|
||||||
|
return buildOgMeta({ title: BOOK_NAMES["pqpa"], quote: hlQuote });
|
||||||
|
}
|
||||||
|
return ogForChapter("pqpa", chapter?.title || "");
|
||||||
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
// Page
|
// Page
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
export const dynamic = "force-dynamic";
|
||||||
|
|
||||||
|
import type { Metadata } from "next";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
import { notFound } from "next/navigation";
|
import { notFound } from "next/navigation";
|
||||||
import {
|
import {
|
||||||
@@ -6,6 +9,9 @@ import {
|
|||||||
type RvChapter,
|
type RvChapter,
|
||||||
type RvSidebarItem,
|
type RvSidebarItem,
|
||||||
} from "@/lib/rv";
|
} from "@/lib/rv";
|
||||||
|
import { getProseChapter } from "@/lib/api";
|
||||||
|
import { ogForChapter, extractQuoteFromHl, buildOgMeta } from "@/lib/og";
|
||||||
|
import { BOOK_NAMES } from "@/lib/constants";
|
||||||
import { PageHeader } from "@/components/page-header";
|
import { PageHeader } from "@/components/page-header";
|
||||||
import { Card, CardContent } from "@/components/ui/card";
|
import { Card, CardContent } from "@/components/ui/card";
|
||||||
import { buttonVariants } from "@/components/ui/button";
|
import { buttonVariants } from "@/components/ui/button";
|
||||||
@@ -13,6 +19,27 @@ import { ChevronLeft, ChevronRight } from "lucide-react";
|
|||||||
import { cn } from "@/lib/utils";
|
import { cn } from "@/lib/utils";
|
||||||
import { MobileNav, type MobileNavGroup } from "@/components/mobile-nav";
|
import { MobileNav, type MobileNavGroup } from "@/components/mobile-nav";
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// Metadata
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
export async function generateMetadata({
|
||||||
|
params,
|
||||||
|
searchParams,
|
||||||
|
}: {
|
||||||
|
params: Promise<{ chapter: string }>;
|
||||||
|
searchParams: Promise<Record<string, string | string[] | undefined>>;
|
||||||
|
}): Promise<Metadata> {
|
||||||
|
const { chapter: slug } = await params;
|
||||||
|
const sp = await searchParams;
|
||||||
|
const chapter = await getProseChapter("rv", 0, slug);
|
||||||
|
const hlQuote = extractQuoteFromHl(sp, chapter?.paragraphs);
|
||||||
|
if (hlQuote) {
|
||||||
|
return buildOgMeta({ title: BOOK_NAMES["rv"], quote: hlQuote });
|
||||||
|
}
|
||||||
|
return ogForChapter("rv", chapter?.title || "");
|
||||||
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
// Page
|
// Page
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -1,6 +1,23 @@
|
|||||||
|
import type { Metadata } from "next";
|
||||||
import { redirect } from "next/navigation";
|
import { redirect } from "next/navigation";
|
||||||
import { notFound } from "next/navigation";
|
import { notFound } from "next/navigation";
|
||||||
import { getChapterVerseIndex } from "@/lib/api";
|
import { getChapterVerseIndex } from "@/lib/api";
|
||||||
|
import { buildOgMeta } from "@/lib/og";
|
||||||
|
import { BOOK_NAMES } from "@/lib/constants";
|
||||||
|
|
||||||
|
export const dynamic = "force-dynamic";
|
||||||
|
|
||||||
|
export async function generateMetadata({
|
||||||
|
params,
|
||||||
|
}: {
|
||||||
|
params: Promise<{ chapter: string }>;
|
||||||
|
}): Promise<Metadata> {
|
||||||
|
const { chapter } = await params;
|
||||||
|
return buildOgMeta({
|
||||||
|
title: BOOK_NAMES["sb1962"],
|
||||||
|
detail: `Chapter ${chapter}`,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
export default async function ChapterPage({
|
export default async function ChapterPage({
|
||||||
params,
|
params,
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
export const dynamic = "force-dynamic";
|
||||||
|
|
||||||
|
import type { Metadata } from "next";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
import { notFound } from "next/navigation";
|
import { notFound } from "next/navigation";
|
||||||
import {
|
import {
|
||||||
@@ -6,6 +9,9 @@ import {
|
|||||||
type SsrChapter,
|
type SsrChapter,
|
||||||
type SsrSidebarItem,
|
type SsrSidebarItem,
|
||||||
} from "@/lib/ssr";
|
} from "@/lib/ssr";
|
||||||
|
import { getProseChapter } from "@/lib/api";
|
||||||
|
import { ogForChapter, extractQuoteFromHl, buildOgMeta } from "@/lib/og";
|
||||||
|
import { BOOK_NAMES } from "@/lib/constants";
|
||||||
import { PageHeader } from "@/components/page-header";
|
import { PageHeader } from "@/components/page-header";
|
||||||
import { Card, CardContent } from "@/components/ui/card";
|
import { Card, CardContent } from "@/components/ui/card";
|
||||||
import { buttonVariants } from "@/components/ui/button";
|
import { buttonVariants } from "@/components/ui/button";
|
||||||
@@ -13,6 +19,27 @@ import { ChevronLeft, ChevronRight } from "lucide-react";
|
|||||||
import { cn } from "@/lib/utils";
|
import { cn } from "@/lib/utils";
|
||||||
import { MobileNav, type MobileNavGroup } from "@/components/mobile-nav";
|
import { MobileNav, type MobileNavGroup } from "@/components/mobile-nav";
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// Metadata
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
export async function generateMetadata({
|
||||||
|
params,
|
||||||
|
searchParams,
|
||||||
|
}: {
|
||||||
|
params: Promise<{ chapter: string }>;
|
||||||
|
searchParams: Promise<Record<string, string | string[] | undefined>>;
|
||||||
|
}): Promise<Metadata> {
|
||||||
|
const { chapter: slug } = await params;
|
||||||
|
const sp = await searchParams;
|
||||||
|
const chapter = await getProseChapter("ssr", 0, slug);
|
||||||
|
const hlQuote = extractQuoteFromHl(sp, chapter?.paragraphs);
|
||||||
|
if (hlQuote) {
|
||||||
|
return buildOgMeta({ title: BOOK_NAMES["ssr"], quote: hlQuote });
|
||||||
|
}
|
||||||
|
return ogForChapter("ssr", chapter?.title || "");
|
||||||
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
// Page
|
// Page
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
export const dynamic = "force-dynamic";
|
||||||
|
|
||||||
|
import type { Metadata } from "next";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
import { notFound } from "next/navigation";
|
import { notFound } from "next/navigation";
|
||||||
import {
|
import {
|
||||||
@@ -7,6 +10,9 @@ import {
|
|||||||
type SvaChapter,
|
type SvaChapter,
|
||||||
type SvaSidebarItem,
|
type SvaSidebarItem,
|
||||||
} from "@/lib/sva";
|
} from "@/lib/sva";
|
||||||
|
import { getProseChapter } from "@/lib/api";
|
||||||
|
import { ogForChapter, extractQuoteFromHl, buildOgMeta } from "@/lib/og";
|
||||||
|
import { BOOK_NAMES } from "@/lib/constants";
|
||||||
import { PageHeader } from "@/components/page-header";
|
import { PageHeader } from "@/components/page-header";
|
||||||
import { Card, CardContent } from "@/components/ui/card";
|
import { Card, CardContent } from "@/components/ui/card";
|
||||||
import { buttonVariants } from "@/components/ui/button";
|
import { buttonVariants } from "@/components/ui/button";
|
||||||
@@ -14,6 +20,27 @@ import { ChevronLeft, ChevronRight } from "lucide-react";
|
|||||||
import { cn } from "@/lib/utils";
|
import { cn } from "@/lib/utils";
|
||||||
import { MobileNav, type MobileNavGroup } from "@/components/mobile-nav";
|
import { MobileNav, type MobileNavGroup } from "@/components/mobile-nav";
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// Metadata
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
export async function generateMetadata({
|
||||||
|
params,
|
||||||
|
searchParams,
|
||||||
|
}: {
|
||||||
|
params: Promise<{ chapter: string }>;
|
||||||
|
searchParams: Promise<Record<string, string | string[] | undefined>>;
|
||||||
|
}): Promise<Metadata> {
|
||||||
|
const { chapter: slug } = await params;
|
||||||
|
const sp = await searchParams;
|
||||||
|
const chapter = await getProseChapter("sva", 0, slug);
|
||||||
|
const hlQuote = extractQuoteFromHl(sp, chapter?.paragraphs);
|
||||||
|
if (hlQuote) {
|
||||||
|
return buildOgMeta({ title: BOOK_NAMES["sva"], quote: hlQuote });
|
||||||
|
}
|
||||||
|
return ogForChapter("sva", chapter?.title || "");
|
||||||
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
// Page
|
// Page
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
export const dynamic = "force-dynamic";
|
||||||
|
|
||||||
|
import type { Metadata } from "next";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
import { notFound } from "next/navigation";
|
import { notFound } from "next/navigation";
|
||||||
import {
|
import {
|
||||||
@@ -6,6 +9,9 @@ import {
|
|||||||
type TlcChapter,
|
type TlcChapter,
|
||||||
type TlcSidebarItem,
|
type TlcSidebarItem,
|
||||||
} from "@/lib/tlc";
|
} from "@/lib/tlc";
|
||||||
|
import { getProseChapter } from "@/lib/api";
|
||||||
|
import { ogForChapter, extractQuoteFromHl, buildOgMeta } from "@/lib/og";
|
||||||
|
import { BOOK_NAMES } from "@/lib/constants";
|
||||||
import { PageHeader } from "@/components/page-header";
|
import { PageHeader } from "@/components/page-header";
|
||||||
import { Card, CardContent } from "@/components/ui/card";
|
import { Card, CardContent } from "@/components/ui/card";
|
||||||
import { buttonVariants } from "@/components/ui/button";
|
import { buttonVariants } from "@/components/ui/button";
|
||||||
@@ -13,6 +19,27 @@ import { ChevronLeft, ChevronRight } from "lucide-react";
|
|||||||
import { cn } from "@/lib/utils";
|
import { cn } from "@/lib/utils";
|
||||||
import { MobileNav, type MobileNavGroup } from "@/components/mobile-nav";
|
import { MobileNav, type MobileNavGroup } from "@/components/mobile-nav";
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// Metadata
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
export async function generateMetadata({
|
||||||
|
params,
|
||||||
|
searchParams,
|
||||||
|
}: {
|
||||||
|
params: Promise<{ chapter: string }>;
|
||||||
|
searchParams: Promise<Record<string, string | string[] | undefined>>;
|
||||||
|
}): Promise<Metadata> {
|
||||||
|
const { chapter: slug } = await params;
|
||||||
|
const sp = await searchParams;
|
||||||
|
const chapter = await getProseChapter("tlc", 0, slug);
|
||||||
|
const hlQuote = extractQuoteFromHl(sp, chapter?.paragraphs);
|
||||||
|
if (hlQuote) {
|
||||||
|
return buildOgMeta({ title: BOOK_NAMES["tlc"], quote: hlQuote });
|
||||||
|
}
|
||||||
|
return ogForChapter("tlc", chapter?.title || "");
|
||||||
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
// Page
|
// Page
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
export const dynamic = "force-dynamic";
|
||||||
|
|
||||||
|
import type { Metadata } from "next";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
import { notFound } from "next/navigation";
|
import { notFound } from "next/navigation";
|
||||||
import {
|
import {
|
||||||
@@ -6,6 +9,9 @@ import {
|
|||||||
type TlkChapter,
|
type TlkChapter,
|
||||||
type TlkSidebarItem,
|
type TlkSidebarItem,
|
||||||
} from "@/lib/tlk";
|
} from "@/lib/tlk";
|
||||||
|
import { getProseChapter } from "@/lib/api";
|
||||||
|
import { ogForChapter, extractQuoteFromHl, buildOgMeta } from "@/lib/og";
|
||||||
|
import { BOOK_NAMES } from "@/lib/constants";
|
||||||
import { PageHeader } from "@/components/page-header";
|
import { PageHeader } from "@/components/page-header";
|
||||||
import { Card, CardContent } from "@/components/ui/card";
|
import { Card, CardContent } from "@/components/ui/card";
|
||||||
import { buttonVariants } from "@/components/ui/button";
|
import { buttonVariants } from "@/components/ui/button";
|
||||||
@@ -13,6 +19,27 @@ import { ChevronLeft, ChevronRight } from "lucide-react";
|
|||||||
import { cn } from "@/lib/utils";
|
import { cn } from "@/lib/utils";
|
||||||
import { MobileNav, type MobileNavGroup } from "@/components/mobile-nav";
|
import { MobileNav, type MobileNavGroup } from "@/components/mobile-nav";
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// Metadata
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
export async function generateMetadata({
|
||||||
|
params,
|
||||||
|
searchParams,
|
||||||
|
}: {
|
||||||
|
params: Promise<{ chapter: string }>;
|
||||||
|
searchParams: Promise<Record<string, string | string[] | undefined>>;
|
||||||
|
}): Promise<Metadata> {
|
||||||
|
const { chapter: slug } = await params;
|
||||||
|
const sp = await searchParams;
|
||||||
|
const chapter = await getProseChapter("tlk", 0, slug);
|
||||||
|
const hlQuote = extractQuoteFromHl(sp, chapter?.paragraphs);
|
||||||
|
if (hlQuote) {
|
||||||
|
return buildOgMeta({ title: BOOK_NAMES["tlk"], quote: hlQuote });
|
||||||
|
}
|
||||||
|
return ogForChapter("tlk", chapter?.title || "");
|
||||||
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
// Page
|
// Page
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
export const dynamic = "force-dynamic";
|
||||||
|
|
||||||
|
import type { Metadata } from "next";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
import { notFound } from "next/navigation";
|
import { notFound } from "next/navigation";
|
||||||
import {
|
import {
|
||||||
@@ -6,6 +9,9 @@ import {
|
|||||||
type TqkChapter,
|
type TqkChapter,
|
||||||
type TqkSidebarItem,
|
type TqkSidebarItem,
|
||||||
} from "@/lib/tqk";
|
} from "@/lib/tqk";
|
||||||
|
import { getProseChapter } from "@/lib/api";
|
||||||
|
import { ogForChapter, extractQuoteFromHl, buildOgMeta } from "@/lib/og";
|
||||||
|
import { BOOK_NAMES } from "@/lib/constants";
|
||||||
import { PageHeader } from "@/components/page-header";
|
import { PageHeader } from "@/components/page-header";
|
||||||
import { Card, CardContent } from "@/components/ui/card";
|
import { Card, CardContent } from "@/components/ui/card";
|
||||||
import { buttonVariants } from "@/components/ui/button";
|
import { buttonVariants } from "@/components/ui/button";
|
||||||
@@ -13,6 +19,27 @@ import { ChevronLeft, ChevronRight } from "lucide-react";
|
|||||||
import { cn } from "@/lib/utils";
|
import { cn } from "@/lib/utils";
|
||||||
import { MobileNav, type MobileNavGroup } from "@/components/mobile-nav";
|
import { MobileNav, type MobileNavGroup } from "@/components/mobile-nav";
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// Metadata
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
export async function generateMetadata({
|
||||||
|
params,
|
||||||
|
searchParams,
|
||||||
|
}: {
|
||||||
|
params: Promise<{ chapter: string }>;
|
||||||
|
searchParams: Promise<Record<string, string | string[] | undefined>>;
|
||||||
|
}): Promise<Metadata> {
|
||||||
|
const { chapter: slug } = await params;
|
||||||
|
const sp = await searchParams;
|
||||||
|
const chapter = await getProseChapter("tqk", 0, slug);
|
||||||
|
const hlQuote = extractQuoteFromHl(sp, chapter?.paragraphs);
|
||||||
|
if (hlQuote) {
|
||||||
|
return buildOgMeta({ title: BOOK_NAMES["tqk"], quote: hlQuote });
|
||||||
|
}
|
||||||
|
return ogForChapter("tqk", chapter?.title || "");
|
||||||
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
// Page
|
// Page
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
export const dynamic = "force-dynamic";
|
||||||
|
|
||||||
|
import type { Metadata } from "next";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
import { notFound } from "next/navigation";
|
import { notFound } from "next/navigation";
|
||||||
import {
|
import {
|
||||||
@@ -6,6 +9,9 @@ import {
|
|||||||
type TtpChapter,
|
type TtpChapter,
|
||||||
type TtpSidebarItem,
|
type TtpSidebarItem,
|
||||||
} from "@/lib/ttp";
|
} from "@/lib/ttp";
|
||||||
|
import { getProseChapter } from "@/lib/api";
|
||||||
|
import { ogForChapter, extractQuoteFromHl, buildOgMeta } from "@/lib/og";
|
||||||
|
import { BOOK_NAMES } from "@/lib/constants";
|
||||||
import { PageHeader } from "@/components/page-header";
|
import { PageHeader } from "@/components/page-header";
|
||||||
import { Card, CardContent } from "@/components/ui/card";
|
import { Card, CardContent } from "@/components/ui/card";
|
||||||
import { buttonVariants } from "@/components/ui/button";
|
import { buttonVariants } from "@/components/ui/button";
|
||||||
@@ -13,6 +19,27 @@ import { ChevronLeft, ChevronRight } from "lucide-react";
|
|||||||
import { cn } from "@/lib/utils";
|
import { cn } from "@/lib/utils";
|
||||||
import { MobileNav, type MobileNavGroup } from "@/components/mobile-nav";
|
import { MobileNav, type MobileNavGroup } from "@/components/mobile-nav";
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// Metadata
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
export async function generateMetadata({
|
||||||
|
params,
|
||||||
|
searchParams,
|
||||||
|
}: {
|
||||||
|
params: Promise<{ chapter: string }>;
|
||||||
|
searchParams: Promise<Record<string, string | string[] | undefined>>;
|
||||||
|
}): Promise<Metadata> {
|
||||||
|
const { chapter: slug } = await params;
|
||||||
|
const sp = await searchParams;
|
||||||
|
const chapter = await getProseChapter("ttp", 0, slug);
|
||||||
|
const hlQuote = extractQuoteFromHl(sp, chapter?.paragraphs);
|
||||||
|
if (hlQuote) {
|
||||||
|
return buildOgMeta({ title: BOOK_NAMES["ttp"], quote: hlQuote });
|
||||||
|
}
|
||||||
|
return ogForChapter("ttp", chapter?.title || "");
|
||||||
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
// Page
|
// Page
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
export const dynamic = "force-dynamic";
|
export const dynamic = "force-dynamic";
|
||||||
|
|
||||||
|
import type { Metadata } from "next";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
import { notFound } from "next/navigation";
|
import { notFound } from "next/navigation";
|
||||||
import {
|
import {
|
||||||
@@ -8,6 +9,9 @@ import {
|
|||||||
type VaChapter,
|
type VaChapter,
|
||||||
type VaSidebarItem,
|
type VaSidebarItem,
|
||||||
} from "@/lib/va";
|
} from "@/lib/va";
|
||||||
|
import { getProseChapter } from "@/lib/api";
|
||||||
|
import { ogForChapter, extractQuoteFromHl, buildOgMeta } from "@/lib/og";
|
||||||
|
import { BOOK_NAMES } from "@/lib/constants";
|
||||||
import { PageHeader } from "@/components/page-header";
|
import { PageHeader } from "@/components/page-header";
|
||||||
import { Card, CardContent } from "@/components/ui/card";
|
import { Card, CardContent } from "@/components/ui/card";
|
||||||
import { buttonVariants } from "@/components/ui/button";
|
import { buttonVariants } from "@/components/ui/button";
|
||||||
@@ -15,6 +19,31 @@ import { ChevronLeft, ChevronRight } from "lucide-react";
|
|||||||
import { cn } from "@/lib/utils";
|
import { cn } from "@/lib/utils";
|
||||||
import { MobileNav, type MobileNavGroup } from "@/components/mobile-nav";
|
import { MobileNav, type MobileNavGroup } from "@/components/mobile-nav";
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// Metadata
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
export async function generateMetadata({
|
||||||
|
params,
|
||||||
|
searchParams,
|
||||||
|
}: {
|
||||||
|
params: Promise<{ chapter: string }>;
|
||||||
|
searchParams: Promise<Record<string, string | string[] | undefined>>;
|
||||||
|
}): Promise<Metadata> {
|
||||||
|
const { chapter: slug } = await params;
|
||||||
|
const sp = await searchParams;
|
||||||
|
const chapter = await getProseChapter("va", 0, slug);
|
||||||
|
const hlQuote = extractQuoteFromHl(sp, chapter?.paragraphs);
|
||||||
|
if (hlQuote) {
|
||||||
|
return buildOgMeta({ title: BOOK_NAMES["va"], quote: hlQuote });
|
||||||
|
}
|
||||||
|
return ogForChapter("va", chapter?.title || "");
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// Page
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
export default async function VaChapterPage({
|
export default async function VaChapterPage({
|
||||||
params,
|
params,
|
||||||
}: {
|
}: {
|
||||||
|
|||||||
Reference in New Issue
Block a user