diff --git a/app/posts/[slug]/page.tsx b/app/posts/[slug]/page.tsx index 77adf2a..321b222 100644 --- a/app/posts/[slug]/page.tsx +++ b/app/posts/[slug]/page.tsx @@ -4,11 +4,12 @@ import { TableOfContents } from '@/components/blog/TableOfContents' import { ScrollToTop } from '@/components/ui/ScrollToTop' import { ReadingProgress } from '@/components/ui/ReadingProgress' +export const dynamicParams = false +export const dynamic = 'force-static' +export const revalidate = 0 + export async function generateStaticParams() { const posts = await getPosts() - if (posts.length === 0) { - return [{ slug: '__placeholder__' }] - } return posts.map((post) => ({ slug: post.slug })) } diff --git a/app/tags/[tag]/page.tsx b/app/tags/[tag]/page.tsx new file mode 100644 index 0000000..8ed87e1 --- /dev/null +++ b/app/tags/[tag]/page.tsx @@ -0,0 +1,56 @@ +import type { Metadata } from 'next' +import { notFound } from 'next/navigation' +import { PostCard } from '@/components/blog/PostCard' +import { getAllTags, getPostsByTag } from '@/lib/posts' + +type TagPageProps = { + params: Promise<{ tag: string }> +} + +export const dynamicParams = false +export const dynamic = 'force-static' +export const revalidate = 0 + +export async function generateStaticParams() { + const tags = await getAllTags() + return tags.map((tag) => ({ tag: tag.slug })) +} + +export async function generateMetadata({ params }: TagPageProps): Promise { + const slug = (await params).tag + const tags = await getAllTags() + const tag = tags.find((item) => item.slug === slug) + + if (!tag) return { title: 'Not Found' } + + return { title: `${tag.label} posts` } +} + +export default async function TagPage({ params }: TagPageProps) { + const slug = (await params).tag + const tags = await getAllTags() + const tag = tags.find((item) => item.slug === slug) + + if (!tag) notFound() + + const posts = await getPostsByTag(slug) + + return ( +
+
+

Tag

+

{tag.label}

+

+ {tag.count} {tag.count === 1 ? 'post' : 'posts'} +

+
+ +
+ ) +}