You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

76 lines
1.7 KiB

import { notFound } from 'next/navigation';
import { type Metadata } from 'next/types';
import { allPosts } from 'contentlayer/generated';
import { blogConfig } from '@/config';
import { Comments } from '@/components/comments';
import { MDXContent } from '@/components/mdx-content';
import { PostIntro } from '@/components/post-intro';
type PostPageProps = {
params: {
slug: string[];
};
};
export async function generateStaticParams(): Promise<
PostPageProps['params'][]
> {
return allPosts.map(({ slug }) => ({
slug: slug.split('/'),
}));
}
export function generateMetadata({ params }: PostPageProps): Metadata {
const { title, excerpt, url, date } = allPosts.find(
({ slug }) => slug === params.slug.join('/'),
) || {
title: 'Post Not Found',
excerpt: null,
url: '/posts',
date: new Date().toISOString(),
};
const ogImage = {
url: `${blogConfig.url}/og?title=${title}&subtitle=${excerpt ?? ''}`,
};
const description = excerpt ?? 'Post Not Found';
return {
title,
description,
openGraph: {
type: 'article',
url: `${blogConfig.url}${url}`,
title,
description,
publishedTime: date,
images: [ogImage],
},
twitter: {
title,
description,
images: ogImage,
card: 'summary_large_image',
},
};
}
export default function PostPage({ params }: PostPageProps) {
const post = allPosts.find(({ slug }) => slug === params.slug.join('/'));
if (!post) {
notFound();
}
return (
<article className="h-full px-8">
<PostIntro title={post.title} date={post.date} tags={post.tags} />
<MDXContent code={post.body.code} />
{
//<Comments />
}
</article>
);
}