Skip to content

Commit ea1fdfd

Browse files
committed
Make direct requests for exporting leaderboard instead of caching in store
1 parent 4ea9315 commit ea1fdfd

File tree

1 file changed

+36
-43
lines changed

1 file changed

+36
-43
lines changed

src/pages/leaderboard/subcomponents/LeaderboardExportButton.tsx

Lines changed: 36 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
import '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';
510
import { useTypedSelector } from 'src/commons/utils/Hooks';
6-
import LeaderboardActions from 'src/features/leaderboard/LeaderboardActions';
711
import { ContestLeaderboardRow, LeaderboardRow } from 'src/features/leaderboard/LeaderboardTypes';
8-
9-
import { Role } from '../../../commons/application/ApplicationTypes';
12+
import { store } from 'src/pages/createStore';
1013

1114
type Props = {
1215
type: string;
@@ -15,60 +18,50 @@ type Props = {
1518
};
1619

1720
const 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

Comments
 (0)