Skip to content

Commit 4050674

Browse files
Merge pull request #16 from passimm/develop
add action/reducer for getSubtrackChallenges/getUserSrm/getUserMarathon
2 parents bf68f2b + c33dabf commit 4050674

File tree

4 files changed

+303
-1
lines changed

4 files changed

+303
-1
lines changed

__tests__/__snapshots__/index.js.snap

+7
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,12 @@ Object {
7474
"getStatsHistoryDone": [Function],
7575
"getStatsHistoryInit": [Function],
7676
"getStatsInit": [Function],
77+
"getSubtrackChallengesDone": [Function],
78+
"getSubtrackChallengesInit": [Function],
79+
"getUserMarathonDone": [Function],
80+
"getUserMarathonInit": [Function],
81+
"getUserSrmDone": [Function],
82+
"getUserSrmInit": [Function],
7783
},
7884
"profile": Object {
7985
"addSkillDone": [Function],
@@ -200,6 +206,7 @@ Object {
200206
"countReset": [Function],
201207
"debug": [Function],
202208
"dir": [Function],
209+
"dirxml": [Function],
203210
"error": [Function],
204211
"group": [Function],
205212
"groupCollapsed": [Function],

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
"lint:js": "./node_modules/.bin/eslint --ext .js,.jsx .",
3232
"test": "npm run lint && npm run jest"
3333
},
34-
"version": "0.4.1",
34+
"version": "0.4.2",
3535
"dependencies": {
3636
"auth0-js": "^6.8.4",
3737
"isomorphic-fetch": "^2.2.1",

src/actions/members.js

+145
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
* @desc Actions related to members data.
44
*/
55

6+
import qs from 'qs';
67
import { createActions } from 'redux-actions';
78
import { getService } from '../services/members';
89
import { getService as getUserService } from '../services/user';
@@ -200,6 +201,144 @@ async function getStatsDistributionDone(handle, track, subTrack, uuid, tokenV3)
200201
return { data, handle, uuid };
201202
}
202203

204+
/**
205+
* @static
206+
* @desc Create an action that signals beginning of subtrack challenges loading.
207+
* @param {String} handle Member handle.
208+
* @param {String} uuid Operation UUID.
209+
* @return {Action}
210+
*/
211+
async function getSubtrackChallengesInit(handle, uuid) {
212+
return { handle, uuid };
213+
}
214+
215+
/**
216+
* @static
217+
* @desc Create an action that loads the member subtrack challenges.
218+
* @param {String} uuid Operation UUID.
219+
* @param {String} handle Member handle.
220+
* @param {String} tokenV3 v3 auth token.
221+
* @param {String} track Main track name.
222+
* @param {String} subTrack Subtrack name.
223+
* @param {Number} start page.
224+
* @param {Number} page size.
225+
* @param {Boolean} whether to refresh.
226+
* @return {Action}
227+
*/
228+
async function getSubtrackChallengesDone(
229+
uuid, handle, tokenV3, track, subTrack, pageNum, pageSize,
230+
refresh,
231+
) {
232+
const filter = {
233+
status: 'completed',
234+
hasUserSubmittedForReview: 'true',
235+
track,
236+
subTrack,
237+
};
238+
239+
const params = {};
240+
params.orderBy = 'submissionEndDate desc';
241+
params.limit = pageSize;
242+
params.offset = pageNum * pageSize;
243+
244+
const service = getChallengesService(tokenV3);
245+
return service.getUserChallenges(handle, filter, params)
246+
.then(res => ({
247+
uuid,
248+
challenges: res.challenges,
249+
refresh,
250+
handle,
251+
}));
252+
}
253+
254+
/**
255+
* @static
256+
* @desc Create an action that signals beginning of member SRM loading.
257+
* @param {String} handle Member handle.
258+
* @param {String} uuid Operation UUID.
259+
* @return {Action}
260+
*/
261+
async function getUserSRMInit(handle, uuid) {
262+
return { handle, uuid };
263+
}
264+
265+
/**
266+
* @static
267+
* @desc Create an action that loads the member SRM.
268+
* @param {String} uuid Operation UUID.
269+
* @param {String} handle Member handle.
270+
* @param {String} tokenV3 v3 auth token.
271+
* @param {Number} start page.
272+
* @param {Number} page size.
273+
* @param {Boolean} whether to refresh.
274+
* @return {Action}
275+
*/
276+
async function getUserSRMDone(
277+
uuid, handle, tokenV3, pageNum, pageSize,
278+
refresh,
279+
) {
280+
const filter = {
281+
status: 'past',
282+
isRatedForSRM: 'true',
283+
};
284+
285+
const params = {
286+
filter: qs.stringify(filter, { encode: false }),
287+
limit: pageSize,
288+
offset: pageNum * pageSize,
289+
};
290+
291+
const service = getChallengesService(tokenV3);
292+
return service.getUserSrms(handle, params).then(res => ({
293+
uuid,
294+
srms: res,
295+
refresh,
296+
handle,
297+
}));
298+
}
299+
300+
/**
301+
* @static
302+
* @desc Create an action that signals beginning of member marathon loading.
303+
* @param {String} handle Member handle.
304+
* @param {String} uuid Operation UUID.
305+
* @return {Action}
306+
*/
307+
async function getUserMarathonInit(handle, uuid) {
308+
return { handle, uuid };
309+
}
310+
311+
/**
312+
* @static
313+
* @desc Create an action that loads the member marathon.
314+
* @param {String} uuid Operation UUID.
315+
* @param {String} handle Member handle.
316+
* @param {String} tokenV3 v3 auth token.
317+
* @param {Number} start page.
318+
* @param {Number} page size.
319+
* @param {Boolean} whether to refresh.
320+
* @return {Action}
321+
*/
322+
async function getUserMarathonDone(
323+
uuid, handle, tokenV3, pageNum, pageSize,
324+
refresh,
325+
) {
326+
const filter = { status: 'PAST', isRatedForMM: 'true' };
327+
const params = {};
328+
params.orderBy = 'endDate desc';
329+
params.limit = pageSize;
330+
params.offset = pageNum * pageSize;
331+
332+
const service = getChallengesService(tokenV3);
333+
return service.getUserMarathonMatches(handle, filter, params)
334+
.then(res => ({
335+
uuid,
336+
marathons: res,
337+
refresh,
338+
handle,
339+
}));
340+
}
341+
203342
export default createActions({
204343
MEMBERS: {
205344
DROP: drop,
@@ -216,5 +355,11 @@ export default createActions({
216355
GET_STATS_DISTRIBUTION_DONE: getStatsDistributionDone,
217356
GET_ACTIVE_CHALLENGES_INIT: getActiveChallengesInit,
218357
GET_ACTIVE_CHALLENGES_DONE: getActiveChallengesDone,
358+
GET_SUBTRACK_CHALLENGES_INIT: getSubtrackChallengesInit,
359+
GET_SUBTRACK_CHALLENGES_DONE: getSubtrackChallengesDone,
360+
GET_USER_SRM_INIT: getUserSRMInit,
361+
GET_USER_SRM_DONE: getUserSRMDone,
362+
GET_USER_MARATHON_INIT: getUserMarathonInit,
363+
GET_USER_MARATHON_DONE: getUserMarathonDone,
219364
},
220365
});

src/reducers/members.js

+150
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,150 @@ function onGetActiveChallengesDone(state, { error, payload }) {
282282
};
283283
}
284284

285+
/**
286+
* Inits the loading of member subtrack challenges.
287+
* @param {Object} state
288+
* @param {Object} action
289+
* @return {Object} New state.
290+
*/
291+
function onGetSubtrackChallengesInit(state, { payload }) {
292+
const { handle, uuid } = payload;
293+
return {
294+
...state,
295+
[handle]: { ...state[handle], loadingSubTrackChallengesUUID: uuid },
296+
};
297+
}
298+
299+
/**
300+
* Finalizes the loading of member subtrack challenges.
301+
* @param {Object} state
302+
* @param {Object} action
303+
* @return {Object} New state.
304+
*/
305+
function onGetSubtrackChallengesDone(state, { error, payload }) {
306+
if (error) {
307+
logger.error('Failed to get member subtrack challenges', payload);
308+
fireErrorMessage('Failed to get member subtrack challenges', '');
309+
return state;
310+
}
311+
312+
const {
313+
uuid,
314+
challenges,
315+
refresh,
316+
handle,
317+
} = payload;
318+
if (uuid !== state[handle].loadingSubTrackChallengesUUID) return state;
319+
320+
return {
321+
...state,
322+
[handle]: {
323+
...state[handle],
324+
subtrackChallenges: (state[handle].subtrackChallenges && !refresh)
325+
? [...state[handle].subtrackChallenges, ...challenges]
326+
: challenges,
327+
// if current query returns 0 item, mark it completed
328+
subtrackChallengesHasMore: challenges && challenges.length > 0,
329+
loadingSubTrackChallengesUUID: '',
330+
},
331+
};
332+
}
333+
334+
/**
335+
* Inits the loading of member SRMs.
336+
* @param {Object} state
337+
* @param {Object} action
338+
* @return {Object} New state.
339+
*/
340+
function onGetUserSRMInit(state, { payload }) {
341+
const { handle, uuid } = payload;
342+
return {
343+
...state,
344+
[handle]: { ...state[handle], loadingSRMUUID: uuid },
345+
};
346+
}
347+
348+
/**
349+
* Finalizes the loading of member SRMs.
350+
* @param {Object} state
351+
* @param {Object} action
352+
* @return {Object} New state.
353+
*/
354+
function onGetUserSRMDone(state, { error, payload }) {
355+
if (error) {
356+
logger.error('Failed to get member SRMs', payload);
357+
fireErrorMessage('Failed to get member SRMs', '');
358+
return state;
359+
}
360+
361+
const {
362+
uuid,
363+
srms,
364+
refresh,
365+
handle,
366+
} = payload;
367+
if (uuid !== state[handle].loadingSRMUUID) return state;
368+
369+
return {
370+
...state,
371+
[handle]: {
372+
...state[handle],
373+
userSRMs: (state[handle].userSRMs && !refresh) ? [...state[handle].userSRMs, ...srms] : srms,
374+
userSRMHasMore: srms && srms.length > 0, // if current query returns 0 item, mark it completed
375+
loadingSRMUUID: '',
376+
},
377+
};
378+
}
379+
380+
/**
381+
* Inits the loading of member marathons.
382+
* @param {Object} state
383+
* @param {Object} action
384+
* @return {Object} New state.
385+
*/
386+
function onGetUserMarathonInit(state, { payload }) {
387+
const { handle, uuid } = payload;
388+
return {
389+
...state,
390+
[handle]: { ...state[handle], loadingMarathonUUID: uuid },
391+
};
392+
}
393+
394+
/**
395+
* Finalizes the loading of member marathons.
396+
* @param {Object} state
397+
* @param {Object} action
398+
* @return {Object} New state.
399+
*/
400+
function onGetUserMarathonDone(state, { error, payload }) {
401+
if (error) {
402+
logger.error('Failed to get member marathons', payload);
403+
fireErrorMessage('Failed to get member marathons', '');
404+
return state;
405+
}
406+
407+
const {
408+
uuid,
409+
marathons,
410+
refresh,
411+
handle,
412+
} = payload;
413+
if (uuid !== state[handle].loadingMarathonUUID) return state;
414+
415+
return {
416+
...state,
417+
[handle]: {
418+
...state[handle],
419+
userMarathons: (state[handle].userMarathons && !refresh)
420+
? [...state[handle].userMarathons, ...marathons.challenges]
421+
: marathons.challenges,
422+
// if current query returns 0 item, mark it completed
423+
userMarathonHasMore: marathons && marathons.challenges && marathons.challenges.length > 0,
424+
loadingMarathonUUID: '',
425+
},
426+
};
427+
}
428+
285429
/**
286430
* Creates a new Members reducer with the specified initial state.
287431
* @param {Object} initialState Optional. Initial state.
@@ -304,6 +448,12 @@ function create(initialState = {}) {
304448
[a.getStatsDistributionDone]: onGetStatsDistributionDone,
305449
[a.getActiveChallengesInit]: onGetActiveChallengesInit,
306450
[a.getActiveChallengesDone]: onGetActiveChallengesDone,
451+
[a.getSubtrackChallengesInit]: onGetSubtrackChallengesInit,
452+
[a.getSubtrackChallengesDone]: onGetSubtrackChallengesDone,
453+
[a.getUserSrmInit]: onGetUserSRMInit,
454+
[a.getUserSrmDone]: onGetUserSRMDone,
455+
[a.getUserMarathonInit]: onGetUserMarathonInit,
456+
[a.getUserMarathonDone]: onGetUserMarathonDone,
307457
}, initialState);
308458
}
309459

0 commit comments

Comments
 (0)