import { notFound } from "next/navigation"; import Link from "next/link"; import { loadStories } from "@/utils/mdxLoader"; import { formatReadingTime } from "@/utils/readingTime"; interface StoryPageProps { params: { slug: string; }; } import fs from "fs"; import { Metadata } from "next"; export async function generateStaticParams() { const storiesDirectory = process.cwd() + "/src/content/stories"; try { const filenames = fs.readdirSync(storiesDirectory); return filenames.map((filename: string) => ({ slug: filename.replace(/\.mdx$/, ""), })); } catch { return []; } } export async function generateMetadata({ params, }: StoryPageProps): Promise { const story = await getStoryBySlug(params.slug); if (!story) { return { title: "Story Not Found", }; } return { title: `${story.title} | Mainasara Tsowa`, description: story.excerpt, openGraph: { title: `${story.title} | Mainasara Tsowa`, description: story.excerpt, url: `https://mainasara.dev/stories/${params.slug}`, }, twitter: { title: `${story.title} | Mainasara Tsowa`, description: story.excerpt, }, }; } async function getStoryBySlug(slug: string) { const stories = await loadStories(); return stories.find( (story) => story.id === slug.replace(/[^a-zA-Z0-9]/g, "-"), ); } export default async function StoryPage({ params }: StoryPageProps) { const story = await getStoryBySlug(params.slug); if (!story) { notFound(); } return (
📝

Mini Stories

Capturing moments in brief narratives

{story.title}

{formatReadingTime(story.readTime)} read {new Date(story.createdAt).toLocaleDateString("en-US", { year: "numeric", month: "long", day: "numeric", })}
{story.content}
); }