11import 'src/styles/Leaderboard.scss' ;
22
3- import React , { useEffect , useMemo , useState } from 'react' ;
4- import { useDispatch } from 'react-redux' ;
3+ import React from 'react' ;
4+ import { Role } from 'src/commons/application/ApplicationTypes' ;
5+ import {
6+ getAllOverallLeaderboardXP ,
7+ getContestPopularVoteLeaderboard ,
8+ getContestScoreLeaderboard
9+ } from 'src/commons/sagas/RequestsSaga' ;
510import { useTypedSelector } from 'src/commons/utils/Hooks' ;
6- import LeaderboardActions from 'src/features/leaderboard/LeaderboardActions' ;
711import { ContestLeaderboardRow , LeaderboardRow } from 'src/features/leaderboard/LeaderboardTypes' ;
8-
9- import { Role } from '../../../commons/application/ApplicationTypes' ;
12+ import { store } from 'src/pages/createStore' ;
1013
1114type Props = {
1215 type : string ;
@@ -15,60 +18,50 @@ type Props = {
1518} ;
1619
1720const LeaderboardExportButton : React . FC < Props > = ( { type, contest, contestID } ) => {
18- // Retrieve relevant leaderboard data
19- const [ exportRequested , setExportRequest ] = useState ( false ) ;
20- const dispatch = useDispatch ( ) ;
21- const selectData = ( type : string ) => {
22- switch ( type ) {
23- case 'overall' :
24- return ( store : { leaderboard : { userXp : any } } ) => store . leaderboard . userXp ;
25- case 'score' :
26- return ( store : { leaderboard : { contestScore : any } } ) => store . leaderboard . contestScore ;
27- default :
28- return ( store : { leaderboard : { contestPopularVote : any } } ) =>
29- store . leaderboard . contestPopularVote ;
30- }
31- } ;
32-
33- const selector = useMemo ( ( ) => selectData ( type ) , [ type ] ) ;
34- const data = useTypedSelector ( selector ) ;
35-
36- const visibleEntries = Number . MAX_SAFE_INTEGER ;
21+ const role = useTypedSelector ( store => store . session . role ) ;
3722
38- const onExportClick = ( ) => {
39- // Dispatch relevant request
40- if ( type == 'overall' ) dispatch ( LeaderboardActions . getAllUsersXp ( ) ) ;
41- else if ( type == 'score' )
42- dispatch ( LeaderboardActions . getAllContestScores ( contestID as number , visibleEntries ) ) ;
43- else
44- dispatch ( LeaderboardActions . getAllContestPopularVotes ( contestID as number , visibleEntries ) ) ;
45- setExportRequest ( true ) ;
46- } ;
23+ const onExportClick = async ( ) => {
24+ const accessToken = store . getState ( ) . session . accessToken ! ;
25+ const refreshToken = store . getState ( ) . session . refreshToken ! ;
26+ const tokens = { accessToken, refreshToken } ;
4727
48- // Return the CSV when requested and data is loaded
49- useEffect ( ( ) => {
50- if ( exportRequested ) {
51- exportCSV ( ) ;
52- setExportRequest ( false ) ; // Clear request
28+ if ( type === 'overall' ) {
29+ const resp = await getAllOverallLeaderboardXP ( tokens ) ;
30+ if ( resp ) {
31+ exportCSV ( resp ) ;
32+ }
33+ } else if ( type === 'score' ) {
34+ const resp = await getContestScoreLeaderboard ( contestID ! , Number . MAX_SAFE_INTEGER , tokens ) ;
35+ if ( resp ) {
36+ exportCSV ( resp ) ;
37+ }
38+ } else if ( type === 'popularvote' ) {
39+ const resp = await getContestPopularVoteLeaderboard (
40+ contestID ! ,
41+ Number . MAX_SAFE_INTEGER ,
42+ tokens
43+ ) ;
44+ if ( resp ) {
45+ exportCSV ( resp ) ;
46+ }
5347 }
54- } , [ data ] ) ;
48+ } ;
5549
5650 const escapeCodeField = ( value : any ) => {
5751 const str = value ?. toString ( ) ?? '' ;
5852 const escaped = str . replace ( / " / g, '""' ) ;
5953 return `"${ escaped } "` ;
6054 } ;
6155
62- const role = useTypedSelector ( store => store . session . role ) ;
63- const exportCSV = ( ) => {
56+ const exportCSV = ( data : any [ ] ) => {
6457 const headers = [
6558 'Rank' ,
6659 'Name' ,
6760 'Username' ,
6861 type === 'overall' ? 'XP' : 'Score' ,
6962 type === 'overall' ? 'Achievements' : 'Code'
7063 ] ;
71- const rows = data ? .map (
64+ const rows = data . map (
7265 ( player : {
7366 rank : any ;
7467 name : any ;
@@ -110,7 +103,7 @@ const LeaderboardExportButton: React.FC<Props> = ({ type, contest, contestID })
110103
111104 return role === Role . Admin || role === Role . Staff ? (
112105 < button onClick = { onExportClick } className = "export-button" >
113- Export as .csv
106+ Export as CSV
114107 </ button >
115108 ) : (
116109 ''
0 commit comments