1
- import { useState , useEffect } from 'react'
1
+ import { useState , useEffect } from 'react' ;
2
2
import MemberLink from './MemberLink' ;
3
3
4
4
interface GithubMember {
@@ -16,55 +16,79 @@ const cacheKey = 'overextendedMembers';
16
16
const cacheExpiry = 24 * 60 * 60 * 1000 ;
17
17
18
18
const sponsor = {
19
- thelindat : `thelindat` ,
20
- LukeWasTakenn : `lukewastaken` ,
21
- DokaDoka : `dokadoka` ,
19
+ thelindat : 'thelindat' ,
20
+ LukeWasTakenn : 'lukewastaken' ,
21
+ DokaDoka : 'dokadoka' ,
22
+ juddisjudd : 'ohitsjudd' ,
22
23
jag3dagster : `jag3dagster` ,
23
- }
24
+ } ;
25
+
26
+ const priorityOrder = [ 'thelindat' , 'LukeWasTakenn' ] ;
24
27
25
28
async function FetchMembers ( ) {
26
29
const raw = localStorage . getItem ( cacheKey ) ;
27
30
const members : MemberData = raw ? JSON . parse ( raw ) : { } ;
28
31
const isCacheExpired = members . timestamp ? new Date ( ) . getTime ( ) - members . timestamp > cacheExpiry : true ;
29
32
30
- if ( ! isCacheExpired ) return members ;
31
-
32
- const headers = { }
33
+ if ( ! isCacheExpired ) {
34
+ console . log ( 'Using cached members data:' , members . data ) ;
35
+ return members ;
36
+ }
33
37
38
+ const headers : Record < string , string > = { } ;
34
39
if ( members . etag ) headers [ 'If-None-Match' ] = members . etag ;
35
40
36
- const response = await fetch ( `https://api.github.com/orgs/overextended/members` , {
37
- headers : headers
38
- } )
41
+ const response = await fetch ( `https://api.github.com/orgs/overextended/members` , { headers } ) ;
39
42
40
43
if ( response . status === 304 ) return members ;
41
44
42
45
members . data = await response . json ( ) ;
43
46
members . etag = response . headers . get ( 'ETag' ) ;
44
47
members . timestamp = new Date ( ) . getTime ( ) ;
45
48
49
+ members . data = [
50
+ ...priorityOrder
51
+ . map ( ( login ) => {
52
+ const foundMember = members . data . find ( ( member ) => member . login === login ) ;
53
+ if ( ! foundMember ) {
54
+ console . warn ( `Member ${ login } not found in API response` ) ;
55
+ }
56
+ return foundMember ;
57
+ } )
58
+ . filter ( ( member ) : member is GithubMember => ! ! member ) ,
59
+ ...members . data . filter ( ( member ) => ! priorityOrder . includes ( member . login ) ) ,
60
+ ] ;
61
+
62
+ console . log ( 'Sorted members data:' , members . data ) ;
63
+
46
64
localStorage . setItem ( cacheKey , JSON . stringify ( members ) ) ;
47
- console . log ( `fetched data and set cache (etag ${ members . etag } )` , members . timestamp )
48
-
65
+ console . log ( `Fetched, sorted, and cached data (etag ${ members . etag } )` , members . timestamp ) ;
66
+
49
67
return members ;
50
68
}
51
69
52
70
const DisplayMembers = ( ) => {
53
- const [ members , setMembers ] = useState ( null ) ;
71
+ const [ members , setMembers ] = useState < MemberData | null > ( null ) ;
54
72
55
73
useEffect ( ( ) => {
56
- ( async ( ) => setMembers ( await FetchMembers ( ) ) ) ( )
57
- } , [ ] )
74
+ ( async ( ) => setMembers ( await FetchMembers ( ) ) ) ( ) ;
75
+ } , [ ] ) ;
58
76
59
77
return (
60
78
< >
61
79
{ members ?. data && (
62
- < div className = 'grid md:grid-cols-3 lg:grid-cols-3 xl:grid-cols-4 grid-cols-1 mt-4 gap-16 place-items-center' >
63
- { members . data . map ( ( member ) => MemberLink ( { image : member . avatar_url , name : member . name ?? member . login , sponsor : sponsor [ member . login ] } ) ) }
80
+ < div className = "mt-4 grid grid-cols-1 place-items-center gap-16 md:grid-cols-3 lg:grid-cols-3 xl:grid-cols-4" >
81
+ { members . data . map ( ( member ) =>
82
+ MemberLink ( {
83
+ image : member . avatar_url ,
84
+ name : member . login ,
85
+ sponsor : sponsor [ member . login ] ,
86
+ } )
87
+ ) }
64
88
</ div >
65
89
) }
66
90
</ >
67
- )
91
+ ) ;
68
92
} ;
69
93
70
94
export default DisplayMembers ;
0 commit comments