@@ -63,46 +63,61 @@ const TAGS_MENU_ID = "tags-menu";
6363const DATE_RANGE_MENU_ID = "date-range-id"
6464
6565function ReposCard ( { analyticsTag, icon, withAds } ) {
66+
67+ const getInitialSelectedTag = ( ) => {
68+ const githubCardSettings = cardsSettings && cardsSettings . repos ? cardsSettings . repos : null
69+ if ( githubCardSettings && githubCardSettings . language ) {
70+ return getTags ( ) . find ( ( t ) => t . label == githubCardSettings . language )
71+ }
72+
73+ return getTags ( ) . find ( ( t ) => t . githubValues != null )
74+ }
75+
76+ const getInitialDateRange = ( ) => {
77+ const githubCardSettings = cardsSettings && cardsSettings . repos ? cardsSettings . repos : null
78+ if ( githubCardSettings && githubCardSettings . dateRange ) {
79+ return githubCardSettings . dateRange
80+ }
81+ return 'daily'
82+ }
83+
6684 const globalTag = { value : 'global' , label : 'All trending' , githubValues : [ 'global' ] }
85+ const myLangsTag = { value : 'myLangs' , label : 'My Languages' , githubValues : [ 'myLangs' ] }
6786
6887 const preferences = useContext ( PreferencesContext )
6988
70- const { userSelectedTags = [ ] , userBookmarks = [ ] } = preferences
89+ const { userSelectedTags = [ ] , dispatcher , cardsSettings } = preferences
7190
72- const getTags = ( ) => [ ...userSelectedTags , globalTag ]
91+ const getTags = ( ) => [ ...userSelectedTags , globalTag , myLangsTag ]
7392
7493 const { show : showMenu } = useContextMenu ( )
7594
76- const [ selectedTag , setSelectedTag ] = useState ( getTags ( ) [ 0 ] )
77- const [ since , setSince ] = useState ( 'daily' )
95+ const [ selectedTag , setSelectedTag ] = useState ( getInitialSelectedTag ( ) )
96+ const [ since , setSince ] = useState ( getInitialDateRange ( ) )
7897 const [ refresh , setRefresh ] = useState ( true )
98+ const [ repos , setRepos ] = useState ( { } )
7999 const dateRangeMapper = {
80100 daily : 'the day' ,
81101 weekly : 'the week' ,
82102 monthly : 'the month' ,
83103 }
84104
85- const getInitialSelectedTag = ( ) => {
86- return getTags ( ) . find ( ( t ) => t . githubValues != null )
87- }
88-
89- useEffect ( ( ) => {
90- setSelectedTag ( getInitialSelectedTag ( ) )
91- } , [ ] )
92-
93105 useEffect ( ( ) => {
94106 setSelectedTag ( getInitialSelectedTag ( ) )
107+ setRepos ( { } )
95108 setRefresh ( ! refresh )
96109 } , [ userSelectedTags ] )
97110
98111 const onSelectedTagChange = ( selTag ) => {
99112 setSelectedTag ( selTag )
100113 trackReposLanguageChange ( selTag . value )
114+ dispatcher ( { type : 'setCardSettings' , value : { card : 'repos' , language : selTag . label } } )
101115 setRefresh ( ! refresh )
102116 }
103117
104118 const onDateRangeChange = ( dateRange ) => {
105119 setSince ( dateRange )
120+ dispatcher ( { type : 'setCardSettings' , value : { card : 'repos' , dateRange } } )
106121 trackReposDateRangeChange ( dateRange )
107122 setRefresh ( ! refresh )
108123 }
@@ -123,7 +138,34 @@ function ReposCard({ analyticsTag, icon, withAds }) {
123138 throw Error ( `Github Trending does not support ${ selectedTag . label } .` )
124139 }
125140
126- const data = await githubApi . getTrending ( selectedTag . githubValues [ 0 ] , since )
141+ const tagValue = selectedTag . githubValues [ 0 ]
142+ const key = `${ tagValue } -${ since } `
143+
144+ if ( repos [ key ] ) {
145+ return repos [ key ]
146+ }
147+
148+ if ( tagValue == myLangsTag . githubValues [ 0 ] ) {
149+ const promises = userSelectedTags . map (
150+ t => ! t . githubValues ? false : githubApi . getTrending ( t . githubValues [ 0 ] , since )
151+ )
152+ let values = await Promise . all ( promises )
153+ const nbrTags = values . length
154+ let minLength = Math . min ( ...values . map ( v => v . length ) )
155+ const data = [ ]
156+ for ( let index = 0 ; index < minLength ; index ++ ) {
157+ for ( let i = 0 ; i < nbrTags ; i ++ ) {
158+ data . push ( values [ i ] [ index ] )
159+ }
160+ }
161+
162+ setRepos ( { ...repos , [ key ] : data } )
163+ return data
164+
165+ }
166+
167+ const data = await githubApi . getTrending ( tagValue , since )
168+ setRepos ( { ...repos , [ key ] : data } )
127169 return data
128170 }
129171
@@ -165,7 +207,7 @@ function ReposCard({ analyticsTag, icon, withAds }) {
165207 < Menu id = { TAGS_MENU_ID } animation = { animation . fade } >
166208 { getTags ( ) . map ( ( tag ) => {
167209 return (
168- < Item key = { tag } onClick = { ( ) => onSelectedTagChange ( tag ) } >
210+ < Item key = { tag . value } onClick = { ( ) => onSelectedTagChange ( tag ) } >
169211 { tag . label }
170212 </ Item >
171213 )
0 commit comments