Skip to content

chore: blog page rebuild in NextJS and all its functionalities#5

Merged
Jexsie merged 1 commit intonext-js-migrationfrom
daniel-dev-rebuild
Mar 13, 2026
Merged

chore: blog page rebuild in NextJS and all its functionalities#5
Jexsie merged 1 commit intonext-js-migrationfrom
daniel-dev-rebuild

Conversation

@danielmarv
Copy link
Member

Description

This pull request introduces several major improvements to the blog and community pages of the Next.js application, focusing on dynamic content rendering, new feature pages, and enhanced user experience. The most significant changes include the addition of new pages for "Hacktoberfest" and "Hiero Heroes," dynamic blog post rendering, reusable paginated blog post lists, and contributor/issue listing components. There are also minor UI improvements and cleanup.

New feature pages:

  • Added a new Hacktoberfest page (/hacktoberfest) that dynamically loads content from markdown and displays a filterable list of good-first issues from an external API. [1] [2]
  • Added a new Hiero Heroes page (/heroes) that loads content from markdown and displays a grid of contributors fetched from an external API. [1] [2]

Blog improvements:

  • Refactored the main blog index page (/blog) to use dynamic metadata, load post data and metadata from the backend, and display posts using a new, paginated BlogPostList component. [1] [2]
  • Rewrote the blog post detail page (/blog/[slug]) to fetch post data dynamically, display authors, show recent posts, and improve the overall layout and metadata generation. (nextjs/app/blog/[slug]/page.tsxR1-R126)

Reusable components:

  • Introduced BlogPostList for paginated blog post listings, with windowed pagination and improved accessibility.
  • Added ContributorsGrid to display a grid of GitHub contributors, handling loading and error states.
  • Added IssueList to display and filter open issues by language, with improved UX for loading and error handling.

UI and style improvements:

  • Improved pagination button styling for better interactivity by adding cursor-pointer to pagination links.
  • Cleaned up unused comments in globals.css for maintainability.

Changes Made

  • Added...
  • Modified...
  • Fixed...

Related Issues

Screenshots (if applicable)

Checklist

  • Tests added/updated
  • Documentation updated
  • Linting passes
  • Branch up-to-date with main

Deployment Notes

Signed-off-by: Daniel Ntege <danientege785@gmail.com>
@danielmarv danielmarv self-assigned this Mar 12, 2026
Copilot AI review requested due to automatic review settings March 12, 2026 23:56
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR rebuilds the Next.js blog experience around markdown/TOML frontmatter content, adds new community-focused pages (Hacktoberfest, Heroes) that fetch data from external APIs, and brings in a large batch of new blog posts/content assets.

Changes:

  • Added a markdown-backed posts loader (lib/posts.ts) and new blog UI (index pagination + per-post page with sharing/recent posts).
  • Added /hacktoberfest and /heroes pages with client components that fetch issues/contributors from an external endpoint.
  • Added many new blog posts and supporting author images.

Reviewed changes

Copilot reviewed 49 out of 62 changed files in this pull request and generated 16 comments.

Show a summary per file
File Description
nextjs/public/images/python/members/exploreriii.png Adds author image asset for blog posts.
nextjs/public/images/python/members/chithraka-kal.jpeg Adds author image asset for blog posts.
nextjs/public/images/python/members/Mounil2005.png Adds author image asset for blog posts.
nextjs/lib/posts.ts Introduces filesystem-backed post discovery, TOML parsing, and markdown-to-HTML rendering helpers.
nextjs/content/posts/_index.md Adds blog index metadata (title/subtitle/list title).
nextjs/content/posts/tsc-voting-september.md Adds a new blog post.
nextjs/content/posts/tsc-voting-results.md Adds a new blog post (preview_only).
nextjs/content/posts/tsc-voting-process.md Adds a new blog post.
nextjs/content/posts/tsc-sep-voting-results.md Adds a new blog post (preview_only).
nextjs/content/posts/september-open-issues-2025.md Adds a new blog post.
nextjs/content/posts/python-v0.1.7-release.md Adds a new blog post.
nextjs/content/posts/python-v0.1.6-release.md Adds a new blog post.
nextjs/content/posts/python-v0.1.4-release.md Adds a new blog post.
nextjs/content/posts/python-v0.1.3-release.md Adds a new blog post.
nextjs/content/posts/python-open-issues-aug.md Adds a new blog post.
nextjs/content/posts/python-office-hours.md Adds a new blog post.
nextjs/content/posts/python-office-hours-launch.md Adds a new blog post.
nextjs/content/posts/post-template-for-reference-only.md Adds a draft/template post for reference.
nextjs/content/posts/namespace-transition-announcement.md Adds a new blog post (preview_only).
nextjs/content/posts/introducing-hiero-sdk-contribution-hub.md Adds a new blog post (preview_only).
nextjs/content/posts/introducing-hiero-cli.md Adds a new blog post.
nextjs/content/posts/hip-1261.md Adds a new blog post.
nextjs/content/posts/hiero_links_of_march_second.md Adds a new blog post (“Links” roundup).
nextjs/content/posts/hiero_links_of_jan.md Adds a new blog post (“Links” roundup).
nextjs/content/posts/hiero_links_of_feb_twentythird.md Adds a new blog post (“Links” roundup).
nextjs/content/posts/hiero_links_of_feb_sixteenth.md Adds a new blog post (“Links” roundup).
nextjs/content/posts/hiero_links_of_feb_second.md Adds a new blog post (“Links” roundup).
nextjs/content/posts/hiero_links_of_feb_ninth.md Adds a new blog post (“Links” roundup).
nextjs/content/posts/hiero_issue_progression_initiative.md Adds a new blog post.
nextjs/content/posts/hiero_being_fair.md Adds a new blog post.
nextjs/content/posts/hiero-hacktoberfest-2025.md Adds a new blog post.
nextjs/content/posts/hiero-graduation-with-further-reading.md Adds a new blog post.
nextjs/content/posts/hiero-enterprise-java.md Adds a new blog post.
nextjs/content/posts/hiero-did-sdk-js-with-video-title.md Adds a new blog post.
nextjs/content/posts/hiero-consensus-specifications.md Adds a new blog post.
nextjs/content/posts/hedera-devday-2026.md Adds a new blog post.
nextjs/content/posts/get-involved/index.md Adds a new blog post in a subdirectory.
nextjs/content/posts/announcing-support-of-swift-6-in-the-hiero-swift-sdk.md Adds a new blog post.
nextjs/content/posts/a-month-of-merges-hacktoberfest-python-sdk.md Adds a new blog post.
nextjs/content/posts/08092025-Python-sdk-community-growing.md Adds a new blog post.
nextjs/content/heroes/index.md Adds markdown content backing the Heroes page.
nextjs/content/hacktoberfest/index.md Adds markdown content backing the Hacktoberfest page.
nextjs/content/_index.md Updates/introduces main site content configuration.
nextjs/components/ShareButtons.tsx Adds client-side social share buttons component.
nextjs/components/IssueList.tsx Adds client-side issue fetch/filter/list component.
nextjs/components/ContributorsGrid.tsx Adds client-side contributors fetch/grid component.
nextjs/components/BlogPostList.tsx Adds paginated blog list UI component.
nextjs/app/heroes/page.tsx Adds /heroes page rendering markdown + contributors grid.
nextjs/app/hacktoberfest/page.tsx Adds /hacktoberfest page rendering markdown + issue list.
nextjs/app/globals.css Adds cursor-pointer to pagination links and removes a header comment.
nextjs/app/blog/page.tsx Refactors blog index page to use new loader + paginated list component.
nextjs/app/blog/[slug]/page.tsx Adds dynamic blog post detail page with metadata generation, authors, recent posts, and share buttons.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

