websites/blog/[slug]/page.tsx

124 lines
5.3 KiB
TypeScript
Raw Permalink Normal View History

2024-05-06 22:35:25 +02:00
import { notFound } from 'next/navigation'
import { CustomMDX } from '@/components/Mdx'
2024-05-06 22:36:39 +02:00
import { formatDate, getBlogPosts } from '@/blog/utils'
2024-05-06 22:35:25 +02:00
import { baseUrl } from '@/app/sitemap'
export async function generateStaticParams() {
let posts = getBlogPosts()
return posts.map((post) => ({
slug: post.slug,
}))
}
export function generateMetadata({ params }) {
let post = getBlogPosts().find((post) => post.slug === params.slug)
if (!post) {
return
}
let {
title,
publishedAt: publishedTime,
summary: description,
image,
} = post.metadata
let ogImage = image ? image : `${baseUrl}/og?title=${encodeURIComponent(title)}`
return {
title,
description,
openGraph: {
title,
description,
type: 'article',
publishedTime,
url: `${baseUrl}/blog/${post.slug}`,
images: [
{
url: ogImage,
},
],
},
twitter: {
card: 'summary_large_image',
title,
description,
images: [ogImage],
},
}
}
export default function Blog({ params }) {
let post = getBlogPosts().find((post) => post.slug === params.slug)
if (!post) {
notFound()
}
return (
<section className="py-10 lg:py-20">
<script
type="application/ld+json"
suppressHydrationWarning
dangerouslySetInnerHTML={{
__html: JSON.stringify({
'@context': 'https://schema.org',
'@type': 'BlogPosting',
headline: post.metadata.title,
datePublished: post.metadata.publishedAt,
dateModified: post.metadata.publishedAt,
description: post.metadata.summary,
image: post.metadata.image
? `${baseUrl}${post.metadata.image}`
: `/og?title=${encodeURIComponent(post.metadata.title)}`,
url: `${baseUrl}/blog/${post.slug}`,
author: {
'@type': 'Person',
name: 'My Portfolio',
},
}),
}}
/>
<div className="container mx-auto px-4">
<div className="max-w-2xl mx-auto mb-12 text-center">
{/* <a className="uppercase text-base lg:text-xl text-green-600 hover:text-green-700 hover:underline" href="#">Travel</a> */}
<span className="text-base lg:text-xl text-gray-400">{formatDate(post.metadata.publishedAt)}</span>
<div className="mt-2">
<h1 className="mb-6 text-4xl lg:text-5xl font-bold font-heading">{post.metadata.title}</h1>
{/* <div className="flex justify-center">
<div className="mr-4">
<img className="w-12 h-12 object-cover object-top rounded-full" src="https://images.unsplash.com/photo-1494790108377-be9c29b29330?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=334&q=80" alt="" />
</div>
<div className="text-left">
<a href="#">
<h3 className="text-gray-500 hover:text-gray-600 hover:underline font-bold">Alice Bradley</h3>
</a>
<a href="#">
<span className="text-xs text-green-600 font-bold">Author</span>
</a>
</div>
</div> */}
</div>
</div>
<div className="max-w-2xl mx-auto">
<CustomMDX source={post.content} />
<p className="mb-6 leading-loose text-gray-500">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent commodo est eget consequat imperdiet. Suspendisse laoreet scelerisque lobortis. Mauris facilisis hendrerit nulla at vehicula. Suspendisse potenti. Ut in nulla a purus bibendum convallis. Suspendisse id nunc maximus, suscipit ante ac, vulputate massa. Sed ut nunc suscipit, bibendum arcu a, interdum elit. Nullam laoreet mollis dictum. Ut suscipit, magna at elementum iaculis, erat erat fermentum justo, sit amet ultrices enim leo sit amet purus. Nulla sed erat molestie, auctor mauris lobortis, iaculis justo.</p>
<p className="leading-loose text-gray-500">Duis hendrerit dui in dui ornare luctus. Nullam gravida tincidunt lorem cursus suscipit. Integer scelerisque sem et sem porta, eu volutpat mi tempor. Duis interdum sodales lacus non tempor. Nam mattis, sapien a commodo ultrices, nunc orci tincidunt ante, tempus tempus turpis metus laoreet lacus. Praesent condimentum, arcu ut fringilla tincidunt, augue diam pretium augue, sit amet vestibulum nunc felis vel metus. Duis dolor nulla, pellentesque non ultrices ut, convallis eu felis. Duis luctus tempor arcu, vitae elementum massa porta non. Morbi aliquet, neque ut volutpat sodales, dui enim facilisis enim, ut dictum lacus neque in urna. Nam metus elit, ullamcorper pretium nisi at, aliquet gravida lectus. Nullam id lectus pellentesque, suscipit dolor eget, consequat velit. Pellentesque finibus commodo nisl, id interdum leo. Maecenas aliquam felis justo, ut sagittis nunc maximus ut.</p>
</div>
</div>
{/* <h1 className="title font-semibold text-2xl tracking-tighter">
{post.metadata.title}
</h1>
<div className="flex justify-between items-center mt-2 mb-8 text-sm">
<p className="text-sm text-neutral-600 dark:text-neutral-400">
{formatDate(post.metadata.publishedAt)}
</p>
</div>
<article className="prose">
<CustomMDX source={post.content} />
</article> */}
</section>
)
}