Skip to content

Commit 5040583

Browse files
committed
Added support for retrieving only relevant rows in leaderboard page
1 parent 0185023 commit 5040583

File tree

7 files changed

+65
-1
lines changed

7 files changed

+65
-1
lines changed

src/commons/application/ApplicationTypes.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,7 @@ export const defaultAchievement: AchievementState = {
351351

352352
export const defaultLeaderboard: LeaderboardState = {
353353
userXp: [],
354+
paginatedUserXp: [],
354355
contestScore: [],
355356
contestPopularVote: [],
356357
code: '',

src/commons/sagas/LeaderboardSaga.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { selectTokens } from './BackendSaga';
88
import {
99
getAllContests,
1010
getAllTotalXp,
11+
getPaginatedTotalXp,
1112
getContestPopularVoteLeaderboard,
1213
getContestScoreLeaderboard
1314
} from './RequestsSaga';
@@ -23,6 +24,17 @@ const LeaderboardSaga = combineSagaHandlers(LeaderboardActions, {
2324
}
2425
},
2526

27+
getPaginatedLeaderboardXp: function* (action) {
28+
const tokens: Tokens = yield selectTokens();
29+
const { page, pageSize } = action.payload;
30+
31+
const paginatedUsersXp = yield call(getPaginatedTotalXp, page, pageSize, tokens);
32+
33+
if (paginatedUsersXp) {
34+
yield put(actions.savePaginatedLeaderboardXp(paginatedUsersXp));
35+
}
36+
},
37+
2638
getAllContestScores: function* (action) {
2739
const tokens: Tokens = yield selectTokens();
2840
const assessmentId = action.payload;

src/commons/sagas/RequestsSaga.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -488,6 +488,36 @@ export const getAllTotalXp = async (tokens: Tokens): Promise<number | null> => {
488488
);
489489
};
490490

491+
/**
492+
* GET /courses/{courseId}/all_user_xp
493+
*/
494+
export const getPaginatedTotalXp = async (
495+
page: number,
496+
pageSize: number,
497+
tokens: Tokens
498+
): Promise<number | null> => {
499+
const resp = await request(`${courseId()}/get_paginated_display/${page}/${pageSize}`, 'GET', {
500+
...tokens
501+
});
502+
503+
if (!resp || !resp.ok) {
504+
return null; // invalid accessToken _and_ refreshToken
505+
}
506+
507+
const rows = await resp.json();
508+
509+
return rows.users.map(
510+
(row: any): LeaderboardRow => ({
511+
rank: row.rank,
512+
name: row.name,
513+
username: row.username,
514+
xp: row.total_xp,
515+
avatar: '',
516+
achievements: ''
517+
})
518+
);
519+
};
520+
491521
/**
492522
* GET /courses/{courseId}/leaderboard/contests/{assessment_id}/get_score_leaderboard
493523
*/

src/features/leaderboard/LeaderboardActions.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import {
99
const LeaderboardActions = createActions('leaderboard', {
1010
getAllUsersXp: 0,
1111
saveAllUsersXp: (userXp: LeaderboardRow[]) => userXp,
12+
getPaginatedLeaderboardXp: (page: number, pageSize: number) => ({page, pageSize}),
13+
savePaginatedLeaderboardXp: (paginatedUserXp: LeaderboardRow[]) => paginatedUserXp,
1214
getAllContestScores: (assessmentId: number) => assessmentId,
1315
saveAllContestScores: (contestScore: ContestLeaderboardRow[]) => contestScore,
1416
getAllContestPopularVotes: (assessmentId: number) => assessmentId,

src/features/leaderboard/LeaderboardReducer.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ export const LeaderboardReducer: Reducer<LeaderboardState, SourceActionType> = c
1212
.addCase(LeaderboardActions.saveAllUsersXp, (state, action) => {
1313
state.userXp = action.payload;
1414
})
15+
.addCase(LeaderboardActions.savePaginatedLeaderboardXp, (state, action) => {
16+
state.paginatedUserXp = action.payload;
17+
})
1518
.addCase(LeaderboardActions.saveAllContestScores, (state, action) => {
1619
state.contestScore = action.payload;
1720
})

src/features/leaderboard/LeaderboardTypes.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export type ContestLeaderboardRow = {
2020

2121
export type LeaderboardState = {
2222
userXp: LeaderboardRow[];
23+
paginatedUserXp: LeaderboardRow[];
2324
contestScore: ContestLeaderboardRow[];
2425
contestPopularVote: ContestLeaderboardRow[];
2526
code: string;

src/pages/leaderboard/subcomponents/OverallLeaderboard.tsx

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,25 @@ import LeaderboardExportButton from './LeaderboardExportButton';
2020
import LeaderboardPodium from './LeaderboardPodium';
2121

2222
const OverallLeaderboard: React.FC = () => {
23+
// FOR TESTING (To be removed)
24+
const dispatch = useDispatch();
25+
const paginatedLeaderboard: LeaderboardRow[] = useTypedSelector(store => store.leaderboard.paginatedUserXp);
26+
let page = 2;
27+
let pageSize = 25;
28+
useEffect(() => {
29+
dispatch(LeaderboardActions.getPaginatedLeaderboardXp(page, pageSize))
30+
console.log("TEST")
31+
}, [dispatch, page, pageSize]);
32+
33+
useEffect(() => {
34+
console.log(paginatedLeaderboard);
35+
}, [paginatedLeaderboard])
36+
37+
38+
2339
// Retrieve XP Data from store
2440
const rankedLeaderboard: LeaderboardRow[] = useTypedSelector(store => store.leaderboard.userXp);
2541

26-
const dispatch = useDispatch();
2742
useEffect(() => {
2843
dispatch(LeaderboardActions.getAllUsersXp());
2944
}, [dispatch]);

0 commit comments

Comments
 (0)