1
1
import type { FC } from 'react' ;
2
+ import semver from 'semver' ;
2
3
3
4
import { getClientContext } from '#site/client-context' ;
4
5
import CrossLink from '#site/components/Common/CrossLink' ;
5
6
import getBlogData from '#site/next-data/blogData' ;
6
7
import type { BlogCategory } from '#site/types' ;
7
8
9
+ const extractVersionFromTitle = ( title : string ) : string | null => {
10
+ const match = title . match ( / v ( \d + \. \d + \. \d + ) / ) ;
11
+ return match ? match [ 1 ] : null ;
12
+ } ;
13
+
8
14
const WithBlogCrossLinks : FC = ( ) => {
9
15
const { pathname } = getClientContext ( ) ;
10
16
@@ -18,14 +24,34 @@ const WithBlogCrossLinks: FC = () => {
18
24
19
25
const { posts } = getBlogData ( category ) ;
20
26
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 (
22
45
( { slug } ) => slug === `/blog/${ category } /${ postname } `
23
46
) ;
24
47
25
- const [ previousCrossLink , nextCrossLink ] = [
26
- posts [ currentItem - 1 ] ,
27
- posts [ currentItem + 1 ] ,
28
- ] ;
48
+ // For release posts sorted by semver (descending):
49
+ // - Previous should point to an older version (higher index)
50
+ // - Next should point to a newer version (lower index)
51
+ const [ previousCrossLink , nextCrossLink ] =
52
+ category === 'release'
53
+ ? [ sortedPosts [ currentItem + 1 ] , sortedPosts [ currentItem - 1 ] ]
54
+ : [ sortedPosts [ currentItem - 1 ] , sortedPosts [ currentItem + 1 ] ] ;
29
55
30
56
return (
31
57
< div className = "max-xs:grid-cols-1 mt-4 grid w-full grid-cols-2 gap-4" >
0 commit comments