@@ -6,107 +6,111 @@ import Marked from "../components/Marked"
6
6
import Seo from "../components/Seo"
7
7
import { toSlug } from "../utils/slug"
8
8
9
- interface Library {
9
+ interface ILibrary {
10
10
description : string
11
11
github ?: string
12
12
npm ?: string
13
13
howto : string
14
14
name : string
15
15
sourcePath : string
16
16
url : string
17
+ gem ?: string
18
+ lastRelease ?: string
19
+ formattedLastRelease ?: string
20
+ stars ?: number
21
+ formattedStars ?: string
22
+ license ?: string
17
23
}
18
24
19
25
interface Language {
20
26
name : string
21
27
totalStars : number
22
28
categoryMap : {
23
- Client : Library [ ]
24
- Server : Library [ ]
29
+ Client : ILibrary [ ]
30
+ Server : ILibrary [ ]
25
31
}
26
32
}
27
33
28
34
interface PageContext {
29
35
languageList : Language [ ]
30
36
otherLibraries : {
31
- Services : Library [ ]
32
- Tools : Library [ ]
37
+ Services : ILibrary [ ]
38
+ Tools : ILibrary [ ]
33
39
}
34
40
sourcePath : string
35
41
}
36
42
37
- export function buildLibraryContent (
38
- library : any ,
39
- pageContext : Queries . TagPageQueryVariables
40
- ) {
43
+ export function Library ( { data } : { data : ILibrary } ) {
41
44
const [ overflown , setOverflown ] = useState ( false )
42
45
const [ expanded , setExpanded ] = useState ( false )
43
46
return (
44
47
< div className = "library-info" >
45
48
< div className = "library-details" >
46
49
< a
47
50
className = "library-name"
48
- href = { library . url }
51
+ href = { data . url }
49
52
target = "_blank"
50
53
rel = "noreferrer"
51
54
>
52
- < p > { library . name } </ p >
55
+ < p > { data . name } </ p >
53
56
</ a >
54
- { library . github && (
57
+ { data . github && (
55
58
< div className = "library-detail" >
56
59
< b > GitHub</ b >
57
60
< a
58
- href = { `https://github.com/${ library . github } ` }
61
+ href = { `https://github.com/${ data . github } ` }
59
62
target = "_blank"
60
63
rel = "noreferrer"
61
64
>
62
- { library . github }
65
+ { data . github }
63
66
</ a >
64
67
</ div >
65
68
) }
66
- { library . npm && (
69
+ { data . npm && (
67
70
< div className = "library-detail" >
68
71
< b > npm</ b >
69
72
< a
70
- href = { `https://www.npmjs.com/package/${ library . npm } ` }
73
+ href = { `https://www.npmjs.com/package/${ data . npm } ` }
71
74
target = "_blank"
75
+ rel = "noreferrer"
72
76
>
73
- { library . npm }
77
+ { data . npm }
74
78
</ a >
75
79
</ div >
76
80
) }
77
- { library . gem && (
81
+ { data . gem && (
78
82
< div className = "library-detail" >
79
83
< b > gem</ b >
80
84
< a
81
- href = { `https://rubygems.org/gems/${ library . gem } ` }
85
+ href = { `https://rubygems.org/gems/${ data . gem } ` }
82
86
target = "_blank"
83
87
rel = "noreferrer"
84
88
>
85
- { library . gem }
89
+ { data . gem }
86
90
</ a >
87
91
</ div >
88
92
) }
89
- { library . lastRelease && (
93
+ { data . lastRelease && (
90
94
< div className = "library-detail" >
91
95
< b > Last Release</ b >
92
- < span > { library . formattedLastRelease } </ span >
96
+ < span > { data . formattedLastRelease } </ span >
93
97
</ div >
94
98
) }
95
- { library . stars && (
99
+ { data . stars && (
96
100
< div className = "library-detail" >
97
101
< b > Stars</ b >
98
- < span > { library . formattedStars } </ span >
102
+ < span > { data . formattedStars } </ span >
99
103
</ div >
100
104
) }
101
- { library . license && (
105
+ { data . license && (
102
106
< div className = "library-detail" >
103
107
< b > License</ b >
104
- < span > { library . license } </ span >
108
+ < span > { data . license } </ span >
105
109
</ div >
106
110
) }
107
- { library . howto ? (
111
+ { data . howto ? (
108
112
< div className = "library-description" >
109
- < Marked pageContext = { pageContext } > { library . description } </ Marked >
113
+ < Marked > { data . description } </ Marked >
110
114
</ div >
111
115
) : (
112
116
< br />
@@ -123,9 +127,7 @@ export function buildLibraryContent(
123
127
}
124
128
} }
125
129
>
126
- < Marked pageContext = { pageContext } >
127
- { library . howto || library . description }
128
- </ Marked >
130
+ < Marked > { data . howto || data . description } </ Marked >
129
131
</ div >
130
132
{ overflown && (
131
133
< div
@@ -145,34 +147,16 @@ export function buildLibraryContent(
145
147
)
146
148
}
147
149
148
- export function buildLibraryList (
149
- libraries : Library [ ] ,
150
- pageContext : any
151
- ) {
150
+ export function LibraryList ( { data } : { data : ILibrary [ ] } ) {
152
151
return (
153
152
< div className = "library-list" >
154
- { libraries . map ( library => buildLibraryContent ( library , pageContext ) ) }
153
+ { data . map ( library => (
154
+ < Library data = { library } />
155
+ ) ) }
155
156
</ div >
156
157
)
157
158
}
158
159
159
- export function buildLibraryCategoryContent (
160
- libraryCategories : { Client : Library [ ] ; Server : Library [ ] } ,
161
- libraryCategoryName : 'Client' | 'Server' ,
162
- slug : string ,
163
- pageContext : any
164
- ) {
165
- if ( libraryCategoryName in libraryCategories ) {
166
- const libraries = libraryCategories [ libraryCategoryName ]
167
- return (
168
- < div id = { slug } className = "library-category" >
169
- < h3 className = "library-category-title" > { libraryCategoryName } </ h3 >
170
- { buildLibraryList ( libraries , pageContext ) }
171
- </ div >
172
- )
173
- }
174
- }
175
-
176
160
const categorySlugMap = [
177
161
[ "Server" , toSlug ( "Server" ) ] ,
178
162
[ "Client" , toSlug ( "Client" ) ] ,
@@ -271,11 +255,22 @@ export default ({ pageContext }: PageProps<{}, PageContext>) => {
271
255
< div className = "library-categories" >
272
256
{ filteredCategorySlugMap . map (
273
257
( [ categoryName , categorySlug ] ) =>
274
- buildLibraryCategoryContent (
275
- libraryCategories ,
276
- categoryName ,
277
- `${ languageSlug } -${ categorySlug } ` ,
278
- pageContext
258
+ categoryName in libraryCategories && (
259
+ < div
260
+ id = { `${ languageSlug } -${ categorySlug } ` }
261
+ className = "library-category"
262
+ >
263
+ < h3 className = "library-category-title" >
264
+ { categoryName }
265
+ </ h3 >
266
+ < LibraryList
267
+ data = {
268
+ libraryCategories [
269
+ categoryName as "Client" | "Server"
270
+ ]
271
+ }
272
+ />
273
+ </ div >
279
274
)
280
275
) }
281
276
</ div >
@@ -290,21 +285,15 @@ export default ({ pageContext }: PageProps<{}, PageContext>) => {
290
285
#
291
286
</ AnchorLink >
292
287
</ h2 >
293
- { buildLibraryList (
294
- pageContext . otherLibraries ?. Tools ?? [ ] ,
295
- pageContext
296
- ) }
288
+ < LibraryList data = { pageContext . otherLibraries ?. Tools ?? [ ] } />
297
289
< h2 >
298
290
< a className = "anchor" id = "services" > </ a >
299
291
Services
300
292
< AnchorLink className = "hash-link" to = "#services" >
301
293
#
302
294
</ AnchorLink >
303
295
</ h2 >
304
- { buildLibraryList (
305
- pageContext . otherLibraries ?. Services ?? [ ] ,
306
- pageContext
307
- ) }
296
+ < LibraryList data = { pageContext . otherLibraries ?. Services ?? [ ] } />
308
297
</ div >
309
298
</ div >
310
299
< p >
0 commit comments