Skip to content

Commit c3d8a89

Browse files
committed
fix: sort by semver only in blog
1 parent 9668670 commit c3d8a89

File tree

2 files changed

+27
-21
lines changed

2 files changed

+27
-21
lines changed

apps/site/components/withBlogCrossLinks.tsx

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
import type { FC } from 'react';
2+
import semver from 'semver';
23

34
import { getClientContext } from '#site/client-context';
45
import CrossLink from '#site/components/Common/CrossLink';
56
import getBlogData from '#site/next-data/blogData';
67
import type { BlogCategory } from '#site/types';
78

9+
const extractVersionFromTitle = (title: string): string | null => {
10+
const match = title.match(/v(\d+\.\d+\.\d+)/);
11+
return match ? match[1] : null;
12+
};
13+
814
const WithBlogCrossLinks: FC = () => {
915
const { pathname } = getClientContext();
1016

@@ -18,13 +24,30 @@ const WithBlogCrossLinks: FC = () => {
1824

1925
const { posts } = getBlogData(category);
2026

21-
const currentItem = posts.findIndex(
27+
// Sort posts by semver for release category
28+
const sortedPosts =
29+
category === 'release'
30+
? [...posts].sort((a, b) => {
31+
const versionA = extractVersionFromTitle(a.title);
32+
const versionB = extractVersionFromTitle(b.title);
33+
34+
if (versionA && versionB) {
35+
// Sort by semver in descending order (newest first)
36+
return semver.rcompare(versionA, versionB);
37+
}
38+
39+
// Fallback to date sorting if version extraction fails
40+
return b.date.getTime() - a.date.getTime();
41+
})
42+
: posts;
43+
44+
const currentItem = sortedPosts.findIndex(
2245
({ slug }) => slug === `/blog/${category}/${postname}`
2346
);
2447

2548
const [previousCrossLink, nextCrossLink] = [
26-
posts[currentItem - 1],
27-
posts[currentItem + 1],
49+
sortedPosts[currentItem - 1],
50+
sortedPosts[currentItem + 1],
2851
];
2952

3053
return (

apps/site/next-data/providers/blogData.ts

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import { cache } from 'react';
2-
import semver from 'semver';
32

43
import { BLOG_POSTS_PER_PAGE } from '#site/next.constants.mjs';
54
import { blogData } from '#site/next.json.mjs';
@@ -9,27 +8,11 @@ const blogPosts = cache(() =>
98
blogData.posts.map(post => ({ ...post, date: new Date(post.date) }))
109
);
1110

12-
const extractVersionFromTitle = (title: string): string | null => {
13-
const versionMatch = title.match(/v?(\d+\.\d+\.\d+(-[\w.-]+)?(\+[\w.-]+)?)/);
14-
return versionMatch && semver.valid(versionMatch[0]) ? versionMatch[0] : null;
15-
};
16-
1711
export const provideBlogPosts = cache(
1812
(category: BlogCategory): BlogPostsRSC => {
1913
const categoryPosts = blogPosts()
2014
.filter(post => post.categories.includes(category))
21-
.sort((a, b) => {
22-
if (category === 'release') {
23-
const versionA = extractVersionFromTitle(a.title);
24-
const versionB = extractVersionFromTitle(b.title);
25-
26-
if (versionA && versionB) {
27-
return semver.rcompare(versionA, versionB);
28-
}
29-
}
30-
31-
return b.date.getTime() - a.date.getTime();
32-
});
15+
.sort((a, b) => b.date.getTime() - a.date.getTime());
3316

3417
// Total amount of possible pages given the amount of blog posts
3518
const total = categoryPosts.length / BLOG_POSTS_PER_PAGE;

0 commit comments

Comments
 (0)