import { blogs } from "@/lib/source"; import { notFound } from "next/navigation"; import { absoluteUrl, formatDate } from "@/lib/utils"; import DatabaseTable from "@/components/mdx/database-tables"; import { cn } from "@/lib/utils"; import { Step, Steps } from "fumadocs-ui/components/steps"; import { Tab, Tabs } from "fumadocs-ui/components/tabs"; import { GenerateSecret } from "@/components/generate-secret"; import { AnimatePresence } from "@/components/ui/fade-in"; import { TypeTable } from "fumadocs-ui/components/type-table"; import { Features } from "@/components/blocks/features"; import { ForkButton } from "@/components/fork-button"; import Link from "next/link"; import defaultMdxComponents from "fumadocs-ui/mdx"; import { File, Folder, Files } from "fumadocs-ui/components/files"; import { Accordion, Accordions } from "fumadocs-ui/components/accordion"; import { Pre } from "fumadocs-ui/components/codeblock"; import { Glow } from "../_components/default-changelog"; import { XIcon } from "../_components/icons"; import { StarField } from "../_components/stat-field"; import Image from "next/image"; import { BlogPage } from "../_components/blog-list"; import { Callout } from "@/components/ui/callout"; import { ArrowLeftIcon, ExternalLink } from "lucide-react"; import { Support } from "../_components/support"; const metaTitle = "Blogs"; const metaDescription = "Latest changes , fixes and updates."; const ogImage = "https://better-auth.com/release-og/changelog-og.png"; export default async function Page({ params, }: { params: Promise<{ slug?: string[] }>; }) { const { slug } = await params; if (!slug) { return ; } const page = blogs.getPage(slug); if (!page) { notFound(); } const MDX = page.data?.body; const { title, description, date } = page.data; return (

{title}

{description && (

{description}

)}
{page.data?.author?.avatar && ( {page.data?.author?.name )}
{page.data?.author?.name && ( {page.data.author.name} )} {page.data?.author?.twitter && ( <> · @{page.data.author.twitter} )} {date && ( <> · )}
Blogs

{ const isExternal = typeof href === "string" && /^(https?:)?\/\//.test(href); const classes = cn( "inline-flex items-center gap-1 font-medium underline decoration-dashed", className, ); if (isExternal) { return ( {children} ); } return ( {children} ); }, Link: ({ className, href, children, ...props }: any) => { const isExternal = typeof href === "string" && /^(https?:)?\/\//.test(href); const classes = cn( "inline-flex items-center gap-1 font-medium underline decoration-dashed", className, ); if (isExternal) { return ( {children} ); } return ( {children} ); }, Step, Steps, File, Folder, Files, Tab, Tabs, Pre: Pre, GenerateSecret, AnimatePresence, TypeTable, Features, ForkButton, DatabaseTable, Accordion, Accordions, Callout: ({ children, type, ...props }: { children: React.ReactNode; type?: "info" | "warn" | "error" | "success" | "warning"; [key: string]: any; }) => ( {children} ), Support, }} />
); } export async function generateMetadata({ params, }: { params: Promise<{ slug?: string[] }>; }) { const { slug } = await params; if (!slug) { return { metadataBase: new URL("https://better-auth.com/blogs"), title: metaTitle, description: metaDescription, openGraph: { title: metaTitle, description: metaDescription, images: [ { url: ogImage, }, ], url: "https://better-auth.com/blogs", }, twitter: { card: "summary_large_image", title: metaTitle, description: metaDescription, images: [ogImage], }, }; } const page = blogs.getPage(slug); if (page == null) notFound(); const baseUrl = process.env.NEXT_PUBLIC_URL || process.env.VERCEL_URL; const url = new URL( `${baseUrl?.startsWith("http") ? baseUrl : `https://${baseUrl}`}${ page.data?.image }`, ); const { title, description } = page.data; return { title, description, openGraph: { title, description, type: "website", url: absoluteUrl(`blog/${slug.join("/")}`), images: [ { url: url.toString(), width: 1200, height: 630, alt: title, }, ], }, twitter: { card: "summary_large_image", title, description, images: [url.toString()], }, }; } export function generateStaticParams() { return blogs.generateParams(); }