From 59ca9011c4bc19c56520edc8bf5f76ba4038af46 Mon Sep 17 00:00:00 2001 From: Alex Yang Date: Tue, 29 Jul 2025 22:57:37 -0700 Subject: [PATCH 1/2] fix: order by semver for release blog --- apps/site/components/withBlogCrossLinks.tsx | 36 ++++++++++++++++++--- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/apps/site/components/withBlogCrossLinks.tsx b/apps/site/components/withBlogCrossLinks.tsx index c128c919dfb03..6410f814859a1 100644 --- a/apps/site/components/withBlogCrossLinks.tsx +++ b/apps/site/components/withBlogCrossLinks.tsx @@ -1,10 +1,16 @@ import type { FC } from 'react'; +import semver from 'semver'; import { getClientContext } from '#site/client-context'; import CrossLink from '#site/components/Common/CrossLink'; import getBlogData from '#site/next-data/blogData'; import type { BlogCategory } from '#site/types'; +const extractVersionFromTitle = (title: string): string | null => { + const match = title.match(/v(\d+\.\d+\.\d+)/); + return match ? match[1] : null; +}; + const WithBlogCrossLinks: FC = () => { const { pathname } = getClientContext(); @@ -18,14 +24,34 @@ const WithBlogCrossLinks: FC = () => { const { posts } = getBlogData(category); - const currentItem = posts.findIndex( + // Sort posts by semver for release category + const sortedPosts = + category === 'release' + ? [...posts].sort((a, b) => { + const versionA = extractVersionFromTitle(a.title); + const versionB = extractVersionFromTitle(b.title); + + if (versionA && versionB) { + // Sort by semver in descending order (newest first) + return semver.rcompare(versionA, versionB); + } + + // Fallback to date sorting if version extraction fails + return b.date.getTime() - a.date.getTime(); + }) + : posts; + + const currentItem = sortedPosts.findIndex( ({ slug }) => slug === `/blog/${category}/${postname}` ); - const [previousCrossLink, nextCrossLink] = [ - posts[currentItem - 1], - posts[currentItem + 1], - ]; + // For release posts sorted by semver (descending): + // - Previous should point to an older version (higher index) + // - Next should point to a newer version (lower index) + const [previousCrossLink, nextCrossLink] = + category === 'release' + ? [sortedPosts[currentItem + 1], sortedPosts[currentItem - 1]] + : [sortedPosts[currentItem - 1], sortedPosts[currentItem + 1]]; return (
From 72fd3d589e5a42f65348329c64d11b44ff04ee47 Mon Sep 17 00:00:00 2001 From: Alex Yang Date: Wed, 30 Jul 2025 11:42:28 -0700 Subject: [PATCH 2/2] Update apps/site/components/withBlogCrossLinks.tsx Co-authored-by: Aviv Keller Signed-off-by: Alex Yang --- apps/site/components/withBlogCrossLinks.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/site/components/withBlogCrossLinks.tsx b/apps/site/components/withBlogCrossLinks.tsx index 6410f814859a1..9805737efee5b 100644 --- a/apps/site/components/withBlogCrossLinks.tsx +++ b/apps/site/components/withBlogCrossLinks.tsx @@ -27,7 +27,7 @@ const WithBlogCrossLinks: FC = () => { // Sort posts by semver for release category const sortedPosts = category === 'release' - ? [...posts].sort((a, b) => { + ? posts.toSorted((a, b) => { const versionA = extractVersionFromTitle(a.title); const versionB = extractVersionFromTitle(b.title);