topcoder-react-lib
Version:
The implementation of TC lib for ReactJS projects
488 lines (447 loc) • 13.5 kB
JavaScript
/**
* @module "actions.members"
* @desc Actions related to members data.
*/
import qs from 'qs';
import { createActions } from 'redux-actions';
import { getService } from '../services/members';
import { getService as getUserService } from '../services/user';
import { getService as getChallengesService } from '../services/challenges';
/**
* @static
* @desc Creates an action that drops all information related to the specfied
* member.
* @param {String} handle Topcoder user handle.
* @return {Action}
*/
function drop(handle) {
return handle;
}
/**
* @static
* @desc Creates an action that drops all member information loaded by
* actions from this module.
* @return {Action}
*/
function dropAll() {}
/**
* @static
* @desc Creates an action that signals beginning of member achievements
* loading.
* @param {String} handle Member handle.
* @param {String} uuid Loading operation UUID.
* @return {Action}
*/
function getAchievementsInit(handle, uuid) {
return { handle, uuid };
}
/**
* @static
* @desc Creates an action that loads member achievements.
* @param {String} handle Member handle.
* @param {String} uuid Loading operation
* @return {Action}
*/
async function getAchievementsDone(handle, uuid) {
let data;
try {
data = await getUserService().getAchievements(handle);
} catch (e) {
data = [];
}
return { data, handle, uuid };
}
/**
* @static
* @desc Creates an action that loads member achievements from v3 API.
* @param {String} handle Member handle.
* @param {String} uuid Loading operation
* @return {Action}
*/
async function getAchievementsV3Done(handle, uuid) {
let data;
try {
data = await getUserService().getAchievementsV3(handle);
} catch (e) {
data = [];
}
return { data, handle, uuid };
}
/**
* @static
* @desc Creates an action that signals beginning of loading the member's
* financial information.
* @param {String} handle Member handle.
* @param {String} uuid Operation UUID.
* @return {Action}
*/
function getFinancesInit(handle, uuid) {
return { handle, uuid };
}
/**
* @static
* @desc Creates an action that loads member's financial information.
* @param {String} handle Member handle.
* @param {String} uuid Operation UUID.
* @param {String} tokenV3 v3 auth token.
* @return {Action}
*/
async function getFinancesDone(handle, uuid, tokenV3) {
const data = await getService(tokenV3).getMemberFinances(handle);
return { data, handle, uuid };
}
/**
* @static
* @desc Creates an action that signals beginning of member stats loading.
* @param {String} handle Member handle.
* @param {String} uuid Operation UUID.
* @return {Action}
*/
async function getStatsInit(handle, uuid) {
return { handle, uuid };
}
/**
* @static
* @desc Create an action that loads member statistics.
* @param {String} handle Member handle.
* @param {Array<String>|String} groupIds Group ids.
* @param {String} uuid Operation UUID.
* @param {String} tokenV3 v3 auth token.
* @return {Action}
*/
async function getStatsDone(handle, groupIds, uuid, tokenV3) {
const data = await getService(tokenV3).getStats(handle, groupIds, tokenV3);
return { data, handle, uuid };
}
/**
* @static
* @desc Payload creator for the action that inits the loading of member active challenges.
* @param {String} handle
* @param {String} uuid
* @returns {Object} Payload
*/
async function getActiveChallengesInit(handle, uuid) {
return { handle, uuid };
}
/**
* @static
* @desc Payload creator for the action that loads the member active challenges.
* @param {String} handle
* @param {String} uuid
* @param {String} tokenV3
* @returns {Object} Payload
*/
/* eslint-disable no-unused-vars */
async function getActiveChallengesDone(handle, uuid, tokenV3) {
const filter = { status: 'Active' };
const service = getChallengesService(tokenV3);
const memberInfo = await getService(tokenV3).getMemberInfo(handle);
/* TODO: Reuse `getAll` from `actions/challenge-listing`
/* after it moved from `community-app` to here.
*/
function getAll(getter, page = 0, prev = null) {
const PAGE_SIZE = 50;
return getter({
perPage: PAGE_SIZE,
page: page + 1,
}).then(({ challenges: chunk }) => {
if (!chunk.length) return prev || [];
return getAll(getter, 1 + page, prev ? prev.concat(chunk) : chunk);
});
}
const calls = [
getAll(params => service.getUserChallenges(memberInfo.userId, filter, params)),
];
const [challenges] = await Promise.all(calls);
return { handle, challenges, uuid };
}
/* eslint-enable no-unused-vars */
/**
* @static
* @desc Payload creator for the action that loads the member active challenges from v4 api.
* @param {String} handle
* @param {String} uuid
* @param {String} tokenV3
* @returns {Object} Payload
*/
async function getActiveChallengesV4Done(handle, uuid, tokenV3) {
const filter = { status: 'Active' };
const service = getChallengesService(tokenV3);
function getAll(getter, page = 0, prev = null) {
const PAGE_SIZE = 50;
return getter({
limit: PAGE_SIZE,
offset: page * PAGE_SIZE,
}).then(({ challenges: chunk }) => {
if (!chunk.length) return prev || [];
return getAll(getter, 1 + page, prev ? prev.concat(chunk) : chunk);
});
}
const calls = [
getAll(params => service.getUserChallengesV4(handle, filter, params)),
];
const [challenges] = await Promise.all(calls);
return { handle, challenges, uuid };
}
/**
* @static
* @desc Create an action that signals beginning of member stats distribution history.
* @param {String} handle Member handle.
* @param {String} uuid Operation UUID.
* @return {Action}
*/
async function getStatsHistoryInit(handle, uuid) {
return { handle, uuid };
}
/**
* @static
* @desc Create an action that loads the member stats history.
* @param {String} handle Member handle.
* @param {String} uuid Operation UUID.
* @param {String} tokenV3 v3 auth token.
* @return {Action}
*/
async function getStatsHistoryDone(handle, groupIds, uuid, tokenV3) {
const data = await getService(tokenV3).getStatsHistory(handle, groupIds, tokenV3);
return { data, handle, uuid };
}
/**
* @static
* @desc Create an action that signals beginning of member stats distribution loading.
* @param {String} handle Member handle.
* @param {String} uuid Operation UUID.
* @return {Action}
*/
async function getStatsDistributionInit(handle, uuid) {
return { handle, uuid };
}
/**
* @static
* @desc Create an action that loads the member stats distribution.
* @param {String} handle Member handle.
* @param {String} track Main track name.
* @param {String} subTrack Subtrack name.
* @param {String} uuid Operation UUID.
* @param {String} tokenV3 v3 auth token.
* @return {Action}
*/
async function getStatsDistributionDone(handle, track, subTrack, uuid, tokenV3) {
const data = await getService(tokenV3).getStatsDistribution(handle, track, subTrack);
return { data, handle, uuid };
}
/**
* @static
* @desc Create an action that signals beginning of subtrack challenges loading.
* @param {String} handle Member handle.
* @param {String} uuid Operation UUID.
* @param {Number} pageNum Page index.
* @return {Action}
*/
async function getSubtrackChallengesInit(handle, uuid, pageNum) {
return { handle, uuid, pageNum };
}
/**
* @static
* @desc Create an action that loads the member subtrack challenges.
* @param {String} uuid Operation UUID.
* @param {String} handle Member handle.
* @param {String} tokenV3 v3 auth token.
* @param {String} track Main track name.
* @param {String} subTrack Subtrack name.
* @param {Number} start page.
* @param {Number} page size.
* @param {Boolean} whether to refresh.
* @return {Action}
*/
/* eslint-disable no-unused-vars */
async function getSubtrackChallengesDone(
uuid, handle, tokenV3, track, subTrack, pageNum, pageSize,
refresh, userId,
) {
const filter = {
status: 'Completed',
hasUserSubmittedForReview: 'true',
track,
subTrack,
};
const params = {};
params.orderBy = 'submissionEndDate desc';
params.limit = pageSize;
params.offset = pageNum * pageSize;
const service = getChallengesService(tokenV3);
return service.getUserChallenges(userId, filter, params)
.then(res => ({
uuid,
challenges: res.challenges,
refresh,
handle,
}));
}
/* eslint-enable no-unused-vars */
/**
* @static
* @desc Create an action that loads the member subtrack challenges from v4 api.
* @param {String} uuid Operation UUID.
* @param {String} handle Member handle.
* @param {String} tokenV3 v3 auth token.
* @param {String} track Main track name.
* @param {String} subTrack Subtrack name.
* @param {Number} start page.
* @param {Number} page size.
* @param {Boolean} whether to refresh.
* @return {Action}
*/
async function getSubtrackChallengesV4Done(
uuid, handle, tokenV3, track, subTrack, pageNum, pageSize,
refresh,
) {
const filter = {
status: 'Completed',
hasUserSubmittedForReview: 'true',
track,
subTrack,
};
const params = {};
params.orderBy = 'submissionEndDate desc';
params.limit = pageSize;
params.offset = (pageNum - 1) * pageSize; // pageNum - 1 to match with v4 offset
const service = getChallengesService(tokenV3);
return service.getUserChallengesV4(handle, filter, params)
.then(res => ({
uuid,
challenges: res.challenges,
refresh,
handle,
})).catch(e => ({ handle, error: e }));
}
/**
* @static
* @desc Create an action that signals beginning of member SRM loading.
* @param {String} handle Member handle.
* @param {String} uuid Operation UUID.
* @return {Action}
*/
async function getUserSRMInit(handle, uuid) {
return { handle, uuid };
}
/**
* @static
* @desc Create an action that loads the member SRM.
* @param {String} uuid Operation UUID.
* @param {String} handle Member handle.
* @param {String} tokenV3 v3 auth token.
* @param {Number} start page.
* @param {Number} page size.
* @param {Boolean} whether to refresh.
* @return {Action}
*/
async function getUserSRMDone(
uuid, handle, tokenV3, pageNum, pageSize,
refresh,
) {
const filter = {
status: 'past',
isRatedForSRM: 'true',
};
const params = {
filter: qs.stringify(filter, { encode: false }),
limit: pageSize,
offset: pageNum * pageSize,
};
const service = getChallengesService(tokenV3);
return service.getUserSrms(handle, params).then(res => ({
uuid,
srms: res,
refresh,
handle,
}));
}
/**
* @static
* @desc Create an action that signals beginning of member marathon loading.
* @param {String} handle Member handle.
* @param {String} uuid Operation UUID.
* @return {Action}
*/
async function getUserMarathonInit(handle, uuid) {
return { handle, uuid };
}
/**
* @static
* @desc Create an action that loads the member marathon.
* @param {String} uuid Operation UUID.
* @param {String} handle Member handle.
* @param {String} memberId Member id.
* @param {String} tokenV3 v3 auth token.
* @param {Number} start page.
* @param {Number} page size.
* @param {Boolean} whether to refresh.
* @return {Action}
*/
async function getUserMarathonDone(
uuid, handle, memberId, tokenV3, pageNum, pageSize,
refresh,
) {
const filter = { status: 'Completed' };
const params = {};
params.sortBy = 'endDate';
params.sortOrder = 'desc';
params.perPage = pageSize;
params.page = pageNum;
const service = getChallengesService(tokenV3);
return service.getUserMarathonMatches(memberId, filter, params)
.then(res => ({
uuid,
marathons: { challenges: res },
refresh,
handle,
}));
}
/**
* @static
* @desc Create an action that fetch user registered challenge's resources.
* @param {String} memberId Member id.
* @param {String} uuid Operation UUID.
* @return {Action}
*/
async function getUserResourcesInit(memberId, uuid) {
return { memberId, uuid };
}
/**
* @static
* @desc Create an action that fetch user registered challenge's resources.
* @param {String} handle Member handle.
* @param {String} uuid Operation UUID.
* @return {Action}
*/
async function getUserResourcesDone(memberId, tokenV3, uuid) {
const resources = await getService(tokenV3).getUserResources(memberId);
return { resources, uuid };
}
export default createActions({
MEMBERS: {
DROP: drop,
DROP_ALL: dropAll,
GET_ACHIEVEMENTS_INIT: getAchievementsInit,
GET_ACHIEVEMENTS_DONE: getAchievementsDone,
GET_ACHIEVEMENTS_V3_DONE: getAchievementsV3Done,
GET_FINANCES_INIT: getFinancesInit,
GET_FINANCES_DONE: getFinancesDone,
GET_STATS_INIT: getStatsInit,
GET_STATS_DONE: getStatsDone,
GET_STATS_HISTORY_INIT: getStatsHistoryInit,
GET_STATS_HISTORY_DONE: getStatsHistoryDone,
GET_STATS_DISTRIBUTION_INIT: getStatsDistributionInit,
GET_STATS_DISTRIBUTION_DONE: getStatsDistributionDone,
GET_ACTIVE_CHALLENGES_INIT: getActiveChallengesInit,
GET_ACTIVE_CHALLENGES_DONE: getActiveChallengesV4Done,
GET_SUBTRACK_CHALLENGES_INIT: getSubtrackChallengesInit,
GET_SUBTRACK_CHALLENGES_DONE: getSubtrackChallengesV4Done,
GET_USER_SRM_INIT: getUserSRMInit,
GET_USER_SRM_DONE: getUserSRMDone,
GET_USER_MARATHON_INIT: getUserMarathonInit,
GET_USER_MARATHON_DONE: getUserMarathonDone,
GET_USER_RESOURCES_INIT: getUserResourcesInit,
GET_USER_RESOURCES_DONE: getUserResourcesDone,
},
});