diff --git a/src/actions/challenge-listing.js b/src/actions/challenge-listing.js index 2e9c0d08..e60f10f0 100644 --- a/src/actions/challenge-listing.js +++ b/src/actions/challenge-listing.js @@ -150,7 +150,11 @@ function getAllActiveChallengesDone(uuid, tokenV3) { }); } - return { uuid, challenges: ch.challenges }; + return { + uuid, + challenges: ch.challenges, + handle: user, + }; }); } @@ -197,27 +201,27 @@ function getActiveChallengesDone( }).catch(() => ({ challenges: [] }))); } return Promise.all(calls).then(([ch, uch]) => { - let fullCH = ch; + // let fullCH = ch; /* uch array contains challenges where the user is participating in * some role. The same challenge are already listed in res array, but they * are not attributed to the user there. This block of code marks user * challenges in an efficient way. */ if (uch) { const map = {}; - uch.challenges.forEach((item) => { - map[item.id] = item; - /* eslint-disable no-param-reassign */ - item.users[user] = true; - item.userDetails = map[item.id].userDetails; - /* eslint-enable no-param-reassign */ + uch.challenges.forEach((item) => { map[item.id] = item; }); + ch.challenges.forEach((item) => { + if (map[item.id]) { + /* It is fine to reassing, as the array we modifying is created just + * above within the same function. */ + /* eslint-disable no-param-reassign */ + item.users[user] = true; + item.userDetails = map[item.id].userDetails; + /* eslint-enable no-param-reassign */ + } }); } - if (uch) { - fullCH = uch; - } - let { challenges } = fullCH; - let { meta } = ch; + let { challenges, meta } = ch; // filter by date range and re-compute meta // we can safely remove the next two lines when backend support date range challenges = filterUtil.filterByDate(challenges, frontFilter); diff --git a/src/reducers/challenge-listing.js b/src/reducers/challenge-listing.js index b1d87967..10d359c7 100644 --- a/src/reducers/challenge-listing.js +++ b/src/reducers/challenge-listing.js @@ -94,20 +94,33 @@ function onGetAllActiveChallengesDone(state, { error, payload }) { logger.error(payload); return state; } - const { uuid, challenges: loaded } = payload; + const { + uuid, challenges: loaded, handle, + } = payload; if (uuid !== state.loadingActiveChallengesUUID) return state; /* Once all active challenges are fetched from the API, we remove from the * store any active challenges stored there previously, and also any * challenges with IDs matching any challenges loaded now as active. */ const ids = new Set(); loaded.forEach(item => ids.add(item.id)); - const challenges = state.challenges - .filter(item => item.status !== 'ACTIVE' && !ids.has(item.id)) - .concat(loaded); + + const filter = item => !ids.has(item.id) && item.status !== 'ACTIVE'; + // BUCKET.MY + const my = processBucketData( + handle, state.challenges, loaded, BUCKETS.MY, null, null, filter, {}, + ); + // BUCKET.ALL + const all = processBucketData( + handle, state.challenges, loaded, BUCKETS.ALL, null, null, filter, {}, + ); + + const newChallenges = _.cloneDeep(state.challenges); + newChallenges[BUCKETS.ALL] = all; + newChallenges[BUCKETS.MY] = my; return { ...state, - challenges, + challenges: newChallenges, lastUpdateOfActiveChallenges: Date.now(), loadingActiveChallengesUUID: '', };