@@ -11,6 +11,7 @@ import { mockContributors } from "./mockData";
1111import "./leaderboard.css" ;
1212
1313const GITHUB_ORG = "recodehive" ;
14+ type TimeFilter = "week" | "month" | "year" | "all" ;
1415
1516// Users to exclude from the leaderboard
1617const EXCLUDED_USERS = [
@@ -44,12 +45,6 @@ interface Contributor {
4445 badges ?: string [ ] ; // Array of badge image paths
4546}
4647
47- interface Stats {
48- flooredTotalPRs : number ;
49- totalContributors : number ;
50- flooredTotalPoints : number ;
51- }
52-
5348// Badge configuration - maps badge numbers to achievement criteria
5449const BADGE_CONFIG = [
5550 {
@@ -212,63 +207,6 @@ function Badge({
212207 ) ;
213208}
214209
215- function TopPerformerCard ( {
216- contributor,
217- rank,
218- onPRClick,
219- onBadgeClick,
220- } : {
221- contributor : Contributor ;
222- rank : number ;
223- onPRClick : ( contributor : Contributor ) => void ;
224- onBadgeClick ?: ( contributor : Contributor ) => void ;
225- } ) {
226- const { isDark } = useSafeColorMode ( ) ;
227- const rankClass = rank === 1 ? "top-1" : rank === 2 ? "top-2" : "top-3" ;
228- const badges = getContributorBadges ( contributor , rank ) ;
229-
230- return (
231- < div className = { `top-performer-card ${ isDark ? "dark" : "light" } ` } >
232- < img
233- src = { contributor . avatar }
234- alt = { contributor . username }
235- className = "avatar large"
236- />
237- < div className = { `rank-overlay ${ rankClass } ` } >
238- < span className = "rank-text" > { rank } </ span >
239- </ div >
240- < div className = "performer-info" >
241- < a
242- href = { contributor . profile }
243- target = "_blank"
244- rel = "noreferrer"
245- className = "username-link"
246- >
247- { contributor . username }
248- </ a >
249- < ContributorBadges
250- badges = { badges }
251- onClick = { ( ) => onBadgeClick ?.( contributor ) }
252- />
253- < div className = "badges-container" >
254- < Badge
255- count = { contributor . prs }
256- label = "PRs"
257- color = { { background : "#dbeafe" , color : "#2563eb" } }
258- onClick = { ( ) => onPRClick ( contributor ) }
259- clickable = { true }
260- />
261- < Badge
262- count = { contributor . points }
263- label = "Points"
264- color = { { background : "#ede9fe" , color : "#7c3aed" } }
265- />
266- </ div >
267- </ div >
268- </ div >
269- ) ;
270- }
271-
272210export default function LeaderBoard ( ) : JSX . Element {
273211 // Get time filter functions from context
274212 const {
@@ -349,7 +287,6 @@ export default function LeaderBoard(): JSX.Element {
349287
350288 const renderPaginationButtons = ( ) => {
351289 const pages = [ ] ;
352- const maxVisibleButtons = 5 ; // Maximum number of page buttons to show directly
353290
354291 // Special case: if we have 7 or fewer pages, show all of them without ellipsis
355292 if ( totalPages <= 7 ) {
@@ -448,22 +385,6 @@ export default function LeaderBoard(): JSX.Element {
448385 return "regular" ;
449386 } ;
450387
451- // Helper function for time filter display
452- const getTimeFilterLabel = ( filter : string ) => {
453- switch ( filter ) {
454- case "week" :
455- return "📊 This Week" ;
456- case "month" :
457- return "📆 This Month" ;
458- case "year" :
459- return "📅 This Year" ;
460- case "all" :
461- return "🏆 All Time" ;
462- default :
463- return "🏆 All Time" ;
464- }
465- } ;
466-
467388 return (
468389 < div className = { `leaderboard-container ${ isDark ? "dark" : "light" } ` } >
469390 < div className = "leaderboard-content" >
@@ -498,7 +419,7 @@ export default function LeaderBoard(): JSX.Element {
498419 value = { currentTimeFilter }
499420 onChange = { ( e ) => {
500421 // Use setTimeFilter from context
501- setTimeFilter ( e . target . value as any ) ;
422+ setTimeFilter ( e . target . value as TimeFilter ) ;
502423 setCurrentPage ( 1 ) ;
503424 setIsSelectChanged ( true ) ;
504425 setTimeout ( ( ) => setIsSelectChanged ( false ) , 1200 ) ;
0 commit comments