@@ -182,24 +182,68 @@ export function ToolsList({ pageContext, type }: ToolsListProps) {
182
182
< h3 id = { type } className = "library-category-title" >
183
183
{ type === "GatewaysAndSupergraphs" ? "Gateways / Supergraphs" : type }
184
184
</ h3 >
185
- { pageContext . toolList . map (
186
- tool => (
187
- console . log ( tool . categoryMap , tool . name ) ,
188
- (
189
- < div key = { tool . name } id = { toSlug ( tool . name ) } >
190
- { Object . entries ( tool . categoryMap ) . map (
191
- ( [ categoryName , data ] ) =>
192
- categoryName === type && < LibraryList data = { data } />
193
- ) }
194
- </ div >
195
- )
196
- )
197
- ) }
185
+ { pageContext . toolList . map ( tool => (
186
+ < div key = { tool . name } id = { toSlug ( tool . name ) } >
187
+ { Object . entries ( tool . categoryMap ) . map (
188
+ ( [ categoryName , data ] ) =>
189
+ categoryName === type && < LibraryList data = { data } />
190
+ ) }
191
+ </ div >
192
+ ) ) }
198
193
</ >
199
194
)
200
195
}
196
+ const sortLanguageList = ( sortConfig : {
197
+ sortType ?: "popularity" | "alphabetical"
198
+ data : Language [ ]
199
+ } ) => {
200
+ const { sortType = "popularity" , data } = sortConfig
201
+ const _data = [ ...data ]
202
+ if ( sortType === "popularity" ) return _data
203
+ _data ?. sort ( ( a , b ) => {
204
+ if ( a . name > b . name ) {
205
+ return 1
206
+ }
207
+ if ( a . name < b . name ) {
208
+ return - 1
209
+ }
210
+ return 0
211
+ } )
212
+ return _data
213
+ }
201
214
215
+ const SortInput = ( props : {
216
+ isChecked : boolean
217
+ onChange : ( e : any ) => unknown
218
+ value : string
219
+ label : string
220
+ } ) => {
221
+ const { isChecked, onChange, value, label } = props
222
+ return (
223
+ < div className = "inputContainer" >
224
+ < input
225
+ type = "radio"
226
+ name = "sort"
227
+ id = { label }
228
+ value = { value }
229
+ onChange = { onChange }
230
+ checked = { isChecked }
231
+ />
232
+ < label htmlFor = { label } > { label } </ label >
233
+ </ div >
234
+ )
235
+ }
202
236
export default ( { pageContext } : PageProps < { } , PageContext > ) => {
237
+ const [ sortBy , setSortBy ] = useState < "popularity" | "alphabetical" > (
238
+ "popularity"
239
+ )
240
+ const sortedLanguageList = sortLanguageList ( {
241
+ sortType : sortBy ,
242
+ data : pageContext . languageList ,
243
+ } )
244
+ const handleInputChange = ( e : any ) => {
245
+ setSortBy ( e . target . value )
246
+ }
203
247
return (
204
248
< Layout className = "code" pageContext = { pageContext } >
205
249
< div className = "code-hero" >
@@ -235,8 +279,23 @@ export default ({ pageContext }: PageProps<{}, PageContext>) => {
235
279
< p id = "language-support" className = "languages-title" >
236
280
Language Support
237
281
</ p >
282
+ < div className = "sortByContainer" >
283
+ < p className = "sortBy" > Sort By:</ p >
284
+ < SortInput
285
+ onChange = { handleInputChange }
286
+ value = "popularity"
287
+ label = "Popularity"
288
+ isChecked = { sortBy === "popularity" }
289
+ />
290
+ < SortInput
291
+ onChange = { handleInputChange }
292
+ value = "alphabetical"
293
+ label = "Alphabetical"
294
+ isChecked = { sortBy === "alphabetical" }
295
+ />
296
+ </ div >
238
297
< div className = "language-boxes" >
239
- { pageContext . languageList
298
+ { sortedLanguageList
240
299
?. map ( language => language ?. name ! )
241
300
. filter ( Boolean )
242
301
. map ( languageName => {
@@ -253,7 +312,7 @@ export default ({ pageContext }: PageProps<{}, PageContext>) => {
253
312
} ) }
254
313
</ div >
255
314
< div className = "languages-content" >
256
- { pageContext . languageList . map ( lang => {
315
+ { sortedLanguageList . map ( lang => {
257
316
const languageName = lang . name
258
317
const libraryCategories = lang . categoryMap
259
318
const filteredCategorySlugMap = categorySlugMap . filter (
0 commit comments