Skip to content

Commit 68e5125

Browse files
authored
Merge pull request #245 from 1chooo/feature/#241
feat(blog): implement pagination for blog posts (#241)
2 parents 8e859c4 + a9550fb commit 68e5125

File tree

1 file changed

+64
-37
lines changed

1 file changed

+64
-37
lines changed

apps/web/src/app/blog/page.tsx

+64-37
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,36 @@ export const metadata = {
1212

1313
let blogTags: string[] = ['All'];
1414

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 } }) {
1618
let allBlogs = getBlogPosts();
1719
blogTags = ['All', ...Array.from(new Set(allBlogs.map(post => post.metadata.category ?? '')))];
1820
const selectedTag = searchParams.tag || 'All';
21+
const currentPage = parseInt(searchParams.page || '1', 10);
1922

2023
// Filter blogs based on the selected tag
2124
const filteredBlogs = selectedTag === 'All'
2225
? allBlogs
2326
: allBlogs.filter(post => post.metadata.category === selectedTag);
2427

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+
2545
return (
2646
<article>
2747
<PageHeader title="Hugo's Blog" />
@@ -30,44 +50,51 @@ export default function BlogPage({ searchParams }: { searchParams: { tag?: strin
3050
<FilterSelectBox selectedTag={selectedTag} blogTags={blogTags} />
3151

3252
<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>
6676
</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+
))}
7083
</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>
7198
</section>
7299
</article>
73100
);

0 commit comments

Comments
 (0)