-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
[slug].tsx
72 lines (67 loc) · 1.83 KB
/
[slug].tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import {
GetStaticPaths,
GetStaticProps,
InferGetStaticPropsType,
NextPage
} from 'next'
import { ParsedUrlQuery } from 'querystring'
import { deserialize, Serializable } from 'lib/utils/serialization'
import { getAllPostSlugs } from 'lib/content/posts/server'
import { PostDetails, PostDetailsProps } from 'components/pages/posts/[slug]'
import {
RenderablePost,
getSerializableRenderablePost
} from 'lib/pages/posts/[slug]'
import { NextSeo } from 'next-seo'
import { SITE_URL } from 'lib/constants'
interface StaticPathParams extends ParsedUrlQuery {
slug: string
}
export const getStaticPaths: GetStaticPaths<StaticPathParams> = async () => {
const postSlugs = await getAllPostSlugs()
return {
paths: postSlugs.map(x => ({ params: { slug: x } })),
fallback: false
}
}
export const getStaticProps: GetStaticProps<
Serializable<PostDetailsProps>,
StaticPathParams
> = async ({ params }) => {
const { slug } = params as StaticPathParams
return {
props: {
post: await getSerializableRenderablePost(slug)
}
}
}
const PostPage: NextPage<InferGetStaticPropsType<typeof getStaticProps>> = ({
post
}) => {
const deserializedPost = deserialize<RenderablePost>(post)
return (
<>
<NextSeo
title={post.meta.title}
description={post.meta.description}
openGraph={{
type: 'article',
article: {
publishedTime: post.meta.publishedOnIso,
authors: [`${SITE_URL}/about`]
},
images: [
{
url: `${SITE_URL}${post.meta.bannerSrc.src}`,
width: post.meta.bannerSrc.width,
height: post.meta.bannerSrc.height,
alt: post.meta.bannerSrc.alt
}
]
}}
/>
<PostDetails post={deserializedPost} />
</>
)
}
export default PostPage