1
- // "use client";
2
- import { allBlogs } from "contentlayer/generated" ;
3
- import Image from "next/image" ;
4
- import Tag from "@/src/components/Elements/Tag" ;
5
1
import BlogDetails from "@/src/components/Blog/BlogDetails" ;
6
- import { slug } from "github-slugger" ;
7
- import siteMetadata from "@/src/utils/siteMetaData" ;
8
2
import RenderMdx from "@/src/components/Blog/RenderMdx" ;
3
+ import Tag from "@/src/components/Elements/Tag" ;
4
+ import siteMetadata from "@/src/utils/siteMetaData" ;
5
+ import { allBlogs } from "contentlayer/generated" ;
6
+ import { slug } from "github-slugger" ;
7
+ import Image from "next/image" ;
9
8
10
- export const generateStaticParams = async ( ) =>
11
- allBlogs . map ( ( blog ) => ( { slug : blog . _raw . flattenedPath } ) ) ;
9
+ export async function generateStaticParams ( ) {
10
+ return allBlogs . map ( ( blog ) => ( { slug : blog . _raw . flattenedPath } ) ) ;
11
+ }
12
12
13
13
export async function generateMetadata ( { params } ) {
14
14
const blog = allBlogs . find ( ( blog ) => blog . _raw . flattenedPath === params . slug ) ;
@@ -17,8 +17,8 @@ export async function generateMetadata({ params }) {
17
17
}
18
18
19
19
const publishedAt = new Date ( blog . publishedAt ) . toISOString ( ) ;
20
- const modifiedAt = new Date ( blog . updatedAt || blog . date ) . toISOString ( ) ;
21
- const authors = blog ?. author ? [ blog . author ] : siteMetadata . author ;
20
+ const modifiedAt = new Date ( blog . updatedAt || blog . publishedAt ) . toISOString ( ) ;
21
+
22
22
let imageList = [ siteMetadata . socialBanner ] ;
23
23
if ( blog . image ) {
24
24
imageList =
@@ -27,38 +27,37 @@ export async function generateMetadata({ params }) {
27
27
: blog . image ;
28
28
}
29
29
const ogImages = imageList . map ( ( img ) => {
30
- return {
31
- url : img . includes ( "http" ) ? img : siteMetadata . siteUrl + img ,
32
- } ;
30
+ return { url : img . includes ( "http" ) ? img : siteMetadata . siteUrl + img } ;
33
31
} ) ;
34
32
33
+ const authors = blog ?. author ? [ blog . author ] : siteMetadata . author ;
34
+
35
35
return {
36
36
title : blog . title ,
37
37
description : blog . description ,
38
38
openGraph : {
39
39
title : blog . title ,
40
40
description : blog . description ,
41
+ url : siteMetadata . siteUrl + blog . url ,
41
42
siteName : siteMetadata . title ,
42
43
locale : "en_US" ,
43
44
type : "article" ,
44
45
publishedTime : publishedAt ,
45
46
modifiedTime : modifiedAt ,
46
- url : siteMetadata . siteUrl + "/blogs/" + params . slug ,
47
47
images : ogImages ,
48
48
authors : authors . length > 0 ? authors : [ siteMetadata . author ] ,
49
49
} ,
50
50
twitter : {
51
51
card : "summary_large_image" ,
52
52
title : blog . title ,
53
53
description : blog . description ,
54
- images : imageList ,
54
+ images : ogImages ,
55
55
} ,
56
56
} ;
57
57
}
58
58
59
- const BlogLayout = ( { params } ) => {
59
+ export default function BlogPage ( { params } ) {
60
60
const blog = allBlogs . find ( ( blog ) => blog . _raw . flattenedPath === params . slug ) ;
61
- if ( ! blog ) throw new Error ( `Blog not found for slug: ${ params . slug } ` ) ;
62
61
63
62
let imageList = [ siteMetadata . socialBanner ] ;
64
63
if ( blog . image ) {
@@ -67,7 +66,6 @@ const BlogLayout = ({ params }) => {
67
66
? [ siteMetadata . siteUrl + blog . image . filePath . replace ( "../public" , "" ) ]
68
67
: blog . image ;
69
68
}
70
-
71
69
const jsonLd = {
72
70
"@context" : "https://schema.org" ,
73
71
"@type" : "NewsArticle" ,
@@ -85,84 +83,83 @@ const BlogLayout = ({ params }) => {
85
83
description : blog . description ,
86
84
} ;
87
85
88
- // console.log(blog);
89
-
90
86
return (
91
87
< >
92
- < script
88
+
89
+ < script
93
90
type = "application/ld+json"
94
91
dangerouslySetInnerHTML = { { __html : JSON . stringify ( jsonLd ) } }
95
92
/>
96
- < article className = " py-0" >
97
- < div className = "mb-8 text-center relative w-full h-[70vh] bg-dark" >
98
- < div className = "w-full z-10 flex flex-col items-center justify-center absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2" >
99
- < Tag
100
- name = { blog . tags [ 0 ] }
101
- link = { `/categories/${ slug ( blog . tags [ 0 ] ) } ` }
102
- className = "px-6 text-sm py-2"
103
- />
104
-
105
- < h1 className = "inline-block group mt-6 font-semibold capitalize text-light text-2xl md:text-3xl lg:text-5xl !leading-normal relative w-5/6" >
106
- { blog . title }
107
- </ h1 >
108
- </ div >
109
- < div className = " absolute top-0 left-0 bottom-0 right-0 h-full bg-dark/60 dark:bg-dark/40" />
110
- < Image
111
- src = { blog . image . filePath . replace ( "../public" , "" ) }
112
- placeholder = "blur"
113
- blurDataURL = { blog . image . blurhashDataUrl }
114
- width = { blog . image . width }
115
- height = { blog . image . height }
116
- alt = { blog . title }
117
- className = "w-full h-full object-cover object-center"
118
- priority
119
- sizes = "100vw"
93
+
94
+ < article >
95
+ < div className = "mb-8 text-center relative w-full h-[70vh] bg-dark" >
96
+ < div className = "w-full z-10 flex flex-col items-center justify-center absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2" >
97
+ < Tag
98
+ name = { blog . tags [ 0 ] }
99
+ link = { `/categories/${ slug ( blog . tags [ 0 ] ) } ` }
100
+ className = "px-6 text-sm py-2"
120
101
/>
102
+ < h1
103
+ className = "inline-block mt-6 font-semibold capitalize text-light text-2xl md:text-3xl lg:text-5xl !leading-normal relative w-5/6"
104
+ >
105
+ { blog . title }
106
+ </ h1 >
121
107
</ div >
108
+ < div className = "absolute top-0 left-0 right-0 bottom-0 h-full bg-dark/60 dark:bg-dark/40" />
109
+ < Image
110
+ src = { blog . image . filePath . replace ( "../public" , "" ) }
111
+ placeholder = "blur"
112
+ blurDataURL = { blog . image . blurhashDataUrl }
113
+ alt = { blog . title }
114
+ width = { blog . image . width }
115
+ height = { blog . image . height }
116
+ className = "aspect-square w-full h-full object-cover object-center"
117
+ priority
118
+ sizes = "100vw"
119
+ />
120
+ </ div >
121
+ < BlogDetails blog = { blog } slug = { params . slug } />
122
122
123
- < BlogDetails blog = { blog } slug = { params . slug } />
123
+ < div className = "grid grid-cols-12 gap-y-8 lg:gap-8 sxl:gap-16 mt-8 px-5 md:px-10" >
124
+ < div className = "col-span-12 lg:col-span-4" >
125
+ < details
126
+ className = "border-[1px] border-solid border-dark dark:border-light text-dark dark:text-light rounded-lg p-4 sticky top-6 max-h-[80vh] overflow-hidden overflow-y-auto"
127
+ open
128
+ >
129
+ < summary className = "text-lg font-semibold capitalize cursor-pointer" >
130
+ Table Of Content
131
+ </ summary >
132
+ < ul className = "mt-4 font-in text-base" >
133
+ { blog . toc . map ( ( heading ) => {
134
+ return (
135
+ < li key = { `#${ heading . slug } ` } className = "py-1" >
136
+ < a
137
+ href = { `#${ heading . slug } ` }
138
+ data-level = { heading . level }
139
+ className = "data-[level=two]:pl-0 data-[level=two]:pt-2
140
+ data-[level=two]:border-t border-solid border-dark/40
141
+ data-[level=three]:pl-4
142
+ sm:data-[level=three]:pl-6
143
+ flex items-center justify-start
144
+ "
145
+ >
146
+ { heading . level === "three" ? (
147
+ < span className = "flex w-1 h-1 rounded-full bg-dark mr-2" >
148
+
149
+ </ span >
150
+ ) : null }
124
151
125
- < div className = "grid grid-cols-12 gap-y-8 lg:gap-8 sxl:gap-16 w-full mt-8 px-5 md:px-10" >
126
- < div className = " col-span-12 lg:col-span-4 relative" >
127
- < details
128
- className = "border-[1px] border-solid border-dark dark:border-light text-dark dark:text-light rounded-lg p-4 sticky top-6 max-h-[80vh] overflow-hidden overflow-y-auto"
129
- open
130
- >
131
- < summary className = "text-base sm:text-lg font-semibold capitalize cursor-pointer" >
132
- Table of contents
133
- </ summary >
134
- < ul className = "mt-4 font-in text-sm sm:text-base" >
135
- { blog . toc . map ( ( heading ) => {
136
- return (
137
- < li key = { `#${ heading . slug } ` } className = "py-1" >
138
- < a
139
- data-level = { heading . level }
140
- href = { `#${ heading . slug } ` }
141
- className = "data-[level=two]:pl-0 w-full data-[level=two]:pt-2 data-[level=two]:border-t border-solid border-dark/40 dark:border-light/40 data-[level=three]:pl-4 sm:data-[level=three]:pl-6 flex items-center justify-start"
142
- >
143
- { heading . level === "three" ? (
144
- < span className = "flex w-1 h-1 rounded-full bg-dark mr-2" >
145
-
146
- </ span >
147
- ) : null }
148
- < span className = "hover:underline" > { heading . text } </ span >
149
- </ a >
150
- </ li >
151
- ) ;
152
- } ) }
153
- </ ul >
154
- </ details >
155
- </ div >
156
- < RenderMdx blog = { blog } />
152
+ < span className = "hover:underline" > { heading . text } </ span >
153
+ </ a >
154
+ </ li >
155
+ ) ;
156
+ } ) }
157
+ </ ul >
158
+ </ details >
157
159
</ div >
158
-
159
- { /* <div
160
- className="[&>*]:mb-3 [&>*:last-child]:mb-0 prose"
161
- dangerouslySetInnerHTML={{ __html: blog.body.html }}
162
- /> */ }
163
- </ article > { " " }
160
+ < RenderMdx blog = { blog } />
161
+ </ div >
162
+ </ article >
164
163
</ >
165
164
) ;
166
- } ;
167
-
168
- export default BlogLayout ;
165
+ }
0 commit comments