@@ -80,6 +80,9 @@ export function getTopContributorsAndRepos(lifetimeData, topN, selectedRepo) {
8080 const contributorStats = { } ;
8181 const repoStats = { } ;
8282 const contributorIssuesClosed = { } ;
83+ const contributorCurrentStreaks = { } ;
84+ const repoHighestStreaks = { } ;
85+ const repoActiveStreakMembers = { } ;
8386
8487 // Safely handle empty data
8588 if ( ! lifetimeData ) return { topContributors : [ ] , topRepos : [ ] } ;
@@ -89,6 +92,8 @@ export function getTopContributorsAndRepos(lifetimeData, topN, selectedRepo) {
8992 if ( selectedRepo && repoName !== selectedRepo ) return ;
9093
9194 let repoTotalActivity = 0 ;
95+ let repoHighestStreak = 0 ;
96+ let repoActiveMembers = 0 ;
9297
9398 // Helper to safely add metrics to a user's total and the repo's total
9499 const addActivity = ( user , amount , isClosedIssue = false ) => {
@@ -117,6 +122,19 @@ export function getTopContributorsAndRepos(lifetimeData, topN, selectedRepo) {
117122
118123 addActivity ( user , stats . total_issues_opened ) ;
119124 addActivity ( user , stats . total_issues_closed , true ) ;
125+
126+ contributorCurrentStreaks [ user ] = Math . max (
127+ contributorCurrentStreaks [ user ] || 0 ,
128+ Number ( stats . currentStreak ) || 0
129+ ) ;
130+
131+ const userStreak = Number ( stats . currentStreak ) || 0 ;
132+
133+ if ( userStreak > 0 ) {
134+ repoActiveMembers += 1 ;
135+ }
136+
137+ repoHighestStreak = Math . max ( repoHighestStreak , userStreak ) ;
120138 } ) ;
121139 }
122140
@@ -137,6 +155,9 @@ export function getTopContributorsAndRepos(lifetimeData, topN, selectedRepo) {
137155 if ( repoTotalActivity > 0 ) {
138156 repoStats [ repoName ] = ( repoStats [ repoName ] || 0 ) + repoTotalActivity ;
139157 }
158+
159+ repoHighestStreaks [ repoName ] = repoHighestStreak ;
160+ repoActiveStreakMembers [ repoName ] = repoActiveMembers ;
140161 } ) ;
141162
142163 // Sort contributors by streak first, then closed issues, then alphabetically
@@ -145,19 +166,28 @@ export function getTopContributorsAndRepos(lifetimeData, topN, selectedRepo) {
145166 name,
146167 count,
147168 totalIssuesClosed : contributorIssuesClosed [ name ] || 0 ,
148- currentStreak : 0 // Placeholder for now
169+ currentStreak : contributorCurrentStreaks [ name ] || 0
149170 } ) )
150171 . sort ( ( a , b ) =>
151172 b . currentStreak - a . currentStreak ||
152- b . totalIssuesClosed - a . totalIssuesClosed ||
153- a . name . localeCompare ( b . name ) )
173+ a . name . localeCompare ( b . name )
174+ )
154175 . slice ( 0 , topN ) ;
155176
156- // Sort repositories by activity volume (descending), then alphabetically
157- const topRepos = Object . entries ( repoStats )
158- . map ( ( [ name , count ] ) => ( { name, count } ) )
159- . sort ( ( a , b ) => b . count - a . count || a . name . localeCompare ( b . name ) )
177+ // Sort repositories by highest streak first, then by how many members have a streak, then alphabetically
178+ const topRepos = Object . keys ( repoHighestStreaks )
179+ . map ( ( name ) => ( {
180+ name,
181+ streak : repoHighestStreaks [ name ] || 0 ,
182+ activeMembers : repoActiveStreakMembers [ name ] || 0
183+ } ) )
184+ . filter ( ( repo ) => repo . streak > 0 )
185+ . sort ( ( a , b ) =>
186+ b . streak - a . streak ||
187+ b . activeMembers - a . activeMembers ||
188+ a . name . localeCompare ( b . name )
189+ )
160190 . slice ( 0 , topN ) ;
161-
162- return { topContributors, topRepos } ;
191+
192+ return { topContributors, topRepos } ;
163193}
0 commit comments