You can also share your feedback on Copilot code review. Take the survey.

Comment on lines +116 to +118
const cleaned = content.replace(/\{\{<[^>]*>\}\}/g, "").replace(/\{\{%[^%]*%\}\}/g, "").trim();
const processed = await remark().use(remarkHtml, { sanitize: false }).process(cleaned);
return { ...buildMeta(data, file), contentHtml: processed.toString() };
Comment on lines +144 to +151
const { data, content } = matter(raw);
const cleaned = content.replace(/\{\{<[^>]*>\}\}/g, "").replace(/\{\{%[^%]*%\}\}/g, "").trim();
const processed = await remark().use(remarkHtml, { sanitize: false }).process(cleaned);
return {
title: String(data.title ?? ""),
description: String(data.description ?? ""),
contentHtml: processed.toString(),
};
Comment on lines +96 to +102
try {
const raw = fs.readFileSync(path.join(POSTS_DIR, file), "utf8");
const { data } = matter(raw, MATTER_OPTIONS) as unknown as { data: Record<string, unknown> };
if (data.draft === true) continue;
posts.push(buildMeta(data, file));
} catch { /* skip */ }
}
Comment on lines +3 to +6
export default function ShareButtons() {
const url = typeof window !== "undefined" ? window.location.href : "";
const title = typeof document !== "undefined" ? document.title : "";

Comment on lines +2 to +4
import { getAllPosts, getPostBySlug, FALLBACK_IMAGE } from "@/lib/posts";
import { format } from "date-fns";
import Link from "next/link";
Comment on lines +15 to +22
useEffect(() => {
fetch(endpoint)
.then((res) => res.json())
.then((data: Contributor[]) => {
setContributors(data);
setLoading(false);
})
.catch(() => {
Comment on lines +58 to +62
function parseDate(raw: unknown): string {
if (!raw) return new Date(0).toISOString();
if (raw instanceof Date) return raw.toISOString();
return new Date(String(raw)).toISOString();
}
Comment on lines +97 to +101
const raw = fs.readFileSync(path.join(POSTS_DIR, file), "utf8");
const { data } = matter(raw, MATTER_OPTIONS) as unknown as { data: Record<string, unknown> };
if (data.draft === true) continue;
posts.push(buildMeta(data, file));
} catch { /* skip */ }
Comment on lines +13 to +21
export async function generateMetadata({ params }: { params: Promise<{ slug: string }> }): Promise<Metadata> {
const { slug } = await params;
const post = await getPostBySlug(slug);
if (!post) return { title: "Post Not Found" };
return { title: post.title, description: post.abstract };
}

export default async function BlogPostPage({ params }: { params: Promise<{ slug: string }> }) {
const { slug } = await params;
Comment on lines +21 to +22
**om12prakash** added [unit tests and implemented a `repr method](https://github.com/hiero-ledger/hiero-sdk-python/pull/1881) for the NftId class to improve test coverage and debugging readability in the Pyhton SDK.

@Jexsie Jexsie merged commit 44967ca into next-js-migration Mar 13, 2026
5 of 6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants