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
						
					
					
				
			
		
		
	
	
							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>
 | |
|   );
 | |
| }
 | |
| 
 |