Skip to content

Commit 1074596

Browse files
committed
Multiple Leaderboards
1 parent 5ce1f20 commit 1074596

File tree

7 files changed

+58
-154
lines changed

7 files changed

+58
-154
lines changed

__tests__/shared/containers/__snapshots__/Leaderboard.jsx.snap

Lines changed: 2 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -5,40 +5,10 @@ exports[`Matches shapshot 1`] = `
55
HeadBanner={null}
66
apiUrl="http://www.mocky.io/v2/59098e60100000b60747c10b"
77
auth={null}
8+
id="communityLeaderboard"
89
isLoadingLeaderboard={false}
910
isTopGear={false}
10-
leaderboardData={
11-
Array [
12-
Object {
13-
"avatarUrl": "some.fake.string",
14-
"challenge_stats.count": 99999,
15-
"challenge_stats.winner_handle": "overachieving.mofo",
16-
"project_result.final_score": 9999999999,
17-
"rank": 1,
18-
},
19-
Object {
20-
"avatarUrl": "some.fake.string",
21-
"challenge_stats.count": 99999,
22-
"challenge_stats.winner_handle": "overachieving.mofo",
23-
"project_result.final_score": 9999999999,
24-
"rank": 1,
25-
},
26-
Object {
27-
"avatarUrl": "some.fake.string",
28-
"challenge_stats.count": 99999,
29-
"challenge_stats.winner_handle": "overachieving.mofo",
30-
"project_result.final_score": 9999999999,
31-
"rank": 1,
32-
},
33-
Object {
34-
"avatarUrl": "some.fake.string",
35-
"challenge_stats.count": 99999,
36-
"challenge_stats.winner_handle": "overachieving.mofo",
37-
"project_result.final_score": 9999999999,
38-
"rank": 1,
39-
},
40-
]
41-
}
11+
leaderboardData={null}
4212
loadLeaderboard={[Function]}
4313
loadedApiUrl={null}
4414
store={

__tests__/shared/reducers/leaderboard.js

Lines changed: 0 additions & 90 deletions
This file was deleted.

src/shared/actions/leaderboard.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { createActions } from 'redux-actions';
1010
/**
1111
* Load user ranking for the leaderboard page.
1212
*/
13-
function fetchLeaderboard(auth, apiUrl) {
13+
function fetchLeaderboard(auth, apiUrl, id) {
1414
// we use fetch directly here, as we are making request to api v4 using token v3
1515
// so we don't create a new service to not bring inconsistency in an existent service approach
1616
return fetch(apiUrl, {
@@ -30,7 +30,7 @@ function fetchLeaderboard(auth, apiUrl) {
3030
data.forEach((element, index) => {
3131
element.rank = index + 1;
3232
});
33-
return { data, loadedApiUrl: apiUrl };
33+
return { data, id, loadedApiUrl: apiUrl };
3434
});
3535
}
3636

@@ -49,7 +49,7 @@ async function getTcoHistoryChallengesDone(url, competitor) {
4949

5050
export default createActions({
5151
LEADERBOARD: {
52-
FETCH_LEADERBOARD_INIT: _.noop,
52+
FETCH_LEADERBOARD_INIT: _.identity,
5353
FETCH_LEADERBOARD_DONE: fetchLeaderboard,
5454
GET_TCO_HISTORY_CHALLENGES_INIT: getTcoHistoryChallengesInit,
5555
GET_TCO_HISTORY_CHALLENGES_DONE: getTcoHistoryChallengesDone,

src/shared/components/Contentful/AppComponent/index.jsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ export function AppComponentSwitch(appComponent) {
1616
if (appComponent.fields.type === 'TCO-Leaderboard') {
1717
return (
1818
<Leaderboard
19+
id={appComponent.sys.id}
1920
apiUrl={appComponent.fields.props.leaderboardApiUrl}
2021
title={appComponent.fields.props.title}
2122
podiumSpots={appComponent.fields.props.podiumSpots}

src/shared/containers/Leaderboard/index.jsx

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,10 @@ class LeaderboardPageContainer extends React.Component {
2323
isLoadingLeaderboard,
2424
loadLeaderboard,
2525
loadedApiUrl,
26+
id,
2627
} = this.props;
2728
if (!(apiUrl === loadedApiUrl || isLoadingLeaderboard)) {
28-
loadLeaderboard(auth, apiUrl);
29+
loadLeaderboard(auth, apiUrl, id);
2930
}
3031
}
3132

@@ -69,6 +70,7 @@ Leaderboard
6970
}
7071

7172
LeaderboardPageContainer.defaultProps = {
73+
id: 'communityLeaderboard',
7274
HeadBanner: null,
7375
leaderboardData: [],
7476
isLoadingLeaderboard: false,
@@ -81,6 +83,7 @@ LeaderboardPageContainer.defaultProps = {
8183
};
8284

8385
LeaderboardPageContainer.propTypes = {
86+
id: PT.string,
8487
HeadBanner: PT.func,
8588
leaderboardData: PT.arrayOf(PT.shape()),
8689
isLoadingLeaderboard: PT.bool,
@@ -91,17 +94,24 @@ LeaderboardPageContainer.propTypes = {
9194
isTopGear: PT.bool,
9295
};
9396

94-
const mapStateToProps = state => ({
95-
leaderboardData: state.leaderboard.data,
96-
isLoadingLeaderboard: state.leaderboard.loading,
97-
loadedApiUrl: state.leaderboard.loadedApiUrl,
98-
auth: state.auth,
99-
});
97+
function mapStateToProps(state, props) {
98+
return state.leaderboard[props.id] ? {
99+
leaderboardData: state.leaderboard[props.id].data,
100+
isLoadingLeaderboard: state.leaderboard[props.id].loading,
101+
loadedApiUrl: state.leaderboard[props.id].loadedApiUrl,
102+
auth: state.auth,
103+
} : {
104+
leaderboardData: null,
105+
isLoadingLeaderboard: false,
106+
loadedApiUrl: null,
107+
auth: state.auth,
108+
};
109+
}
100110

101111
const mapDispatchToProps = dispatch => ({
102-
loadLeaderboard: (auth, apiUrl) => {
103-
dispatch(actions.leaderboard.fetchLeaderboardInit());
104-
dispatch(actions.leaderboard.fetchLeaderboardDone(auth, apiUrl));
112+
loadLeaderboard: (auth, apiUrl, id) => {
113+
dispatch(actions.leaderboard.fetchLeaderboardInit({ id }));
114+
dispatch(actions.leaderboard.fetchLeaderboardDone(auth, apiUrl, id));
105115
},
106116
});
107117

src/shared/containers/tco/Leaderboard/index.jsx

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,15 @@ class LeaderboardPageContainer extends React.Component {
2929

3030
componentDidMount() {
3131
const {
32+
id,
3233
apiUrl,
3334
auth,
3435
isLoadingLeaderboard,
3536
loadLeaderboard,
3637
loadedApiUrl,
3738
} = this.props;
3839
if (!(apiUrl === loadedApiUrl || isLoadingLeaderboard)) {
39-
loadLeaderboard(auth, apiUrl);
40+
loadLeaderboard(auth, apiUrl, id);
4041
}
4142
}
4243

@@ -112,6 +113,7 @@ LeaderboardPageContainer.defaultProps = {
112113
};
113114

114115
LeaderboardPageContainer.propTypes = {
116+
id: PT.string.isRequired,
115117
leaderboardData: PT.arrayOf(PT.shape()),
116118
isLoadingLeaderboard: PT.bool,
117119
loadLeaderboard: PT.func.isRequired,
@@ -127,17 +129,24 @@ LeaderboardPageContainer.propTypes = {
127129
memberLimit: PT.number,
128130
};
129131

130-
const mapStateToProps = state => ({
131-
leaderboardData: state.leaderboard.data,
132-
isLoadingLeaderboard: state.leaderboard.loading,
133-
loadedApiUrl: state.leaderboard.loadedApiUrl,
134-
auth: state.auth,
135-
});
132+
function mapStateToProps(state, props) {
133+
return state.leaderboard[props.id] ? {
134+
leaderboardData: state.leaderboard[props.id].data,
135+
isLoadingLeaderboard: state.leaderboard[props.id].loading,
136+
loadedApiUrl: state.leaderboard[props.id].loadedApiUrl,
137+
auth: state.auth,
138+
} : {
139+
leaderboardData: null,
140+
isLoadingLeaderboard: false,
141+
loadedApiUrl: null,
142+
auth: state.auth,
143+
};
144+
}
136145

137146
const mapDispatchToProps = dispatch => ({
138-
loadLeaderboard: (auth, apiUrl) => {
139-
dispatch(actions.leaderboard.fetchLeaderboardInit());
140-
dispatch(actions.leaderboard.fetchLeaderboardDone(auth, apiUrl));
147+
loadLeaderboard: (auth, apiUrl, id) => {
148+
dispatch(actions.leaderboard.fetchLeaderboardInit({ id }));
149+
dispatch(actions.leaderboard.fetchLeaderboardDone(auth, apiUrl, id));
141150
},
142151
resetTcoHistoryChallenges: () => {
143152
dispatch(actions.leaderboard.resetTcoHistoryChallenges());

src/shared/reducers/leaderboard.js

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,12 @@ import { getAuthTokens } from 'utils/tc';
1515
function onDone(state, action) {
1616
return {
1717
...state,
18-
data: action.error ? null : action.payload.data,
19-
loadedApiUrl: action.error ? null : action.payload.loadedApiUrl,
20-
failed: !!action.error,
21-
loading: false,
18+
[action.payload.id]: {
19+
data: action.error ? null : action.payload.data,
20+
loadedApiUrl: action.error ? null : action.payload.loadedApiUrl,
21+
failed: !!action.error,
22+
loading: false,
23+
},
2224
};
2325
}
2426

@@ -43,13 +45,15 @@ function onHistoryChallengesDone(state, action) {
4345
*/
4446
function create(initialState) {
4547
return redux.handleActions({
46-
[actions.leaderboard.fetchLeaderboardInit](state) {
48+
[actions.leaderboard.fetchLeaderboardInit](state, action) {
4749
return {
4850
...state,
49-
data: null,
50-
loadedApiUrl: null,
51-
failed: false,
52-
loading: true,
51+
[action.payload.id]: {
52+
data: null,
53+
loadedApiUrl: null,
54+
failed: false,
55+
loading: true,
56+
},
5357
};
5458
},
5559
[actions.leaderboard.fetchLeaderboardDone]: onDone,

0 commit comments

Comments
 (0)