@@ -12,16 +12,36 @@ export const metadata = {
12
12
13
13
let blogTags : string [ ] = [ 'All' ] ;
14
14
15
- export default function BlogPage ( { searchParams } : { searchParams : { tag ?: string } } ) {
15
+ const POSTS_PER_PAGE = 4 ;
16
+
17
+ export default function BlogPage ( { searchParams } : { searchParams : { tag ?: string ; page ?: string } } ) {
16
18
let allBlogs = getBlogPosts ( ) ;
17
19
blogTags = [ 'All' , ...Array . from ( new Set ( allBlogs . map ( post => post . metadata . category ?? '' ) ) ) ] ;
18
20
const selectedTag = searchParams . tag || 'All' ;
21
+ const currentPage = parseInt ( searchParams . page || '1' , 10 ) ;
19
22
20
23
// Filter blogs based on the selected tag
21
24
const filteredBlogs = selectedTag === 'All'
22
25
? allBlogs
23
26
: allBlogs . filter ( post => post . metadata . category === selectedTag ) ;
24
27
28
+ // Sort blogs by date
29
+ const sortedBlogs = filteredBlogs . sort ( ( a , b ) => {
30
+ if ( new Date ( a . metadata . publishedAt ) > new Date ( b . metadata . publishedAt ) ) {
31
+ return - 1 ;
32
+ }
33
+ return 1 ;
34
+ } ) ;
35
+
36
+ // Calculate total pages
37
+ const totalPages = Math . ceil ( sortedBlogs . length / POSTS_PER_PAGE ) ;
38
+
39
+ // Get blogs for current page
40
+ const paginatedBlogs = sortedBlogs . slice (
41
+ ( currentPage - 1 ) * POSTS_PER_PAGE ,
42
+ currentPage * POSTS_PER_PAGE
43
+ ) ;
44
+
25
45
return (
26
46
< article >
27
47
< PageHeader title = "Hugo's Blog" />
@@ -30,44 +50,51 @@ export default function BlogPage({ searchParams }: { searchParams: { tag?: strin
30
50
< FilterSelectBox selectedTag = { selectedTag } blogTags = { blogTags } />
31
51
32
52
< ul className = "blog-posts-list" >
33
- { filteredBlogs
34
- . sort ( ( a , b ) => {
35
- if ( new Date ( a . metadata . publishedAt ) > new Date ( b . metadata . publishedAt ) ) {
36
- return - 1 ;
37
- }
38
- return 1 ;
39
- } )
40
- . map ( ( post , index ) => (
41
- < li
42
- key = { index }
43
- className = "blog-post-item active"
44
- data-category = { post . metadata . category }
45
- >
46
- < Link href = { `/blog/${ post . slug } ` } rel = "noopener noreferrer" >
47
- < figure className = "blog-banner-box" >
48
- < Image
49
- src = { post . metadata . banner }
50
- alt = { post . metadata . alt || 'Blog post image' }
51
- loading = "lazy"
52
- width = { 1600 }
53
- height = { 900 }
54
- />
55
- </ figure >
56
- < div className = "blog-content" >
57
- < div className = "blog-meta" >
58
- < p className = "blog-category" > { post . metadata . category } </ p >
59
- < span className = "dot" > </ span >
60
- < time dateTime = { post . metadata . publishedAt } >
61
- { new Date ( post . metadata . publishedAt ) . toLocaleDateString ( ) }
62
- </ time >
63
- </ div >
64
- < h3 className = "h3 blog-item-title" > { post . metadata . title } </ h3 >
65
- < p className = "blog-text" > { post . metadata . summary } </ p >
53
+ { paginatedBlogs . map ( ( post , index ) => (
54
+ < li
55
+ key = { index }
56
+ className = "blog-post-item active"
57
+ data-category = { post . metadata . category }
58
+ >
59
+ < Link href = { `/blog/${ post . slug } ` } rel = "noopener noreferrer" >
60
+ < figure className = "blog-banner-box" >
61
+ < Image
62
+ src = { post . metadata . banner }
63
+ alt = { post . metadata . alt || 'Blog post image' }
64
+ loading = "lazy"
65
+ width = { 1600 }
66
+ height = { 900 }
67
+ />
68
+ </ figure >
69
+ < div className = "blog-content" >
70
+ < div className = "blog-meta" >
71
+ < p className = "blog-category" > { post . metadata . category } </ p >
72
+ < span className = "dot" > </ span >
73
+ < time dateTime = { post . metadata . publishedAt } >
74
+ { new Date ( post . metadata . publishedAt ) . toLocaleDateString ( ) }
75
+ </ time >
66
76
</ div >
67
- </ Link >
68
- </ li >
69
- ) ) }
77
+ < h3 className = "h3 blog-item-title" > { post . metadata . title } </ h3 >
78
+ < p className = "blog-text" > { post . metadata . summary } </ p >
79
+ </ div >
80
+ </ Link >
81
+ </ li >
82
+ ) ) }
70
83
</ ul >
84
+ < div className = "pagination" >
85
+ { Array . from ( { length : totalPages } , ( _ , i ) => i + 1 ) . map ( ( pageNum ) => (
86
+ < Link
87
+ key = { pageNum }
88
+ href = { {
89
+ pathname : '/blog' ,
90
+ query : { ...searchParams , page : pageNum . toString ( ) } ,
91
+ } }
92
+ className = { `pagination-btn ${ pageNum === currentPage ? 'active' : '' } ` }
93
+ >
94
+ { pageNum }
95
+ </ Link >
96
+ ) ) }
97
+ </ div >
71
98
</ section >
72
99
</ article >
73
100
) ;
0 commit comments