11import { observer } from 'mobx-react' ;
2- import { GetStaticProps , InferGetStaticPropsType } from 'next' ;
2+ import { InferGetStaticPropsType } from 'next' ;
33import { FC } from 'react' ;
44
55import { MDXLayout } from '../../components/Layout/MDXLayout' ;
66import { i18n } from '../../models/Translation' ;
7+ import { ArticleMeta , pageListOf , traverseTree } from '../api/core' ;
78
8- interface ArticleMeta {
9- name : string ;
10- path ?: string ;
11- subs : ArticleMeta [ ] ;
12- }
9+ export const getStaticProps = async ( ) => {
10+ const tree = await Array . fromAsync ( pageListOf ( '/article' ) ) ;
11+ const list = tree . map ( root => [ ...traverseTree ( root , 'subs' ) ] ) . flat ( ) ;
1312
14- const MDX_pattern = / \. m d x ? $ / ;
15-
16- export const getStaticProps : GetStaticProps < {
17- list : ArticleMeta [ ] ;
18- } > = async ( ) => {
19- const { readdirSync } = await import ( 'fs' ) ;
20-
21- const pageListOf = ( path : string , prefix = 'pages' ) : ArticleMeta [ ] =>
22- readdirSync ( prefix + path , { withFileTypes : true } )
23- . map ( node => {
24- let { name, path } = node ;
25-
26- if ( name . startsWith ( '.' ) ) return ;
27-
28- const isMDX = MDX_pattern . test ( name ) ;
29-
30- name = name . replace ( MDX_pattern , '' ) ;
31- path = `${ path } /${ name } ` . replace ( new RegExp ( `^${ prefix } ` ) , '' ) ;
32-
33- if ( node . isFile ( ) ) return isMDX && { name, path } ;
34-
35- if ( ! node . isDirectory ( ) ) return ;
36-
37- const subs = pageListOf ( path , prefix ) ;
38-
39- return subs [ 0 ] && { name, subs } ;
40- } )
41- . filter ( Boolean ) as ArticleMeta [ ] ;
42-
43- try {
44- const list = pageListOf ( '/article' ) ;
45-
46- return { props : { list } } ;
47- } catch {
48- return { props : { list : [ ] } } ;
49- }
13+ return { props : { tree, list } } ;
5014} ;
5115
5216const renderTree = ( list : ArticleMeta [ ] ) => (
5317 < ol >
54- { list . map ( ( { name, path, subs } ) => (
18+ { list . map ( ( { name, path, meta , subs } ) => (
5519 < li key = { name } >
5620 { path ? (
57- < a className = "h4" href = { path } >
58- { name }
21+ < a
22+ className = "h4 d-flex justify-content-between align-items-center"
23+ href = { path }
24+ >
25+ { name } { ' ' }
26+ { meta && (
27+ < time className = "fs-6" dateTime = { meta . updated || meta . date } >
28+ { meta . updated || meta . date }
29+ </ time >
30+ ) }
5931 </ a >
6032 ) : (
6133 < details >
@@ -69,9 +41,9 @@ const renderTree = (list: ArticleMeta[]) => (
6941) ;
7042
7143const ArticleIndexPage : FC < InferGetStaticPropsType < typeof getStaticProps > > =
72- observer ( ( { list } ) => (
73- < MDXLayout className = "" title = { i18n . t ( 'article' ) } >
74- { renderTree ( list ) }
44+ observer ( ( { tree , list : { length } } ) => (
45+ < MDXLayout className = "" title = { ` ${ i18n . t ( 'article' ) } ( ${ length } )` } >
46+ { renderTree ( tree ) }
7547 </ MDXLayout >
7648 ) ) ;
7749
0 commit comments