diff --git a/dist/dev/index.js b/dist/dev/index.js index a48eb26..e03cc63 100644 --- a/dist/dev/index.js +++ b/dist/dev/index.js @@ -424,7 +424,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex /***/ (function(module, exports, __webpack_require__) { "use strict"; -eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _topcoderReactUtils = __webpack_require__(/*! topcoder-react-utils */ \"topcoder-react-utils\");\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _tcAuthLib = __webpack_require__(/*! @topcoder-platform/tc-auth-lib */ \"@topcoder-platform/tc-auth-lib\");\n\nvar _challenges = __webpack_require__(/*! ../services/challenges */ \"./src/services/challenges.js\");\n\nvar _submissions = __webpack_require__(/*! ../services/submissions */ \"./src/services/submissions.js\");\n\nvar _submission = __webpack_require__(/*! ../utils/submission */ \"./src/utils/submission.js\");\n\nvar submissionUtil = _interopRequireWildcard(_submission);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n return a;\n}; /**\n * @module \"actions.challenge\"\n * @desc Actions related to Topcoder challenges APIs.\n */\n\n/* global CONFIG */\n\n// import { getApi } from '../services/api';\n\n\nvar _CONFIG = {\"AV_SCAN_SCORER_REVIEW_TYPE_ID\":\"68c5a381-c8ab-48af-92a7-7a869a4ee6c3\",\"PROVISIONAL_SCORING_COMPLETED_REVIEW_TYPE_ID\":\"52c91e85-745f-4e62-b592-9879a2dfe9fd\",\"PAGE_SIZE\":50,\"REVIEW_OPPORTUNITY_PAGE_SIZE\":1000,\"CHALLENGE_APP_VERSION\":\"1.1.0\"},\n PAGE_SIZE = _CONFIG.PAGE_SIZE;\n\n/**\n * Private. Loads from the backend all data matching some conditions.\n * @param {Function} getter Given params object of shape { limit, offset }\n * loads from the backend at most \"limit\" data, skipping the first\n * \"offset\" ones. Returns loaded data as an array.\n * @param {Number} page Optional. Next page of data to load.\n * @param {Number} perPage Optional. The size of the page content to load.\n * @param {Array} prev Optional. data loaded so far.\n */\n\nfunction getAll(getter) {\n var page = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n var perPage = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : PAGE_SIZE;\n var prev = arguments[3];\n\n /* Amount of submissions to fetch in one API call. 50 is the current maximum\n * amount of submissions the backend returns, event when the larger limit is\n * explicitely required. */\n return getter({\n page: page,\n perPage: perPage\n }).then(function (res) {\n if (res.length === 0) {\n return prev || res;\n }\n // parse submissions\n var current = [];\n if (prev) {\n current = prev.concat(res);\n } else {\n current = res;\n }\n return getAll(getter, 1 + page, perPage, current);\n });\n}\n\n/**\n * @static\n * @desc Creates an action that drops from Redux store all checkpoints loaded\n * before.\n * @return {Action}\n */\nfunction dropCheckpoints() {}\n\n/**\n * @static\n * @desc Creates an action that drops from Redux store all challenge results\n * loaded before.\n * @return {Action}\n */\nfunction dropResults() {}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of challenge details loading.\n * @param {Number|String} challengeId Challenge ID\n * @return {Action}\n */\nfunction getDetailsInit(challengeId) {\n return _lodash2.default.toString(challengeId);\n}\n\n/**\n * @static\n * @desc Creates an action that loads challenge details.\n * @param {Number|String} challengeId Challenge ID.\n * @param {String} tokenV3 Topcoder v3 auth token.\n * @param {String} tokenV2 Topcoder v2 auth token.\n * @return {Action}\n */\nfunction getDetailsDone(challengeId, tokenV3, tokenV2) {\n var service = (0, _challenges.getService)(tokenV3, tokenV2);\n var v3Promise = service.getChallengeDetails(challengeId);\n return v3Promise;\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of user submissions loading.\n * @param {String} challengeId Challenge ID.\n * @return {Action}\n */\nfunction getSubmissionsInit(challengeId) {\n /* As a safeguard, we enforce challengeId to be string (in case somebody\n * passes in a number, by mistake). */\n return _lodash2.default.toString(challengeId);\n}\n\n/**\n * @static\n * @desc Creates an action that loads user's submissions to the specified\n * challenge.\n * @param {String} challengeId Challenge ID.\n * @param {String} tokenV3 Topcoder auth token v3.\n * @return {Action}\n */\nfunction getSubmissionsDone(challengeId, tokenV3) {\n var user = (0, _tcAuthLib.decodeToken)(tokenV3);\n var submissionsService = (0, _submissions.getService)(tokenV3);\n var filters = {\n challengeId: challengeId,\n memberId: user.userId\n };\n return submissionsService.getSubmissions(filters).then(function (submissions) {\n return {\n challengeId: _lodash2.default.toString(challengeId),\n submissions: submissions\n };\n }).catch(function (error) {\n var err = { challengeId: _lodash2.default.toString(challengeId), error: error };\n throw err;\n });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of Marathon Match submissions loading.\n * @param {String} challengeId Challenge ID.\n * @return {Action}\n */\nfunction getMMSubmissionsInit(challengeId) {\n /* As a safeguard, we enforce challengeId to be string (in case somebody\n * passes in a number, by mistake). */\n return _lodash2.default.toString(challengeId);\n}\n\n/**\n * @static\n * @desc Creates an action that loads Marathon Match submissions to the specified\n * challenge.\n * @param {String} challengeId Challenge ID.\n * @param {Array} registrants The array of register.\n * @param {String} tokenV3 Topcoder auth token v3.\n * @return {Action}\n */\nfunction getMMSubmissionsDone(challengeId, tokenV3) {\n var filter = { challengeId: challengeId };\n var submissionsService = (0, _submissions.getService)(tokenV3);\n\n // TODO: Move those numbers to configs\n return getAll(function (params) {\n return submissionsService.getSubmissions(filter, params);\n }, 1, 500).then(function (submissions) {\n var finalSubmissions = submissionUtil.processMMSubmissions(submissions);\n return {\n challengeId: challengeId,\n submissions: finalSubmissions,\n tokenV3: tokenV3\n };\n });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of registration for a\n * challenge.\n * @return {Action}\n */\nfunction registerInit() {}\n\n/**\n * @static\n * @desc Creates an action that registers user for a challenge.\n * @param {Object} auth An object that holds auth tokens. You can directly pass\n * here the `auth` segment of Redux store.\n * @param [auth.tokenV2]{String} Topcoder auth token v2.\n * @param [auth.tokenV3]{String} Topcoder auth token v3.\n * @param {String} challengeId Challenge ID.\n * @return {Action}\n */\nfunction registerDone(auth, challengeId) {\n return (0, _challenges.getService)(auth.tokenV3).register(challengeId)\n /* As a part of registration flow we silently update challenge details,\n * reusing for this purpose the corresponding action handler. */\n // Uses a delay to allow API time to update\n .then(function () {\n return new _promise2.default(function (resolve) {\n return setTimeout(function () {\n return resolve(getDetailsDone(challengeId, auth.tokenV3, auth.tokenV2));\n }, _topcoderReactUtils.config.CHALLENGE_DETAILS_REFRESH_DELAY);\n });\n });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of user unregistration from a\n * challenge.\n * @return {Action}\n */\nfunction unregisterInit() {}\n\n/**\n * @static\n * @desc Creates an action that unregisters user from a challenge.\n * @param {Object} auth Object that holds Topcoder auth tokens.\n * @param {String} [auth.tokenV2] v2 token.\n * @param {String} [auth.tokenV3] v3 token.\n * @param {String} challengeId Challenge ID.\n * @return {Action}\n */\nfunction unregisterDone(auth, challengeId) {\n return (0, _challenges.getService)(auth.tokenV3).unregister(challengeId)\n /* As a part of unregistration flow we silently update challenge details,\n * reusing for this purpose the corresponding action handler. */\n // Uses a delay to allow API time to update\n .then(function () {\n return new _promise2.default(function (resolve) {\n return setTimeout(function () {\n return resolve(getDetailsDone(challengeId, auth.tokenV3, auth.tokenV2));\n }, _topcoderReactUtils.config.CHALLENGE_DETAILS_REFRESH_DELAY);\n });\n });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of challenge results loading.\n * @param {Number|String} challengeId Challenge ID\n * @return {Action}\n */\nfunction loadResultsInit(challengeId) {\n return _lodash2.default.toString(challengeId);\n}\n\n/**\n * @static\n * @desc Creates an action that loads challenge results.\n * @param {String} challengeId The challenge id\n * @param {String} tokenV3 Topcoder auth token v3.\n * @return {Action}\n */\nfunction loadResultsDone(challengeId, tokenV3) {\n var service = (0, _challenges.getService)(tokenV3);\n return service.getChallengeDetails(challengeId).then(function (response) {\n return {\n challengeId: challengeId,\n results: response.winners\n };\n });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of challenge checkpoints data\n * loading.\n * @return {Action}\n */\nfunction fetchCheckpointsInit() {}\n\n/**\n * @static\n * @desc Creates an action that loads challenge checkpoints data.\n * @param {String} tokenV2 Topcoder v2 auth token.\n * @param {String} challengeId Challenge ID.\n */\nfunction fetchCheckpointsDone(tokenV2, challengeId) {\n // const endpoint = `/design/challenges/checkpoint/${challengeId}`;\n // return getApi('V2').fetch(endpoint)\n // .then((response) => {\n // if (response.status !== 200) {\n // throw response.status;\n // } else {\n // return response.json();\n // }\n // })\n // .then((response) => {\n // // Expanded key is used for UI expand/collapse.\n // response.checkpointResults.forEach((checkpoint, index) => {\n // response.checkpointResults[index].expanded = false;\n // });\n // return {\n // challengeId: String(challengeId),\n // checkpoints: response,\n // };\n // })\n // .catch(error => ({\n // error,\n // challengeId: String(challengeId),\n // }));\n\n return _promise2.default.resolve({\n challengeId: String(challengeId),\n checkpoints: {\n checkpointResults: []\n }\n });\n}\n\n/**\n * @static\n * @desc Creates an action that Toggles checkpoint details panel in the Topcoder\n * Submission Management Page.\n * @todo This is UI action relevant to a specific page in specific app. Must be\n * moved back to Community App.\n * @param {Number} id Checkpoint ID.\n * @param {Boolean} open Target state: `true` to expand, `false` to collapse the\n * details.\n * @return {Action}\n */\nfunction toggleCheckpointFeedback(id, open) {\n return { id: id, open: open };\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of challenge details update.\n * @todo No idea, why we have this action. This functionality should be covered\n * by {@link module:actions.challenge.getDetailsInit} and\n * {@link module:actions.challenge.getDetailsDone}. We need to refactor this.\n * @param {String} uuid UUID of the operation (the same should be passed into\n * the corresponding {@link module:actions.challenge.updateChallengeDone}).\n * @return {Action}\n */\nfunction updateChallengeInit(uuid) {\n return uuid;\n}\n\n/**\n * @static\n * @desc Creates an action that updates challenge details.\n * @todo No idea, why we have this action. This functionality should be covered\n * by {@link module:actions.challenge.getDetailsInit} and\n * {@link module:actions.challenge.getDetailsDone}. We need to refactor this.\n * @param {String} uuid Operation UUID. Should match the one passed into the\n * previous {@link module:actions.challenge.updateChallengeInit} call.\n * @param {Object} challenge Challenge data.\n * @param {String} tokenV3 Topcoder v3 auth token.\n * @return {Action}\n */\nfunction updateChallengeDone(uuid, challenge, tokenV3) {\n return (0, _challenges.getService)(tokenV3).updateChallenge(challenge).then(function (res) {\n return { uuid: uuid, res: res };\n });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of getting count of user's active challenges.\n * @return {Action}\n */\nfunction getActiveChallengesCountInit() {}\n\n/**\n * @static\n * @desc Creates an action that gets count of user's active challenges from the backend.\n * @param {String} handle Topcoder user handle.\n * @param {String} tokenV3 Optional. Topcoder auth token v3. Without token only\n * public challenges will be counted. With the token provided, the action will\n * also count private challenges related to this user.\n * @return {Action}\n */\nfunction getActiveChallengesCountDone(handle, tokenV3) {\n return (0, _challenges.getService)(tokenV3).getActiveChallengesCount(handle);\n}\n\n/**\n * @static\n * @desc Creates an action that gets submission information by submission id\n * @param {String} submissionId The submission id\n * @return {Action}\n */\nfunction getSubmissionInformationInit(challengeId, submissionId) {\n return { challengeId: _lodash2.default.toString(challengeId), submissionId: _lodash2.default.toString(submissionId) };\n}\n\n/**\n * @static\n * @desc Creates an action that gets submission information from the backend.\n * @param {String} submissionId The submission id\n * @param {String} tokenV3 Topcoder auth token v3.\n * @return {Action}\n */\nfunction getSubmissionInformationDone(challengeId, submissionId, tokenV3) {\n var filter = { challengeId: challengeId };\n var submissionsService = (0, _submissions.getService)(tokenV3);\n\n return getAll(function (params) {\n return submissionsService.getSubmissions(filter, params);\n }, 1, 500).then(function (submissions) {\n var submission = _lodash2.default.find(submissions, { id: submissionId });\n _lodash2.default.remove(submission.review, function (review) {\n return review.typeId === {\"AV_SCAN_SCORER_REVIEW_TYPE_ID\":\"68c5a381-c8ab-48af-92a7-7a869a4ee6c3\",\"PROVISIONAL_SCORING_COMPLETED_REVIEW_TYPE_ID\":\"52c91e85-745f-4e62-b592-9879a2dfe9fd\",\"PAGE_SIZE\":50,\"REVIEW_OPPORTUNITY_PAGE_SIZE\":1000,\"CHALLENGE_APP_VERSION\":\"1.1.0\"}.AV_SCAN_SCORER_REVIEW_TYPE_ID;\n });\n return { submissionId: submissionId, submission: submission };\n });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of fetching challenge statistics\n * @return {Action}\n */\nfunction fetchChallengeStatisticsInit() {}\n\n/**\n * @static\n * @desc Creates an action that gets challenge statistics from the backend.\n * @param {String} challengeId The challenge id\n * @param {String} tokenV3 Topcoder auth token v3.\n * @return {Action}\n */\nfunction fetchChallengeStatisticsDone(challengeId, tokenV3) {\n var challengeService = (0, _challenges.getService)(tokenV3);\n return challengeService.getChallengeStatistics(challengeId);\n}\n\nvar _default = (0, _reduxActions.createActions)({\n CHALLENGE: {\n DROP_CHECKPOINTS: dropCheckpoints,\n DROP_RESULTS: dropResults,\n FETCH_CHECKPOINTS_INIT: fetchCheckpointsInit,\n FETCH_CHECKPOINTS_DONE: fetchCheckpointsDone,\n GET_DETAILS_INIT: getDetailsInit,\n GET_DETAILS_DONE: getDetailsDone,\n GET_SUBMISSIONS_INIT: getSubmissionsInit,\n GET_SUBMISSIONS_DONE: getSubmissionsDone,\n LOAD_RESULTS_INIT: loadResultsInit,\n LOAD_RESULTS_DONE: loadResultsDone,\n REGISTER_INIT: registerInit,\n REGISTER_DONE: registerDone,\n TOGGLE_CHECKPOINT_FEEDBACK: toggleCheckpointFeedback,\n UNREGISTER_INIT: unregisterInit,\n UNREGISTER_DONE: unregisterDone,\n UPDATE_CHALLENGE_INIT: updateChallengeInit,\n UPDATE_CHALLENGE_DONE: updateChallengeDone,\n GET_ACTIVE_CHALLENGES_COUNT_INIT: getActiveChallengesCountInit,\n GET_ACTIVE_CHALLENGES_COUNT_DONE: getActiveChallengesCountDone,\n GET_MM_SUBMISSIONS_INIT: getMMSubmissionsInit,\n GET_MM_SUBMISSIONS_DONE: getMMSubmissionsDone,\n GET_SUBMISSION_INFORMATION_INIT: getSubmissionInformationInit,\n GET_SUBMISSION_INFORMATION_DONE: getSubmissionInformationDone,\n FETCH_CHALLENGE_STATISTICS_INIT: fetchChallengeStatisticsInit,\n FETCH_CHALLENGE_STATISTICS_DONE: fetchChallengeStatisticsDone\n }\n});\n\nexports.default = _default;\n;\n\n(function () {\n var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n if (!reactHotLoader) {\n return;\n }\n\n reactHotLoader.register(PAGE_SIZE, 'PAGE_SIZE', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(getAll, 'getAll', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(dropCheckpoints, 'dropCheckpoints', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(dropResults, 'dropResults', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(getDetailsInit, 'getDetailsInit', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(getDetailsDone, 'getDetailsDone', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(getSubmissionsInit, 'getSubmissionsInit', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(getSubmissionsDone, 'getSubmissionsDone', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(getMMSubmissionsInit, 'getMMSubmissionsInit', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(getMMSubmissionsDone, 'getMMSubmissionsDone', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(registerInit, 'registerInit', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(registerDone, 'registerDone', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(unregisterInit, 'unregisterInit', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(unregisterDone, 'unregisterDone', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(loadResultsInit, 'loadResultsInit', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(loadResultsDone, 'loadResultsDone', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(fetchCheckpointsInit, 'fetchCheckpointsInit', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(fetchCheckpointsDone, 'fetchCheckpointsDone', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(toggleCheckpointFeedback, 'toggleCheckpointFeedback', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(updateChallengeInit, 'updateChallengeInit', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(updateChallengeDone, 'updateChallengeDone', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(getActiveChallengesCountInit, 'getActiveChallengesCountInit', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(getActiveChallengesCountDone, 'getActiveChallengesCountDone', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(getSubmissionInformationInit, 'getSubmissionInformationInit', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(getSubmissionInformationDone, 'getSubmissionInformationDone', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(fetchChallengeStatisticsInit, 'fetchChallengeStatisticsInit', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(fetchChallengeStatisticsDone, 'fetchChallengeStatisticsDone', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(_default, 'default', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n})();\n\n;\n\n(function () {\n var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/actions/challenge.js?"); +eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _topcoderReactUtils = __webpack_require__(/*! topcoder-react-utils */ \"topcoder-react-utils\");\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _tcAuthLib = __webpack_require__(/*! @topcoder-platform/tc-auth-lib */ \"@topcoder-platform/tc-auth-lib\");\n\nvar _challenges = __webpack_require__(/*! ../services/challenges */ \"./src/services/challenges.js\");\n\nvar _submissions = __webpack_require__(/*! ../services/submissions */ \"./src/services/submissions.js\");\n\nvar _submission = __webpack_require__(/*! ../utils/submission */ \"./src/utils/submission.js\");\n\nvar submissionUtil = _interopRequireWildcard(_submission);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n return a;\n}; /**\n * @module \"actions.challenge\"\n * @desc Actions related to Topcoder challenges APIs.\n */\n\n/* global CONFIG */\n\n// import { getApi } from '../services/api';\n\n\nvar _CONFIG = {\"AV_SCAN_SCORER_REVIEW_TYPE_ID\":\"1297f2db-687d-4ac8-bf9c-78b6df1b1281\",\"PROVISIONAL_SCORING_COMPLETED_REVIEW_TYPE_ID\":\"52c91e85-745f-4e62-b592-9879a2dfe9fd\",\"PAGE_SIZE\":50,\"REVIEW_OPPORTUNITY_PAGE_SIZE\":1000,\"CHALLENGE_APP_VERSION\":\"1.1.0\"},\n PAGE_SIZE = _CONFIG.PAGE_SIZE;\n\n/**\n * Private. Loads from the backend all data matching some conditions.\n * @param {Function} getter Given params object of shape { limit, offset }\n * loads from the backend at most \"limit\" data, skipping the first\n * \"offset\" ones. Returns loaded data as an array.\n * @param {Number} page Optional. Next page of data to load.\n * @param {Number} perPage Optional. The size of the page content to load.\n * @param {Array} prev Optional. data loaded so far.\n */\n\nfunction getAll(getter) {\n var page = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n var perPage = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : PAGE_SIZE;\n var prev = arguments[3];\n\n /* Amount of submissions to fetch in one API call. 50 is the current maximum\n * amount of submissions the backend returns, event when the larger limit is\n * explicitely required. */\n return getter({\n page: page,\n perPage: perPage\n }).then(function (res) {\n if (res.length === 0) {\n return prev || res;\n }\n // parse submissions\n var current = [];\n if (prev) {\n current = prev.concat(res);\n } else {\n current = res;\n }\n return getAll(getter, 1 + page, perPage, current);\n });\n}\n\n/**\n * @static\n * @desc Creates an action that drops from Redux store all checkpoints loaded\n * before.\n * @return {Action}\n */\nfunction dropCheckpoints() {}\n\n/**\n * @static\n * @desc Creates an action that drops from Redux store all challenge results\n * loaded before.\n * @return {Action}\n */\nfunction dropResults() {}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of challenge details loading.\n * @param {Number|String} challengeId Challenge ID\n * @return {Action}\n */\nfunction getDetailsInit(challengeId) {\n return _lodash2.default.toString(challengeId);\n}\n\n/**\n * @static\n * @desc Creates an action that loads challenge details.\n * @param {Number|String} challengeId Challenge ID.\n * @param {String} tokenV3 Topcoder v3 auth token.\n * @param {String} tokenV2 Topcoder v2 auth token.\n * @return {Action}\n */\nfunction getDetailsDone(challengeId, tokenV3, tokenV2) {\n var service = (0, _challenges.getService)(tokenV3, tokenV2);\n var v3Promise = service.getChallengeDetails(challengeId);\n return v3Promise;\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of user submissions loading.\n * @param {String} challengeId Challenge ID.\n * @return {Action}\n */\nfunction getSubmissionsInit(challengeId) {\n /* As a safeguard, we enforce challengeId to be string (in case somebody\n * passes in a number, by mistake). */\n return _lodash2.default.toString(challengeId);\n}\n\n/**\n * @static\n * @desc Creates an action that loads user's submissions to the specified\n * challenge.\n * @param {String} challengeId Challenge ID.\n * @param {String} tokenV3 Topcoder auth token v3.\n * @return {Action}\n */\nfunction getSubmissionsDone(challengeId, tokenV3) {\n var user = (0, _tcAuthLib.decodeToken)(tokenV3);\n var submissionsService = (0, _submissions.getService)(tokenV3);\n var filters = {\n challengeId: challengeId,\n memberId: user.userId\n };\n return submissionsService.getSubmissions(filters).then(function (submissions) {\n return {\n challengeId: _lodash2.default.toString(challengeId),\n submissions: submissions\n };\n }).catch(function (error) {\n var err = { challengeId: _lodash2.default.toString(challengeId), error: error };\n throw err;\n });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of Marathon Match submissions loading.\n * @param {String} challengeId Challenge ID.\n * @return {Action}\n */\nfunction getMMSubmissionsInit(challengeId) {\n /* As a safeguard, we enforce challengeId to be string (in case somebody\n * passes in a number, by mistake). */\n return _lodash2.default.toString(challengeId);\n}\n\n/**\n * @static\n * @desc Creates an action that loads Marathon Match submissions to the specified\n * challenge.\n * @param {String} challengeId Challenge ID.\n * @param {Array} registrants The array of register.\n * @param {String} tokenV3 Topcoder auth token v3.\n * @return {Action}\n */\nfunction getMMSubmissionsDone(challengeId, tokenV3) {\n var filter = { challengeId: challengeId };\n var submissionsService = (0, _submissions.getService)(tokenV3);\n\n // TODO: Move those numbers to configs\n return getAll(function (params) {\n return submissionsService.getSubmissions(filter, params);\n }, 1, 500).then(function (submissions) {\n var finalSubmissions = submissionUtil.processMMSubmissions(submissions);\n return {\n challengeId: challengeId,\n submissions: finalSubmissions,\n tokenV3: tokenV3\n };\n });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of registration for a\n * challenge.\n * @return {Action}\n */\nfunction registerInit() {}\n\n/**\n * @static\n * @desc Creates an action that registers user for a challenge.\n * @param {Object} auth An object that holds auth tokens. You can directly pass\n * here the `auth` segment of Redux store.\n * @param [auth.tokenV2]{String} Topcoder auth token v2.\n * @param [auth.tokenV3]{String} Topcoder auth token v3.\n * @param {String} challengeId Challenge ID.\n * @return {Action}\n */\nfunction registerDone(auth, challengeId) {\n return (0, _challenges.getService)(auth.tokenV3).register(challengeId)\n /* As a part of registration flow we silently update challenge details,\n * reusing for this purpose the corresponding action handler. */\n // Uses a delay to allow API time to update\n .then(function () {\n return new _promise2.default(function (resolve) {\n return setTimeout(function () {\n return resolve(getDetailsDone(challengeId, auth.tokenV3, auth.tokenV2));\n }, _topcoderReactUtils.config.CHALLENGE_DETAILS_REFRESH_DELAY);\n });\n });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of user unregistration from a\n * challenge.\n * @return {Action}\n */\nfunction unregisterInit() {}\n\n/**\n * @static\n * @desc Creates an action that unregisters user from a challenge.\n * @param {Object} auth Object that holds Topcoder auth tokens.\n * @param {String} [auth.tokenV2] v2 token.\n * @param {String} [auth.tokenV3] v3 token.\n * @param {String} challengeId Challenge ID.\n * @return {Action}\n */\nfunction unregisterDone(auth, challengeId) {\n return (0, _challenges.getService)(auth.tokenV3).unregister(challengeId)\n /* As a part of unregistration flow we silently update challenge details,\n * reusing for this purpose the corresponding action handler. */\n // Uses a delay to allow API time to update\n .then(function () {\n return new _promise2.default(function (resolve) {\n return setTimeout(function () {\n return resolve(getDetailsDone(challengeId, auth.tokenV3, auth.tokenV2));\n }, _topcoderReactUtils.config.CHALLENGE_DETAILS_REFRESH_DELAY);\n });\n });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of challenge results loading.\n * @param {Number|String} challengeId Challenge ID\n * @return {Action}\n */\nfunction loadResultsInit(challengeId) {\n return _lodash2.default.toString(challengeId);\n}\n\n/**\n * @static\n * @desc Creates an action that loads challenge results.\n * @param {String} challengeId The challenge id\n * @param {String} tokenV3 Topcoder auth token v3.\n * @return {Action}\n */\nfunction loadResultsDone(challengeId, tokenV3) {\n var service = (0, _challenges.getService)(tokenV3);\n return service.getChallengeDetails(challengeId).then(function (response) {\n return {\n challengeId: challengeId,\n results: response.winners\n };\n });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of challenge checkpoints data\n * loading.\n * @return {Action}\n */\nfunction fetchCheckpointsInit() {}\n\n/**\n * @static\n * @desc Creates an action that loads challenge checkpoints data.\n * @param {String} tokenV2 Topcoder v2 auth token.\n * @param {String} challengeId Challenge ID.\n */\nfunction fetchCheckpointsDone(tokenV2, challengeId) {\n // const endpoint = `/design/challenges/checkpoint/${challengeId}`;\n // return getApi('V2').fetch(endpoint)\n // .then((response) => {\n // if (response.status !== 200) {\n // throw response.status;\n // } else {\n // return response.json();\n // }\n // })\n // .then((response) => {\n // // Expanded key is used for UI expand/collapse.\n // response.checkpointResults.forEach((checkpoint, index) => {\n // response.checkpointResults[index].expanded = false;\n // });\n // return {\n // challengeId: String(challengeId),\n // checkpoints: response,\n // };\n // })\n // .catch(error => ({\n // error,\n // challengeId: String(challengeId),\n // }));\n\n return _promise2.default.resolve({\n challengeId: String(challengeId),\n checkpoints: {\n checkpointResults: []\n }\n });\n}\n\n/**\n * @static\n * @desc Creates an action that Toggles checkpoint details panel in the Topcoder\n * Submission Management Page.\n * @todo This is UI action relevant to a specific page in specific app. Must be\n * moved back to Community App.\n * @param {Number} id Checkpoint ID.\n * @param {Boolean} open Target state: `true` to expand, `false` to collapse the\n * details.\n * @return {Action}\n */\nfunction toggleCheckpointFeedback(id, open) {\n return { id: id, open: open };\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of challenge details update.\n * @todo No idea, why we have this action. This functionality should be covered\n * by {@link module:actions.challenge.getDetailsInit} and\n * {@link module:actions.challenge.getDetailsDone}. We need to refactor this.\n * @param {String} uuid UUID of the operation (the same should be passed into\n * the corresponding {@link module:actions.challenge.updateChallengeDone}).\n * @return {Action}\n */\nfunction updateChallengeInit(uuid) {\n return uuid;\n}\n\n/**\n * @static\n * @desc Creates an action that updates challenge details.\n * @todo No idea, why we have this action. This functionality should be covered\n * by {@link module:actions.challenge.getDetailsInit} and\n * {@link module:actions.challenge.getDetailsDone}. We need to refactor this.\n * @param {String} uuid Operation UUID. Should match the one passed into the\n * previous {@link module:actions.challenge.updateChallengeInit} call.\n * @param {Object} challenge Challenge data.\n * @param {String} tokenV3 Topcoder v3 auth token.\n * @return {Action}\n */\nfunction updateChallengeDone(uuid, challenge, tokenV3) {\n return (0, _challenges.getService)(tokenV3).updateChallenge(challenge).then(function (res) {\n return { uuid: uuid, res: res };\n });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of getting count of user's active challenges.\n * @return {Action}\n */\nfunction getActiveChallengesCountInit() {}\n\n/**\n * @static\n * @desc Creates an action that gets count of user's active challenges from the backend.\n * @param {String} handle Topcoder user handle.\n * @param {String} tokenV3 Optional. Topcoder auth token v3. Without token only\n * public challenges will be counted. With the token provided, the action will\n * also count private challenges related to this user.\n * @return {Action}\n */\nfunction getActiveChallengesCountDone(handle, tokenV3) {\n return (0, _challenges.getService)(tokenV3).getActiveChallengesCount(handle);\n}\n\n/**\n * @static\n * @desc Creates an action that gets submission information by submission id\n * @param {String} submissionId The submission id\n * @return {Action}\n */\nfunction getSubmissionInformationInit(challengeId, submissionId) {\n return { challengeId: _lodash2.default.toString(challengeId), submissionId: _lodash2.default.toString(submissionId) };\n}\n\n/**\n * @static\n * @desc Creates an action that gets submission information from the backend.\n * @param {String} submissionId The submission id\n * @param {String} tokenV3 Topcoder auth token v3.\n * @return {Action}\n */\nfunction getSubmissionInformationDone(challengeId, submissionId, tokenV3) {\n var filter = { challengeId: challengeId };\n var submissionsService = (0, _submissions.getService)(tokenV3);\n\n return getAll(function (params) {\n return submissionsService.getSubmissions(filter, params);\n }, 1, 500).then(function (submissions) {\n var submission = _lodash2.default.find(submissions, { id: submissionId });\n _lodash2.default.remove(submission.review, function (review) {\n return review.typeId === {\"AV_SCAN_SCORER_REVIEW_TYPE_ID\":\"1297f2db-687d-4ac8-bf9c-78b6df1b1281\",\"PROVISIONAL_SCORING_COMPLETED_REVIEW_TYPE_ID\":\"52c91e85-745f-4e62-b592-9879a2dfe9fd\",\"PAGE_SIZE\":50,\"REVIEW_OPPORTUNITY_PAGE_SIZE\":1000,\"CHALLENGE_APP_VERSION\":\"1.1.0\"}.AV_SCAN_SCORER_REVIEW_TYPE_ID;\n });\n return { submissionId: submissionId, submission: submission };\n });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of fetching challenge statistics\n * @return {Action}\n */\nfunction fetchChallengeStatisticsInit() {}\n\n/**\n * @static\n * @desc Creates an action that gets challenge statistics from the backend.\n * @param {String} challengeId The challenge id\n * @param {String} tokenV3 Topcoder auth token v3.\n * @return {Action}\n */\nfunction fetchChallengeStatisticsDone(challengeId, tokenV3) {\n var challengeService = (0, _challenges.getService)(tokenV3);\n return challengeService.getChallengeStatistics(challengeId);\n}\n\nvar _default = (0, _reduxActions.createActions)({\n CHALLENGE: {\n DROP_CHECKPOINTS: dropCheckpoints,\n DROP_RESULTS: dropResults,\n FETCH_CHECKPOINTS_INIT: fetchCheckpointsInit,\n FETCH_CHECKPOINTS_DONE: fetchCheckpointsDone,\n GET_DETAILS_INIT: getDetailsInit,\n GET_DETAILS_DONE: getDetailsDone,\n GET_SUBMISSIONS_INIT: getSubmissionsInit,\n GET_SUBMISSIONS_DONE: getSubmissionsDone,\n LOAD_RESULTS_INIT: loadResultsInit,\n LOAD_RESULTS_DONE: loadResultsDone,\n REGISTER_INIT: registerInit,\n REGISTER_DONE: registerDone,\n TOGGLE_CHECKPOINT_FEEDBACK: toggleCheckpointFeedback,\n UNREGISTER_INIT: unregisterInit,\n UNREGISTER_DONE: unregisterDone,\n UPDATE_CHALLENGE_INIT: updateChallengeInit,\n UPDATE_CHALLENGE_DONE: updateChallengeDone,\n GET_ACTIVE_CHALLENGES_COUNT_INIT: getActiveChallengesCountInit,\n GET_ACTIVE_CHALLENGES_COUNT_DONE: getActiveChallengesCountDone,\n GET_MM_SUBMISSIONS_INIT: getMMSubmissionsInit,\n GET_MM_SUBMISSIONS_DONE: getMMSubmissionsDone,\n GET_SUBMISSION_INFORMATION_INIT: getSubmissionInformationInit,\n GET_SUBMISSION_INFORMATION_DONE: getSubmissionInformationDone,\n FETCH_CHALLENGE_STATISTICS_INIT: fetchChallengeStatisticsInit,\n FETCH_CHALLENGE_STATISTICS_DONE: fetchChallengeStatisticsDone\n }\n});\n\nexports.default = _default;\n;\n\n(function () {\n var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n if (!reactHotLoader) {\n return;\n }\n\n reactHotLoader.register(PAGE_SIZE, 'PAGE_SIZE', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(getAll, 'getAll', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(dropCheckpoints, 'dropCheckpoints', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(dropResults, 'dropResults', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(getDetailsInit, 'getDetailsInit', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(getDetailsDone, 'getDetailsDone', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(getSubmissionsInit, 'getSubmissionsInit', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(getSubmissionsDone, 'getSubmissionsDone', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(getMMSubmissionsInit, 'getMMSubmissionsInit', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(getMMSubmissionsDone, 'getMMSubmissionsDone', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(registerInit, 'registerInit', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(registerDone, 'registerDone', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(unregisterInit, 'unregisterInit', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(unregisterDone, 'unregisterDone', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(loadResultsInit, 'loadResultsInit', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(loadResultsDone, 'loadResultsDone', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(fetchCheckpointsInit, 'fetchCheckpointsInit', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(fetchCheckpointsDone, 'fetchCheckpointsDone', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(toggleCheckpointFeedback, 'toggleCheckpointFeedback', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(updateChallengeInit, 'updateChallengeInit', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(updateChallengeDone, 'updateChallengeDone', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(getActiveChallengesCountInit, 'getActiveChallengesCountInit', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(getActiveChallengesCountDone, 'getActiveChallengesCountDone', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(getSubmissionInformationInit, 'getSubmissionInformationInit', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(getSubmissionInformationDone, 'getSubmissionInformationDone', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(fetchChallengeStatisticsInit, 'fetchChallengeStatisticsInit', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(fetchChallengeStatisticsDone, 'fetchChallengeStatisticsDone', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n reactHotLoader.register(_default, 'default', '/Users/hentrymartin/development/topcoder-react-lib/src/actions/challenge.js');\n})();\n\n;\n\n(function () {\n var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/actions/challenge.js?"); /***/ }), @@ -982,7 +982,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex /***/ (function(module, exports, __webpack_require__) { "use strict"; -eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.ORDER_BY = undefined;\n\nvar _stringify = __webpack_require__(/*! babel-runtime/core-js/json/stringify */ \"babel-runtime/core-js/json/stringify\");\n\nvar _stringify2 = _interopRequireDefault(_stringify);\n\nvar _extends2 = __webpack_require__(/*! babel-runtime/helpers/extends */ \"babel-runtime/helpers/extends\");\n\nvar _extends3 = _interopRequireDefault(_extends2);\n\nvar _classCallCheck2 = __webpack_require__(/*! babel-runtime/helpers/classCallCheck */ \"babel-runtime/helpers/classCallCheck\");\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = __webpack_require__(/*! babel-runtime/helpers/createClass */ \"babel-runtime/helpers/createClass\");\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nvar _regenerator = __webpack_require__(/*! babel-runtime/regenerator */ \"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = __webpack_require__(/*! babel-runtime/helpers/asyncToGenerator */ \"babel-runtime/helpers/asyncToGenerator\");\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\nvar _defineProperty2 = __webpack_require__(/*! babel-runtime/helpers/defineProperty */ \"babel-runtime/helpers/defineProperty\");\n\nvar _defineProperty3 = _interopRequireDefault(_defineProperty2);\n\nvar _set = __webpack_require__(/*! babel-runtime/core-js/set */ \"babel-runtime/core-js/set\");\n\nvar _set2 = _interopRequireDefault(_set);\n\n/**\n * Helper method that checks for HTTP error response and throws Error in this case.\n * @param {Object} res HTTP response object\n * @return {Object} API JSON response object\n * @private\n */\nvar checkError = function () {\n var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(res) {\n var jsonRes;\n return _regenerator2.default.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n if (res.ok) {\n _context.next = 3;\n break;\n }\n\n if (res.status >= 500) {\n (0, _errors.setErrorIcon)(_errors.ERROR_ICON_TYPES.API, '/challenges', res.statusText);\n }\n throw new Error(res.statusText);\n\n case 3:\n _context.next = 5;\n return res.json();\n\n case 5:\n jsonRes = _context.sent.result;\n\n if (!(jsonRes.status !== 200)) {\n _context.next = 8;\n break;\n }\n\n throw new Error(jsonRes.content);\n\n case 8:\n return _context.abrupt('return', jsonRes);\n\n case 9:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, this);\n }));\n\n return function checkError(_x) {\n return _ref2.apply(this, arguments);\n };\n}();\n\n/**\n * Helper method that checks for HTTP error response v5 and throws Error in this case.\n * @param {Object} res HTTP response object\n * @return {Object} API JSON response object\n * @private\n */\n\n\nvar checkErrorV5 = function () {\n var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(res) {\n var jsonRes;\n return _regenerator2.default.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n if (res.ok) {\n _context2.next = 3;\n break;\n }\n\n if (res.status >= 500) {\n (0, _errors.setErrorIcon)(_errors.ERROR_ICON_TYPES.API, '/challenges', res.statusText);\n }\n throw new Error(!res.statusText && res.status === 403 ? 'Forbidden' : res.statusText);\n\n case 3:\n _context2.next = 5;\n return res.json();\n\n case 5:\n jsonRes = _context2.sent;\n\n if (!jsonRes.message) {\n _context2.next = 8;\n break;\n }\n\n throw new Error(res.message);\n\n case 8:\n return _context2.abrupt('return', {\n result: jsonRes,\n headers: res.headers\n });\n\n case 9:\n case 'end':\n return _context2.stop();\n }\n }\n }, _callee2, this);\n }));\n\n return function checkErrorV5(_x2) {\n return _ref3.apply(this, arguments);\n };\n}();\n\n/**\n * Challenge service.\n */\n\n\nexports.getFilterUrl = getFilterUrl;\nexports.normalizeChallenge = normalizeChallenge;\nexports.getService = getService;\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _moment = __webpack_require__(/*! moment */ \"moment\");\n\nvar _moment2 = _interopRequireDefault(_moment);\n\nvar _qs = __webpack_require__(/*! qs */ \"qs\");\n\nvar _qs2 = _interopRequireDefault(_qs);\n\nvar _tcAuthLib = __webpack_require__(/*! @topcoder-platform/tc-auth-lib */ \"@topcoder-platform/tc-auth-lib\");\n\nvar _logger = __webpack_require__(/*! ../utils/logger */ \"./src/utils/logger.js\");\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar _errors = __webpack_require__(/*! ../utils/errors */ \"./src/utils/errors.js\");\n\nvar _tc = __webpack_require__(/*! ../utils/tc */ \"./src/utils/tc.js\");\n\nvar _api = __webpack_require__(/*! ./api */ \"./src/services/api.js\");\n\nvar _members = __webpack_require__(/*! ./members */ \"./src/services/members.js\");\n\nvar _submissions = __webpack_require__(/*! ./submissions */ \"./src/services/submissions.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n return a;\n}; /**\n * @module \"services.challenges\"\n * @desc This module provides a service for convenient manipulation with\n * Topcoder challenges via TC API.\n */\n\n/* global CONFIG */\n\n\nvar _CONFIG = {\"AV_SCAN_SCORER_REVIEW_TYPE_ID\":\"68c5a381-c8ab-48af-92a7-7a869a4ee6c3\",\"PROVISIONAL_SCORING_COMPLETED_REVIEW_TYPE_ID\":\"52c91e85-745f-4e62-b592-9879a2dfe9fd\",\"PAGE_SIZE\":50,\"REVIEW_OPPORTUNITY_PAGE_SIZE\":1000,\"CHALLENGE_APP_VERSION\":\"1.1.0\"},\n CHALLENGE_APP_VERSION = _CONFIG.CHALLENGE_APP_VERSION;\nfunction getFilterUrl(backendFilter, frontFilter) {\n var ff = _lodash2.default.clone(frontFilter);\n // eslint-disable-next-line object-curly-newline\n var tags = ff.tags,\n tracks = ff.tracks,\n types = ff.types,\n groups = ff.groups,\n events = ff.events;\n\n delete ff.tags;\n delete ff.tracks;\n delete ff.types;\n delete ff.communityId;\n delete ff.groups;\n delete ff.events;\n\n // console.log(ff);\n\n var urlFilter = _qs2.default.stringify(_lodash2.default.reduce(ff, function (result, value, key) {\n // eslint-disable-next-line no-param-reassign\n if (value) result[key] = value;\n return result;\n }, {}));\n // console.log(urlFilter);\n\n var ftags = _lodash2.default.map(tags, function (val) {\n return 'tags[]=' + val;\n }).join('&');\n var ftracks = _lodash2.default.map(_lodash2.default.reduce(tracks, function (result, value, key) {\n // eslint-disable-next-line no-unused-expressions\n tracks[key] && result.push(key);\n return result;\n }, []), function (val) {\n return 'tracks[]=' + val;\n }).join('&');\n var ftypes = _lodash2.default.map(types, function (val) {\n return 'types[]=' + val;\n }).join('&');\n var fgroups = _lodash2.default.map(groups, function (val) {\n return 'groups[]=' + val;\n }).join('&');\n var fevents = _lodash2.default.map(events, function (val) {\n return 'events[]=' + val;\n }).join('&');\n if (ftags.length > 0) urlFilter += '&' + ftags;\n if (ftracks.length > 0) urlFilter += '&' + ftracks;\n if (ftypes.length > 0) urlFilter += '&' + ftypes;\n if (fgroups.length > 9) urlFilter += '&' + fgroups;\n if (fevents.length > 0) urlFilter += '&' + fevents;\n return urlFilter;\n}\n\nvar ORDER_BY = exports.ORDER_BY = {\n SUBMISSION_END_DATE: 'submissionEndDate'\n};\n\n/**\n * Normalizes a regular challenge object received from the backend.\n * NOTE: This function is copied from the existing code in the challenge listing\n * component. It is possible, that this normalization is not necessary after we\n * have moved to Topcoder API, but it is kept for now to minimize a risk of\n * breaking anything.\n * @todo Should be used only internally!\n * @param {Object} challenge Challenge object received from the backend.\n * @param {String} username Optional.\n */\nfunction normalizeChallenge(challenge, username) {\n var phases = challenge.allPhases || challenge.phases || [];\n var registration = phases.filter(function (d) {\n return d.name === 'Registration';\n })[0];\n var registrationOpen = 'No';\n var registrationStartDate = void 0;\n var registrationEndDate = void 0;\n if (registration) {\n registrationStartDate = registration.actualStartDate || registration.scheduledStartDate;\n if (registration.isOpen) {\n registrationOpen = 'Yes';\n }\n registrationEndDate = registration.actualEndDate || registration.scheduledEndDate;\n }\n var groups = {};\n if (challenge.groups) {\n challenge.groups.forEach(function (id) {\n groups[id] = true;\n });\n }\n /* eslint-disable no-param-reassign */\n if (!challenge.prizeSets) challenge.prizeSets = [];\n if (!challenge.tags) challenge.tags = [];\n if (!challenge.platforms) challenge.platforms = [];\n\n var submissionEndTimestamp = phases.filter(function (d) {\n return d.name === 'Submission';\n })[0];\n if (submissionEndTimestamp) {\n submissionEndTimestamp = submissionEndTimestamp.scheduledEndDate;\n }\n var placementPrizes = _lodash2.default.find(challenge.prizeSets, { type: 'placement' });\n var prizes = _lodash2.default.get(placementPrizes, 'prizes', []);\n _lodash2.default.defaults(challenge, {\n communities: new _set2.default([_tc.COMPETITION_TRACKS[challenge.track]]),\n groups: groups,\n registrationOpen: registrationOpen,\n submissionEndTimestamp: submissionEndTimestamp,\n registrationStartDate: registrationStartDate,\n registrationEndDate: registrationEndDate,\n totalPrize: prizes.reduce(function (acc, prize) {\n return acc + prize.value;\n }, 0),\n submissionEndDate: submissionEndTimestamp,\n users: username ? (0, _defineProperty3.default)({}, username, true) : {}\n });\n}\nvar ChallengesService = function () {\n /**\n * Creates a new ChallengeService instance.\n * @param {String} tokenV3 Optional. Auth token for Topcoder API v3.\n * @param {String} tokenV2 Optional. Auth token for Topcoder API v2.\n */\n function ChallengesService(tokenV3, tokenV2) {\n var _this = this;\n\n (0, _classCallCheck3.default)(this, ChallengesService);\n\n /**\n * Private function being re-used in all methods related to getting\n * challenges. It handles query-related arguments in the uniform way:\n * @param {String} endpoint API endpoint, where the request will be send.\n * @param {Object} filters Optional. A map of filters to pass as `filter`\n * query parameter (this function takes care to stringify it properly).\n * @param {Object} params Optional. A map of any other parameters beside\n * `filter`.\n */\n var getChallenges = function () {\n var _ref4 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3(endpoint, filter) {\n var res, query, url, options;\n return _regenerator2.default.wrap(function _callee3$(_context3) {\n while (1) {\n switch (_context3.prev = _context3.next) {\n case 0:\n res = {};\n\n if (!(_lodash2.default.some(filter.frontFilter.tracks, function (val) {\n return val;\n }) && !_lodash2.default.isEqual(filter.frontFilter.types, []))) {\n _context3.next = 8;\n break;\n }\n\n query = getFilterUrl(filter.backendFilter, filter.frontFilter);\n url = endpoint + '?' + query;\n options = { headers: { 'app-version': CHALLENGE_APP_VERSION } };\n _context3.next = 7;\n return _this.private.apiV5.get(url, options).then(checkErrorV5);\n\n case 7:\n res = _context3.sent;\n\n case 8:\n return _context3.abrupt('return', {\n challenges: res.result || [],\n totalCount: res.headers ? res.headers.get('x-total') : 0,\n meta: {\n allChallengesCount: res.headers ? res.headers.get('x-total') : 0,\n allRecommendedChallengesCount: 0,\n myChallengesCount: 0,\n ongoingChallengesCount: 0,\n openChallengesCount: 0,\n totalCount: res.headers ? res.headers.get('x-total') : 0\n }\n });\n\n case 9:\n case 'end':\n return _context3.stop();\n }\n }\n }, _callee3, _this);\n }));\n\n return function getChallenges(_x3, _x4) {\n return _ref4.apply(this, arguments);\n };\n }();\n\n var getChallengeDetails = function () {\n var _ref5 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee4(endpoint, legacyInfo) {\n var query, url, options, res;\n return _regenerator2.default.wrap(function _callee4$(_context4) {\n while (1) {\n switch (_context4.prev = _context4.next) {\n case 0:\n query = '';\n\n if (legacyInfo) {\n query = 'legacyId=' + legacyInfo.legacyId;\n }\n url = endpoint + '?' + query;\n options = { headers: { 'app-version': CHALLENGE_APP_VERSION } };\n _context4.next = 6;\n return _this.private.apiV5.get(url, options).then(checkErrorV5);\n\n case 6:\n res = _context4.sent;\n return _context4.abrupt('return', {\n challenges: res.result || []\n });\n\n case 8:\n case 'end':\n return _context4.stop();\n }\n }\n }, _callee4, _this);\n }));\n\n return function getChallengeDetails(_x5, _x6) {\n return _ref5.apply(this, arguments);\n };\n }();\n\n /**\n * Private function being re-used in all methods related to getting\n * challenges. It handles query-related arguments in the uniform way:\n * @param {String} endpoint API endpoint, where the request will be send.\n * @param {Object} filters Optional. A map of filters to pass as `filter`\n * query parameter (this function takes care to stringify it properly).\n * @param {Object} params Optional. A map of any other parameters beside\n * `filter`.\n */\n var getMemberChallenges = function () {\n var _ref6 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee5(endpoint) {\n var filters = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var memberId, query, url, options, res, totalCount;\n return _regenerator2.default.wrap(function _callee5$(_context5) {\n while (1) {\n switch (_context5.prev = _context5.next) {\n case 0:\n memberId = (0, _tcAuthLib.decodeToken)(_this.private.tokenV3).userId;\n query = (0, _extends3.default)({}, params, filters, {\n memberId: memberId\n });\n url = endpoint + '?' + _qs2.default.stringify(_lodash2.default.omit(query, ['limit', 'offset', 'technologies']));\n options = { headers: { 'app-version': CHALLENGE_APP_VERSION } };\n _context5.next = 6;\n return _this.private.apiV5.get(url, options).then(checkError);\n\n case 6:\n res = _context5.sent;\n totalCount = res.length;\n return _context5.abrupt('return', {\n challenges: res || [],\n totalCount: totalCount\n });\n\n case 9:\n case 'end':\n return _context5.stop();\n }\n }\n }, _callee5, _this);\n }));\n\n return function getMemberChallenges(_x7) {\n return _ref6.apply(this, arguments);\n };\n }();\n\n this.private = {\n api: (0, _api.getApi)('V4', tokenV3),\n apiV5: (0, _api.getApi)('V5', tokenV3),\n apiV2: (0, _api.getApi)('V2', tokenV2),\n apiV3: (0, _api.getApi)('V3', tokenV3),\n getChallenges: getChallenges,\n getChallengeDetails: getChallengeDetails,\n getMemberChallenges: getMemberChallenges,\n tokenV2: tokenV2,\n tokenV3: tokenV3,\n memberService: (0, _members.getService)(),\n submissionsService: (0, _submissions.getService)(tokenV3)\n };\n }\n\n /**\n * Gets challenge statistics.\n * @param {Number} challengeId\n * @return {Promise} The array of statistics\n */\n\n\n (0, _createClass3.default)(ChallengesService, [{\n key: 'getChallengeStatistics',\n value: function () {\n var _ref7 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee6(challengeId) {\n return _regenerator2.default.wrap(function _callee6$(_context6) {\n while (1) {\n switch (_context6.prev = _context6.next) {\n case 0:\n return _context6.abrupt('return', this.private.apiV5.get('/challenges/' + challengeId + '/statistics').then(function (res) {\n return res.ok ? res.json() : new Error(res.statusText);\n }).then(function (res) {\n return res.message ? new Error(res.message) : res;\n }));\n\n case 1:\n case 'end':\n return _context6.stop();\n }\n }\n }, _callee6, this);\n }));\n\n function getChallengeStatistics(_x10) {\n return _ref7.apply(this, arguments);\n }\n\n return getChallengeStatistics;\n }()\n\n /**\n * Activates the specified challenge.\n * @param {Number} challengeId\n * @return {Promise} Resolves to null value in case of success; otherwise it\n * is rejected.\n */\n\n }, {\n key: 'activate',\n value: function () {\n var _ref8 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee7(challengeId) {\n var params, res;\n return _regenerator2.default.wrap(function _callee7$(_context7) {\n while (1) {\n switch (_context7.prev = _context7.next) {\n case 0:\n params = {\n status: 'Active'\n };\n _context7.next = 3;\n return this.private.apiV5.patch('/challenge/' + challengeId, params);\n\n case 3:\n res = _context7.sent;\n\n if (res.ok) {\n _context7.next = 6;\n break;\n }\n\n throw new Error(res.statusText);\n\n case 6:\n _context7.next = 8;\n return res.json();\n\n case 8:\n res = _context7.sent.result;\n\n if (!(res.status !== 200)) {\n _context7.next = 11;\n break;\n }\n\n throw new Error(res.content);\n\n case 11:\n return _context7.abrupt('return', res.content);\n\n case 12:\n case 'end':\n return _context7.stop();\n }\n }\n }, _callee7, this);\n }));\n\n function activate(_x11) {\n return _ref8.apply(this, arguments);\n }\n\n return activate;\n }()\n\n /**\n * Closes the specified challenge.\n * @param {Number} challengeId\n * @return {Promise} Resolves to null value in case of success; otherwise it\n * is rejected.\n */\n\n }, {\n key: 'close',\n value: function () {\n var _ref9 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee8(challengeId) {\n var params, res;\n return _regenerator2.default.wrap(function _callee8$(_context8) {\n while (1) {\n switch (_context8.prev = _context8.next) {\n case 0:\n params = {\n status: 'Completed'\n };\n _context8.next = 3;\n return this.private.apiV5.patch('/challenges/' + challengeId, params);\n\n case 3:\n res = _context8.sent;\n\n if (res.ok) {\n _context8.next = 6;\n break;\n }\n\n throw new Error(res.statusText);\n\n case 6:\n _context8.next = 8;\n return res.json();\n\n case 8:\n res = _context8.sent.result;\n\n if (!(res.status !== 200)) {\n _context8.next = 11;\n break;\n }\n\n throw new Error(res.content);\n\n case 11:\n return _context8.abrupt('return', res.content);\n\n case 12:\n case 'end':\n return _context8.stop();\n }\n }\n }, _callee8, this);\n }));\n\n function close(_x12) {\n return _ref9.apply(this, arguments);\n }\n\n return close;\n }()\n\n /**\n * Creates a new payment task.\n * @param {Number} projectId\n * @param {Number} accountId Billing account ID.\n * @param {String} title\n * @param {String} description\n * @param {String} assignee\n * @param {Number} payment\n * @param {String} submissionGuidelines\n * @param {Number} copilotId\n * @param {Number} copilotFee\n * @param {?} tags\n * @return {Promise} Resolves to the created challenge object (payment task).\n */\n\n }, {\n key: 'createTask',\n value: function () {\n var _ref10 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee9(projectId, accountId, title, description, assignee, payment, submissionGuidelines, copilotId, copilotFee, tags) {\n var registrationPhase, payload, res;\n return _regenerator2.default.wrap(function _callee9$(_context9) {\n while (1) {\n switch (_context9.prev = _context9.next) {\n case 0:\n _context9.next = 2;\n return this.private.apiV5.get('/challenge-phases?name=Registration');\n\n case 2:\n registrationPhase = _context9.sent;\n payload = {\n param: {\n name: title,\n typeId: 'e885273d-aeda-42c0-917d-bfbf979afbba',\n description: description,\n legacy: {\n track: 'FIRST_2_FINISH',\n reviewType: 'INTERNAL',\n confidentialityType: 'public',\n billingAccountId: accountId\n },\n phases: [{\n phaseId: registrationPhase.id,\n scheduledEndDate: (0, _moment2.default)().toISOString()\n }],\n prizeSets: [{\n type: 'Challenge Prizes',\n description: 'Challenge Prize',\n prizes: [{\n value: payment,\n type: 'First Placement'\n }]\n }],\n tags: tags,\n projectId: projectId\n }\n };\n\n if (copilotId) {\n _lodash2.default.assign(payload.param, {\n copilotId: copilotId,\n copilotFee: copilotFee\n });\n }\n _context9.next = 7;\n return this.private.apiV5.postJson('/challenges', payload);\n\n case 7:\n res = _context9.sent;\n\n if (res.ok) {\n _context9.next = 10;\n break;\n }\n\n throw new Error(res.statusText);\n\n case 10:\n _context9.next = 12;\n return res.json();\n\n case 12:\n res = _context9.sent.result;\n\n if (!(res.status !== 200)) {\n _context9.next = 15;\n break;\n }\n\n throw new Error(res.content);\n\n case 15:\n return _context9.abrupt('return', res.content);\n\n case 16:\n case 'end':\n return _context9.stop();\n }\n }\n }, _callee9, this);\n }));\n\n function createTask(_x13, _x14, _x15, _x16, _x17, _x18, _x19, _x20, _x21, _x22) {\n return _ref10.apply(this, arguments);\n }\n\n return createTask;\n }()\n\n /**\n * Gets challenge details from Topcoder API.\n * NOTE: This function also uses API v2 and other endpoints for now, due\n * to some information is missing or\n * incorrect in the main endpoint. This may change in the future.\n * @param {Number|String} challengeId\n * @return {Promise} Resolves to the challenge object.\n */\n\n }, {\n key: 'getChallengeDetails',\n value: function () {\n var _ref11 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee10(challengeId) {\n var memberId, challenge, registrants, submissions, isLegacyChallenge, isRegistered, userDetails, subParams, reviewScans;\n return _regenerator2.default.wrap(function _callee10$(_context10) {\n while (1) {\n switch (_context10.prev = _context10.next) {\n case 0:\n memberId = this.private.tokenV3 ? (0, _tcAuthLib.decodeToken)(this.private.tokenV3).userId : null;\n challenge = {};\n registrants = [];\n submissions = [];\n isLegacyChallenge = false;\n isRegistered = false;\n userDetails = { roles: [] };\n\n // condition based on ROUTE used for Review Opportunities, change if needed\n\n if (!/^[\\d]{5,8}$/.test(challengeId)) {\n _context10.next = 14;\n break;\n }\n\n isLegacyChallenge = true;\n _context10.next = 11;\n return this.private.getChallengeDetails('/challenges/', { legacyId: challengeId }).then(function (res) {\n return res.challenges[0] || {};\n });\n\n case 11:\n challenge = _context10.sent;\n _context10.next = 17;\n break;\n\n case 14:\n _context10.next = 16;\n return this.private.getChallengeDetails('/challenges/' + challengeId).then(function (res) {\n return res.challenges;\n });\n\n case 16:\n challenge = _context10.sent;\n\n case 17:\n if (!challenge) {\n _context10.next = 38;\n break;\n }\n\n _context10.next = 20;\n return this.getChallengeRegistrants(challenge.id);\n\n case 20:\n registrants = _context10.sent;\n\n\n // This TEMP fix to colorStyle, this will be fixed with issue #4530\n registrants = _lodash2.default.map(registrants, function (r) {\n return (0, _extends3.default)({}, r, { colorStyle: 'color: #151516'\n });\n });\n\n /* Prepare data to logged user */\n\n if (!memberId) {\n _context10.next = 37;\n break;\n }\n\n isRegistered = _lodash2.default.some(registrants, function (r) {\n return '' + r.memberId === '' + memberId;\n });\n\n subParams = {\n challengeId: challengeId,\n perPage: 100\n };\n _context10.next = 27;\n return this.private.submissionsService.getSubmissions(subParams);\n\n case 27:\n submissions = _context10.sent;\n\n if (!submissions) {\n _context10.next = 34;\n break;\n }\n\n _context10.next = 31;\n return this.private.submissionsService.getScanReviewIds();\n\n case 31:\n reviewScans = _context10.sent;\n\n submissions.forEach(function (s, i) {\n submissions[i].review = _lodash2.default.reject(s.review, function (r) {\n return r && _lodash2.default.includes(reviewScans, r.typeId);\n });\n });\n\n // Add submission date to registrants\n registrants.forEach(function (r, i) {\n var submission = submissions.find(function (s) {\n return '' + s.memberId === '' + r.memberId;\n });\n if (submission) {\n registrants[i].submissionDate = submission.created;\n }\n });\n\n case 34:\n _context10.next = 36;\n return this.getUserRolesInChallenge(challengeId);\n\n case 36:\n userDetails.roles = _context10.sent;\n\n case 37:\n\n challenge = (0, _extends3.default)({}, challenge, {\n isLegacyChallenge: isLegacyChallenge,\n isRegistered: isRegistered,\n registrants: registrants,\n submissions: submissions,\n userDetails: userDetails,\n events: _lodash2.default.map(challenge.events, function (e) {\n return {\n eventName: e.key,\n eventId: e.id,\n description: e.name\n };\n }),\n fetchedWithAuth: Boolean(this.private.apiV5.private.token)\n });\n\n case 38:\n return _context10.abrupt('return', challenge);\n\n case 39:\n case 'end':\n return _context10.stop();\n }\n }\n }, _callee10, this);\n }));\n\n function getChallengeDetails(_x23) {\n return _ref11.apply(this, arguments);\n }\n\n return getChallengeDetails;\n }()\n\n /**\n * Gets challenge registrants from Topcoder API.\n * @param {Number|String} challengeId\n * @return {Promise} Resolves to the challenge registrants array.\n */\n\n }, {\n key: 'getChallengeRegistrants',\n value: function () {\n var _ref12 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee11(challengeId) {\n var roleId, params, registrants;\n return _regenerator2.default.wrap(function _callee11$(_context11) {\n while (1) {\n switch (_context11.prev = _context11.next) {\n case 0:\n if (!this.private.tokenV3) {\n _context11.next = 6;\n break;\n }\n\n _context11.next = 3;\n return this.getRoleId('Submitter');\n\n case 3:\n _context11.t0 = _context11.sent;\n _context11.next = 7;\n break;\n\n case 6:\n _context11.t0 = null;\n\n case 7:\n roleId = _context11.t0;\n params = {\n challengeId: challengeId,\n perPage: 5000\n };\n\n\n if (roleId) {\n params = (0, _extends3.default)({}, params, { roleId: roleId });\n }\n\n _context11.next = 12;\n return this.private.apiV5.get('/resources?' + _qs2.default.stringify(params)).then(checkErrorV5).then(function (res) {\n return res.result;\n });\n\n case 12:\n registrants = _context11.sent;\n\n\n /* API will return all roles to currentUser, so need to filter in FE */\n if (roleId) {\n registrants = _lodash2.default.filter(registrants, function (r) {\n return r.roleId === roleId;\n });\n }\n\n return _context11.abrupt('return', registrants || []);\n\n case 15:\n case 'end':\n return _context11.stop();\n }\n }\n }, _callee11, this);\n }));\n\n function getChallengeRegistrants(_x24) {\n return _ref12.apply(this, arguments);\n }\n\n return getChallengeRegistrants;\n }()\n\n /**\n * Gets possible challenge types.\n * @return {Promise} Resolves to the array of subtrack names.\n */\n\n }, {\n key: 'getChallengeTypes',\n value: function getChallengeTypes() {\n return this.private.apiV5.get('/challenge-types').then(function (res) {\n return res.ok ? res.json() : new Error(res.statusText);\n }).then(function (res) {\n return res.message ? new Error(res.message) : res;\n });\n }\n\n /**\n * Get the ID from a challenge type by abbreviation\n * @param {String} abbreviation\n * @return {Promise} ID from first abbreviation match\n */\n\n }, {\n key: 'getChallengeTypeId',\n value: function () {\n var _ref13 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee12(abbreviation) {\n var ret;\n return _regenerator2.default.wrap(function _callee12$(_context12) {\n while (1) {\n switch (_context12.prev = _context12.next) {\n case 0:\n _context12.next = 2;\n return this.private.apiV5.get('/challenge-types?abbreviation=' + abbreviation).then(checkErrorV5).then(function (res) {\n return res;\n });\n\n case 2:\n ret = _context12.sent;\n\n if (!_lodash2.default.isEmpty(ret.result)) {\n _context12.next = 5;\n break;\n }\n\n throw new Error('Challenge typeId not found!');\n\n case 5:\n return _context12.abrupt('return', ret.result[0].id);\n\n case 6:\n case 'end':\n return _context12.stop();\n }\n }\n }, _callee12, this);\n }));\n\n function getChallengeTypeId(_x25) {\n return _ref13.apply(this, arguments);\n }\n\n return getChallengeTypeId;\n }()\n\n /**\n * Gets possible challenge tags (technologies).\n * @return {Promise} Resolves to the array of tag strings.\n */\n\n }, {\n key: 'getChallengeTags',\n value: function getChallengeTags() {\n return this.private.api.get('/technologies').then(function (res) {\n return res.ok ? res.json() : new Error(res.statusText);\n }).then(function (res) {\n return res.result.status === 200 ? res.result.content : new Error(res.result.content);\n });\n }\n\n /**\n * Gets challenges.\n * @param {Object} filters Optional.\n * @param {Object} params Optional.\n * @return {Promise} Resolves to the api response.\n */\n\n }, {\n key: 'getChallenges',\n value: function () {\n var _ref14 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee13(filter) {\n return _regenerator2.default.wrap(function _callee13$(_context13) {\n while (1) {\n switch (_context13.prev = _context13.next) {\n case 0:\n return _context13.abrupt('return', this.private.getChallenges('/challenges/', filter).then(function (res) {\n res.challenges.forEach(function (item) {\n return normalizeChallenge(item);\n });\n return res;\n }));\n\n case 1:\n case 'end':\n return _context13.stop();\n }\n }\n }, _callee13, this);\n }));\n\n function getChallenges(_x26) {\n return _ref14.apply(this, arguments);\n }\n\n return getChallenges;\n }()\n\n /**\n * Gets challenges.\n * @param {Object} filters Optional.\n * @param {Object} params Optional.\n * @param {String} handle user handle\n * @return {Promise} Resolves to the api response.\n */\n\n }, {\n key: 'getRecommendedChallenges',\n value: function () {\n var _ref15 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee14(filter, handle) {\n var query, res, totalCount, url, options, challenges;\n return _regenerator2.default.wrap(function _callee14$(_context14) {\n while (1) {\n switch (_context14.prev = _context14.next) {\n case 0:\n filter.frontFilter.per_page = filter.frontFilter.perPage;\n delete filter.frontFilter.perPage;\n\n query = getFilterUrl(filter.backendFilter, filter.frontFilter);\n res = {};\n totalCount = 0;\n\n if (!(_lodash2.default.some(filter.frontFilter.tracks, function (val) {\n return val;\n }) && !_lodash2.default.isEqual(filter.frontFilter.types, []))) {\n _context14.next = 12;\n break;\n }\n\n url = '/recommender-api/' + handle + '?' + query;\n options = { headers: { 'app-version': CHALLENGE_APP_VERSION } };\n _context14.next = 10;\n return this.private.apiV5.get(url, options).then(checkErrorV5);\n\n case 10:\n res = _context14.sent;\n\n totalCount = res.headers.get('x-total') || 0;\n\n case 12:\n challenges = res.result ? res.result.filter(function (ch) {\n return ch.bucket;\n }) : [];\n return _context14.abrupt('return', {\n challenges: challenges,\n totalCount: totalCount,\n meta: {\n allChallengesCount: totalCount,\n allRecommendedChallengesCount: 0,\n myChallengesCount: 0,\n ongoingChallengesCount: 0,\n openChallengesCount: 0,\n totalCount: totalCount\n }\n });\n\n case 14:\n case 'end':\n return _context14.stop();\n }\n }\n }, _callee14, this);\n }));\n\n function getRecommendedChallenges(_x27, _x28) {\n return _ref15.apply(this, arguments);\n }\n\n return getRecommendedChallenges;\n }()\n\n /**\n * Gets SRM matches.\n * @param {Object} params\n * @return {Promise}\n */\n\n }, {\n key: 'getSrms',\n value: function () {\n var _ref16 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee15(params) {\n var res;\n return _regenerator2.default.wrap(function _callee15$(_context15) {\n while (1) {\n switch (_context15.prev = _context15.next) {\n case 0:\n _context15.next = 2;\n return this.private.api.get('/srms/?' + _qs2.default.stringify(params));\n\n case 2:\n res = _context15.sent;\n return _context15.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n case 4:\n case 'end':\n return _context15.stop();\n }\n }\n }, _callee15, this);\n }));\n\n function getSrms(_x29) {\n return _ref16.apply(this, arguments);\n }\n\n return getSrms;\n }()\n }, {\n key: 'getUserChallenges',\n\n\n /**\n * Gets challenges of the specified user.\n * @param {String} userId User id whose challenges we want to fetch.\n * @return {Promise} Resolves to the api response.\n */\n value: function () {\n var _ref17 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee16(userId, filters, params) {\n var userFilters, query, url, options, userChallenges;\n return _regenerator2.default.wrap(function _callee16$(_context16) {\n while (1) {\n switch (_context16.prev = _context16.next) {\n case 0:\n userFilters = _lodash2.default.cloneDeep(filters);\n\n ChallengesService.updateFiltersParamsForGettingMemberChallenges(userFilters, params);\n\n query = (0, _extends3.default)({}, params, userFilters, {\n memberId: userId\n });\n url = '/challenges?' + _qs2.default.stringify(_lodash2.default.omit(query, ['limit', 'offset', 'technologies']));\n options = { headers: { 'app-version': CHALLENGE_APP_VERSION } };\n _context16.next = 7;\n return this.private.apiV5.get(url, options).then(checkErrorV5).then(function (res) {\n res.result.forEach(function (item) {\n return normalizeChallenge(item, userId);\n });\n return res.result;\n });\n\n case 7:\n userChallenges = _context16.sent;\n return _context16.abrupt('return', {\n challenges: userChallenges,\n totalCount: userChallenges.length\n });\n\n case 9:\n case 'end':\n return _context16.stop();\n }\n }\n }, _callee16, this);\n }));\n\n function getUserChallenges(_x30, _x31, _x32) {\n return _ref17.apply(this, arguments);\n }\n\n return getUserChallenges;\n }()\n\n /**\n * Gets challenges of the specified user from v4 api.\n * @param {String} username User name whose challenges we want to fetch.\n * @return {Promise} Resolves to the api response.\n */\n\n }, {\n key: 'getUserChallengesV4',\n value: function () {\n var _ref18 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee17(username, filters, params) {\n var endpoint, query, url, res;\n return _regenerator2.default.wrap(function _callee17$(_context17) {\n while (1) {\n switch (_context17.prev = _context17.next) {\n case 0:\n endpoint = '/members/' + username.toLowerCase() + '/challenges/';\n query = (0, _extends3.default)({\n filter: _qs2.default.stringify(filters, { encode: false })\n }, params);\n url = endpoint + '?' + _qs2.default.stringify(query);\n _context17.next = 5;\n return this.private.api.get(url).then(checkError);\n\n case 5:\n res = _context17.sent;\n return _context17.abrupt('return', {\n challenges: res.content || [],\n totalCount: res.metadata.totalCount\n });\n\n case 7:\n case 'end':\n return _context17.stop();\n }\n }\n }, _callee17, this);\n }));\n\n function getUserChallengesV4(_x33, _x34, _x35) {\n return _ref18.apply(this, arguments);\n }\n\n return getUserChallengesV4;\n }()\n\n /**\n * Gets user resources.\n * @param {String} userId User id whose challenges we want to fetch.\n * @param {Number} page Current page for paginated API response (default 1)\n * @param {Number} perPage Page size for paginated API response (default 1000)\n * @return {Promise} Resolves to the api response.\n */\n\n }, {\n key: 'getUserResources',\n value: function () {\n var _ref19 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee18(userId) {\n var page = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n var perPage = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1000;\n var res;\n return _regenerator2.default.wrap(function _callee18$(_context18) {\n while (1) {\n switch (_context18.prev = _context18.next) {\n case 0:\n _context18.next = 2;\n return this.private.apiV5.get('/resources/' + userId + '/challenges?page=' + page + '&perPage=' + perPage);\n\n case 2:\n res = _context18.sent;\n return _context18.abrupt('return', res.json());\n\n case 4:\n case 'end':\n return _context18.stop();\n }\n }\n }, _callee18, this);\n }));\n\n function getUserResources(_x36) {\n return _ref19.apply(this, arguments);\n }\n\n return getUserResources;\n }()\n\n /**\n * Gets marathon matches of the specified user.\n * @param {String} memberId User whose challenges we want to fetch.\n * @param {Object} filter\n * @param {Object} params\n * @return {Promise} Resolves to the api response.\n */\n\n }, {\n key: 'getUserMarathonMatches',\n value: function () {\n var _ref20 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee19(memberId, filter, params) {\n var newParams, options, res;\n return _regenerator2.default.wrap(function _callee19$(_context19) {\n while (1) {\n switch (_context19.prev = _context19.next) {\n case 0:\n newParams = (0, _extends3.default)({}, filter, params, {\n tag: 'Marathon Match',\n memberId: memberId\n });\n options = { headers: { 'app-version': CHALLENGE_APP_VERSION } };\n _context19.next = 4;\n return this.private.apiV5.get('/challenges?' + _qs2.default.stringify(newParams), options);\n\n case 4:\n res = _context19.sent;\n return _context19.abrupt('return', res.json());\n\n case 6:\n case 'end':\n return _context19.stop();\n }\n }\n }, _callee19, this);\n }));\n\n function getUserMarathonMatches(_x39, _x40, _x41) {\n return _ref20.apply(this, arguments);\n }\n\n return getUserMarathonMatches;\n }()\n\n /**\n * Gets SRM matches related to the user.\n * @param {String} handle\n * @param {Object} params\n * @return {Promise}\n */\n\n }, {\n key: 'getUserSrms',\n value: function () {\n var _ref21 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee20(handle, params) {\n var url, options, res;\n return _regenerator2.default.wrap(function _callee20$(_context20) {\n while (1) {\n switch (_context20.prev = _context20.next) {\n case 0:\n url = '/members/' + handle + '/srms/?' + _qs2.default.stringify(params);\n options = { headers: { 'app-version': CHALLENGE_APP_VERSION } };\n _context20.next = 4;\n return this.private.api.get(url, options);\n\n case 4:\n res = _context20.sent;\n return _context20.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n case 6:\n case 'end':\n return _context20.stop();\n }\n }\n }, _callee20, this);\n }));\n\n function getUserSrms(_x42, _x43) {\n return _ref21.apply(this, arguments);\n }\n\n return getUserSrms;\n }()\n\n /**\n * Get the Resource Role ID from provided Role Name\n * @param {String} roleName\n * @return {Promise}\n */\n\n }, {\n key: 'getRoleId',\n value: function () {\n var _ref22 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee21(roleName) {\n var params, roles;\n return _regenerator2.default.wrap(function _callee21$(_context21) {\n while (1) {\n switch (_context21.prev = _context21.next) {\n case 0:\n params = {\n name: roleName,\n isActive: true\n };\n _context21.next = 3;\n return this.private.apiV5.get('/resource-roles?' + _qs2.default.stringify(params)).then(checkErrorV5).then(function (res) {\n return res.result;\n });\n\n case 3:\n roles = _context21.sent;\n\n if (!_lodash2.default.isEmpty(roles)) {\n _context21.next = 6;\n break;\n }\n\n throw new Error('Resource Role not found!');\n\n case 6:\n return _context21.abrupt('return', roles[0].id);\n\n case 7:\n case 'end':\n return _context21.stop();\n }\n }\n }, _callee21, this);\n }));\n\n function getRoleId(_x44) {\n return _ref22.apply(this, arguments);\n }\n\n return getRoleId;\n }()\n\n /**\n * Registers user to the specified challenge.\n * @param {String} challengeId\n * @return {Promise}\n */\n\n }, {\n key: 'register',\n value: function () {\n var _ref23 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee22(challengeId) {\n var user, roleId, params, res;\n return _regenerator2.default.wrap(function _callee22$(_context22) {\n while (1) {\n switch (_context22.prev = _context22.next) {\n case 0:\n user = (0, _tcAuthLib.decodeToken)(this.private.tokenV3);\n _context22.next = 3;\n return this.getRoleId('Submitter');\n\n case 3:\n roleId = _context22.sent;\n params = {\n challengeId: challengeId,\n memberHandle: encodeURIComponent(user.handle),\n roleId: roleId\n };\n _context22.next = 7;\n return this.private.apiV5.postJson('/resources', params);\n\n case 7:\n res = _context22.sent;\n\n if (res.ok) {\n _context22.next = 10;\n break;\n }\n\n throw new Error(res.statusText);\n\n case 10:\n return _context22.abrupt('return', res.json());\n\n case 11:\n case 'end':\n return _context22.stop();\n }\n }\n }, _callee22, this);\n }));\n\n function register(_x45) {\n return _ref23.apply(this, arguments);\n }\n\n return register;\n }()\n\n /**\n * Unregisters user from the specified challenge.\n * @param {String} challengeId\n * @return {Promise}\n */\n\n }, {\n key: 'unregister',\n value: function () {\n var _ref24 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee23(challengeId) {\n var user, roleId, params, res;\n return _regenerator2.default.wrap(function _callee23$(_context23) {\n while (1) {\n switch (_context23.prev = _context23.next) {\n case 0:\n user = (0, _tcAuthLib.decodeToken)(this.private.tokenV3);\n _context23.next = 3;\n return this.getRoleId('Submitter');\n\n case 3:\n roleId = _context23.sent;\n params = {\n challengeId: challengeId,\n memberHandle: encodeURIComponent(user.handle),\n roleId: roleId\n };\n _context23.next = 7;\n return this.private.apiV5.delete('/resources', (0, _stringify2.default)(params));\n\n case 7:\n res = _context23.sent;\n\n if (res.ok) {\n _context23.next = 10;\n break;\n }\n\n throw new Error(res.statusText);\n\n case 10:\n return _context23.abrupt('return', res.json());\n\n case 11:\n case 'end':\n return _context23.stop();\n }\n }\n }, _callee23, this);\n }));\n\n function unregister(_x46) {\n return _ref24.apply(this, arguments);\n }\n\n return unregister;\n }()\n\n /**\n * Gets count of user's active challenges.\n * @param {String} handle Topcoder user handle.\n * @return {Action} Resolves to the api response.\n */\n\n }, {\n key: 'getActiveChallengesCount',\n value: function getActiveChallengesCount(handle) {\n var filter = { status: 'Active' };\n var params = { limit: 1, offset: 0 };\n return this.getUserChallenges(handle, filter, params).then(function (res) {\n return res.totalCount;\n });\n }\n\n /**\n * Submits a challenge submission. Uses APIV2 for Development submission\n * and APIV3 for Design submisisons.\n * @param {Object} body\n * @param {String} challengeId\n * @param {String} track Either DESIGN or DEVELOP\n * @return {Promise}\n */\n\n }, {\n key: 'submit',\n value: function submit(body, challengeId, track, onProgress) {\n var api = void 0;\n var contentType = void 0;\n var url = void 0;\n\n if (track === _tc.COMPETITION_TRACKS.DES) {\n api = this.private.api;\n\n contentType = 'application/json';\n url = '/submissions/'; // The submission info is contained entirely in the JSON body\n } else {\n api = this.private.apiV2;\n // contentType = 'multipart/form-data';\n contentType = null;\n url = '/develop/challenges/' + challengeId + '/upload';\n }\n\n return api.upload(url, {\n body: body,\n headers: { 'Content-Type': contentType },\n method: 'POST'\n }, onProgress).then(function (res) {\n var jres = JSON.parse(res);\n // Return result for Develop submission\n if (track === _tc.COMPETITION_TRACKS.DEV) {\n return jres;\n }\n // Design Submission requires an extra \"Processing\" POST\n var procId = jres.result.content.id;\n return api.upload('/submissions/' + procId + '/process/', {\n body: (0, _stringify2.default)({ param: jres.result.content }),\n headers: { 'Content-Type': contentType },\n method: 'POST'\n }, onProgress).then(function (procres) {\n return JSON.parse(procres);\n });\n }, function (err) {\n _logger2.default.error('Failed to submit to the challenge #' + challengeId, err);\n throw err;\n });\n }\n\n /**\n * Updates the challenge (saves the give challenge to the API).\n * @param {Object} challenge\n * @param {String} tokenV3\n * @return {Promise}\n */\n\n }, {\n key: 'updateChallenge',\n value: function () {\n var _ref25 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee24(challenge) {\n var url, res;\n return _regenerator2.default.wrap(function _callee24$(_context24) {\n while (1) {\n switch (_context24.prev = _context24.next) {\n case 0:\n url = '/challenges/' + challenge.id;\n _context24.next = 3;\n return this.private.apiV5.put(url, challenge);\n\n case 3:\n res = _context24.sent;\n\n if (res.ok) {\n _context24.next = 6;\n break;\n }\n\n throw new Error(res.statusText);\n\n case 6:\n _context24.next = 8;\n return res.json();\n\n case 8:\n res = _context24.sent.result;\n\n if (!(res.status !== 200)) {\n _context24.next = 11;\n break;\n }\n\n throw new Error(res.content);\n\n case 11:\n return _context24.abrupt('return', res.content);\n\n case 12:\n case 'end':\n return _context24.stop();\n }\n }\n }, _callee24, this);\n }));\n\n function updateChallenge(_x47) {\n return _ref25.apply(this, arguments);\n }\n\n return updateChallenge;\n }()\n\n /**\n * Gets roles of a user in the specified challenge. The user tested is\n * the owner of authentication token used to instantiate the service.\n *\n * Notice, if you have already loaded the challenge as that user, these roles\n * are attached to the challenge object under `userDetails.roles` path during\n * challenge normalization. However, if you have not, this method is the most\n * efficient way to get them, as it by-passes any unnecessary normalizations\n * of the challenge object.\n *\n * @param {Number} challengeId Challenge ID.\n */\n\n }, {\n key: 'getUserRolesInChallenge',\n value: function () {\n var _ref26 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee25(challengeId) {\n var user, url, getResourcesResponse, resources;\n return _regenerator2.default.wrap(function _callee25$(_context25) {\n while (1) {\n switch (_context25.prev = _context25.next) {\n case 0:\n user = (0, _tcAuthLib.decodeToken)(this.private.tokenV3);\n url = '/resources?challengeId=' + challengeId + '&memberHandle=' + user.handle;\n _context25.next = 4;\n return this.private.apiV5.get(url);\n\n case 4:\n getResourcesResponse = _context25.sent;\n _context25.next = 7;\n return getResourcesResponse.json();\n\n case 7:\n resources = _context25.sent;\n\n if (!resources) {\n _context25.next = 10;\n break;\n }\n\n return _context25.abrupt('return', _lodash2.default.map(_lodash2.default.filter(resources, function (r) {\n return r.memberHandle === user.handle;\n }), 'roleId'));\n\n case 10:\n throw new Error('Failed to fetch user role from challenge #' + challengeId);\n\n case 11:\n case 'end':\n return _context25.stop();\n }\n }\n }, _callee25, this);\n }));\n\n function getUserRolesInChallenge(_x48) {\n return _ref26.apply(this, arguments);\n }\n\n return getUserRolesInChallenge;\n }()\n }, {\n key: '__reactstandin__regenerateByEval',\n // @ts-ignore\n value: function __reactstandin__regenerateByEval(key, code) {\n // @ts-ignore\n this[key] = eval(code);\n }\n }], [{\n key: 'updateFiltersParamsForGettingMemberChallenges',\n value: function updateFiltersParamsForGettingMemberChallenges(filters, params) {\n if (params && params.perPage) {\n // eslint-disable-next-line no-param-reassign\n params.offset = (params.page - 1) * params.perPage;\n // eslint-disable-next-line no-param-reassign\n params.limit = params.perPage;\n }\n }\n }]);\n return ChallengesService;\n}();\n\nvar lastInstance = null;\n/**\n * Returns a new or existing challenges service.\n * @param {String} tokenV3 Optional. Auth token for Topcoder API v3.\n * @param {String} tokenV2 Optional. Auth token for Topcoder API v2.\n * @return {ChallengesService} Challenges service object\n */\nfunction getService(tokenV3, tokenV2) {\n if (!lastInstance || lastInstance.private.tokenV3 !== tokenV3 || lastInstance.tokenV2 !== tokenV2) {\n lastInstance = new ChallengesService(tokenV3, tokenV2);\n }\n return lastInstance;\n}\n\n/* Using default export would be confusing in this case. */\nvar _default = undefined;\nexports.default = _default;\n;\n\n(function () {\n var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n if (!reactHotLoader) {\n return;\n }\n\n reactHotLoader.register(CHALLENGE_APP_VERSION, 'CHALLENGE_APP_VERSION', '/Users/hentrymartin/development/topcoder-react-lib/src/services/challenges.js');\n reactHotLoader.register(getFilterUrl, 'getFilterUrl', '/Users/hentrymartin/development/topcoder-react-lib/src/services/challenges.js');\n reactHotLoader.register(ORDER_BY, 'ORDER_BY', '/Users/hentrymartin/development/topcoder-react-lib/src/services/challenges.js');\n reactHotLoader.register(normalizeChallenge, 'normalizeChallenge', '/Users/hentrymartin/development/topcoder-react-lib/src/services/challenges.js');\n reactHotLoader.register(checkError, 'checkError', '/Users/hentrymartin/development/topcoder-react-lib/src/services/challenges.js');\n reactHotLoader.register(checkErrorV5, 'checkErrorV5', '/Users/hentrymartin/development/topcoder-react-lib/src/services/challenges.js');\n reactHotLoader.register(ChallengesService, 'ChallengesService', '/Users/hentrymartin/development/topcoder-react-lib/src/services/challenges.js');\n reactHotLoader.register(lastInstance, 'lastInstance', '/Users/hentrymartin/development/topcoder-react-lib/src/services/challenges.js');\n reactHotLoader.register(getService, 'getService', '/Users/hentrymartin/development/topcoder-react-lib/src/services/challenges.js');\n reactHotLoader.register(_default, 'default', '/Users/hentrymartin/development/topcoder-react-lib/src/services/challenges.js');\n})();\n\n;\n\n(function () {\n var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/services/challenges.js?"); +eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.ORDER_BY = undefined;\n\nvar _stringify = __webpack_require__(/*! babel-runtime/core-js/json/stringify */ \"babel-runtime/core-js/json/stringify\");\n\nvar _stringify2 = _interopRequireDefault(_stringify);\n\nvar _extends2 = __webpack_require__(/*! babel-runtime/helpers/extends */ \"babel-runtime/helpers/extends\");\n\nvar _extends3 = _interopRequireDefault(_extends2);\n\nvar _classCallCheck2 = __webpack_require__(/*! babel-runtime/helpers/classCallCheck */ \"babel-runtime/helpers/classCallCheck\");\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = __webpack_require__(/*! babel-runtime/helpers/createClass */ \"babel-runtime/helpers/createClass\");\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nvar _regenerator = __webpack_require__(/*! babel-runtime/regenerator */ \"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = __webpack_require__(/*! babel-runtime/helpers/asyncToGenerator */ \"babel-runtime/helpers/asyncToGenerator\");\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\nvar _defineProperty2 = __webpack_require__(/*! babel-runtime/helpers/defineProperty */ \"babel-runtime/helpers/defineProperty\");\n\nvar _defineProperty3 = _interopRequireDefault(_defineProperty2);\n\nvar _set = __webpack_require__(/*! babel-runtime/core-js/set */ \"babel-runtime/core-js/set\");\n\nvar _set2 = _interopRequireDefault(_set);\n\n/**\n * Helper method that checks for HTTP error response and throws Error in this case.\n * @param {Object} res HTTP response object\n * @return {Object} API JSON response object\n * @private\n */\nvar checkError = function () {\n var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(res) {\n var jsonRes;\n return _regenerator2.default.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n if (res.ok) {\n _context.next = 3;\n break;\n }\n\n if (res.status >= 500) {\n (0, _errors.setErrorIcon)(_errors.ERROR_ICON_TYPES.API, '/challenges', res.statusText);\n }\n throw new Error(res.statusText);\n\n case 3:\n _context.next = 5;\n return res.json();\n\n case 5:\n jsonRes = _context.sent.result;\n\n if (!(jsonRes.status !== 200)) {\n _context.next = 8;\n break;\n }\n\n throw new Error(jsonRes.content);\n\n case 8:\n return _context.abrupt('return', jsonRes);\n\n case 9:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, this);\n }));\n\n return function checkError(_x) {\n return _ref2.apply(this, arguments);\n };\n}();\n\n/**\n * Helper method that checks for HTTP error response v5 and throws Error in this case.\n * @param {Object} res HTTP response object\n * @return {Object} API JSON response object\n * @private\n */\n\n\nvar checkErrorV5 = function () {\n var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(res) {\n var jsonRes;\n return _regenerator2.default.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n if (res.ok) {\n _context2.next = 3;\n break;\n }\n\n if (res.status >= 500) {\n (0, _errors.setErrorIcon)(_errors.ERROR_ICON_TYPES.API, '/challenges', res.statusText);\n }\n throw new Error(!res.statusText && res.status === 403 ? 'Forbidden' : res.statusText);\n\n case 3:\n _context2.next = 5;\n return res.json();\n\n case 5:\n jsonRes = _context2.sent;\n\n if (!jsonRes.message) {\n _context2.next = 8;\n break;\n }\n\n throw new Error(res.message);\n\n case 8:\n return _context2.abrupt('return', {\n result: jsonRes,\n headers: res.headers\n });\n\n case 9:\n case 'end':\n return _context2.stop();\n }\n }\n }, _callee2, this);\n }));\n\n return function checkErrorV5(_x2) {\n return _ref3.apply(this, arguments);\n };\n}();\n\n/**\n * Challenge service.\n */\n\n\nexports.getFilterUrl = getFilterUrl;\nexports.normalizeChallenge = normalizeChallenge;\nexports.getService = getService;\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _moment = __webpack_require__(/*! moment */ \"moment\");\n\nvar _moment2 = _interopRequireDefault(_moment);\n\nvar _qs = __webpack_require__(/*! qs */ \"qs\");\n\nvar _qs2 = _interopRequireDefault(_qs);\n\nvar _tcAuthLib = __webpack_require__(/*! @topcoder-platform/tc-auth-lib */ \"@topcoder-platform/tc-auth-lib\");\n\nvar _logger = __webpack_require__(/*! ../utils/logger */ \"./src/utils/logger.js\");\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar _errors = __webpack_require__(/*! ../utils/errors */ \"./src/utils/errors.js\");\n\nvar _tc = __webpack_require__(/*! ../utils/tc */ \"./src/utils/tc.js\");\n\nvar _api = __webpack_require__(/*! ./api */ \"./src/services/api.js\");\n\nvar _members = __webpack_require__(/*! ./members */ \"./src/services/members.js\");\n\nvar _submissions = __webpack_require__(/*! ./submissions */ \"./src/services/submissions.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n return a;\n}; /**\n * @module \"services.challenges\"\n * @desc This module provides a service for convenient manipulation with\n * Topcoder challenges via TC API.\n */\n\n/* global CONFIG */\n\n\nvar _CONFIG = {\"AV_SCAN_SCORER_REVIEW_TYPE_ID\":\"1297f2db-687d-4ac8-bf9c-78b6df1b1281\",\"PROVISIONAL_SCORING_COMPLETED_REVIEW_TYPE_ID\":\"52c91e85-745f-4e62-b592-9879a2dfe9fd\",\"PAGE_SIZE\":50,\"REVIEW_OPPORTUNITY_PAGE_SIZE\":1000,\"CHALLENGE_APP_VERSION\":\"1.1.0\"},\n CHALLENGE_APP_VERSION = _CONFIG.CHALLENGE_APP_VERSION;\nfunction getFilterUrl(backendFilter, frontFilter) {\n var ff = _lodash2.default.clone(frontFilter);\n // eslint-disable-next-line object-curly-newline\n var tags = ff.tags,\n tracks = ff.tracks,\n types = ff.types,\n groups = ff.groups,\n events = ff.events;\n\n delete ff.tags;\n delete ff.tracks;\n delete ff.types;\n delete ff.communityId;\n delete ff.groups;\n delete ff.events;\n\n // console.log(ff);\n\n var urlFilter = _qs2.default.stringify(_lodash2.default.reduce(ff, function (result, value, key) {\n // eslint-disable-next-line no-param-reassign\n if (value) result[key] = value;\n return result;\n }, {}));\n // console.log(urlFilter);\n\n var ftags = _lodash2.default.map(tags, function (val) {\n return 'tags[]=' + val;\n }).join('&');\n var ftracks = _lodash2.default.map(_lodash2.default.reduce(tracks, function (result, value, key) {\n // eslint-disable-next-line no-unused-expressions\n tracks[key] && result.push(key);\n return result;\n }, []), function (val) {\n return 'tracks[]=' + val;\n }).join('&');\n var ftypes = _lodash2.default.map(types, function (val) {\n return 'types[]=' + val;\n }).join('&');\n var fgroups = _lodash2.default.map(groups, function (val) {\n return 'groups[]=' + val;\n }).join('&');\n var fevents = _lodash2.default.map(events, function (val) {\n return 'events[]=' + val;\n }).join('&');\n if (ftags.length > 0) urlFilter += '&' + ftags;\n if (ftracks.length > 0) urlFilter += '&' + ftracks;\n if (ftypes.length > 0) urlFilter += '&' + ftypes;\n if (fgroups.length > 9) urlFilter += '&' + fgroups;\n if (fevents.length > 0) urlFilter += '&' + fevents;\n return urlFilter;\n}\n\nvar ORDER_BY = exports.ORDER_BY = {\n SUBMISSION_END_DATE: 'submissionEndDate'\n};\n\n/**\n * Normalizes a regular challenge object received from the backend.\n * NOTE: This function is copied from the existing code in the challenge listing\n * component. It is possible, that this normalization is not necessary after we\n * have moved to Topcoder API, but it is kept for now to minimize a risk of\n * breaking anything.\n * @todo Should be used only internally!\n * @param {Object} challenge Challenge object received from the backend.\n * @param {String} username Optional.\n */\nfunction normalizeChallenge(challenge, username) {\n var phases = challenge.allPhases || challenge.phases || [];\n var registration = phases.filter(function (d) {\n return d.name === 'Registration';\n })[0];\n var registrationOpen = 'No';\n var registrationStartDate = void 0;\n var registrationEndDate = void 0;\n if (registration) {\n registrationStartDate = registration.actualStartDate || registration.scheduledStartDate;\n if (registration.isOpen) {\n registrationOpen = 'Yes';\n }\n registrationEndDate = registration.actualEndDate || registration.scheduledEndDate;\n }\n var groups = {};\n if (challenge.groups) {\n challenge.groups.forEach(function (id) {\n groups[id] = true;\n });\n }\n /* eslint-disable no-param-reassign */\n if (!challenge.prizeSets) challenge.prizeSets = [];\n if (!challenge.tags) challenge.tags = [];\n if (!challenge.platforms) challenge.platforms = [];\n\n var submissionEndTimestamp = phases.filter(function (d) {\n return d.name === 'Submission';\n })[0];\n if (submissionEndTimestamp) {\n submissionEndTimestamp = submissionEndTimestamp.scheduledEndDate;\n }\n var placementPrizes = _lodash2.default.find(challenge.prizeSets, { type: 'placement' });\n var prizes = _lodash2.default.get(placementPrizes, 'prizes', []);\n _lodash2.default.defaults(challenge, {\n communities: new _set2.default([_tc.COMPETITION_TRACKS[challenge.track]]),\n groups: groups,\n registrationOpen: registrationOpen,\n submissionEndTimestamp: submissionEndTimestamp,\n registrationStartDate: registrationStartDate,\n registrationEndDate: registrationEndDate,\n totalPrize: prizes.reduce(function (acc, prize) {\n return acc + prize.value;\n }, 0),\n submissionEndDate: submissionEndTimestamp,\n users: username ? (0, _defineProperty3.default)({}, username, true) : {}\n });\n}\nvar ChallengesService = function () {\n /**\n * Creates a new ChallengeService instance.\n * @param {String} tokenV3 Optional. Auth token for Topcoder API v3.\n * @param {String} tokenV2 Optional. Auth token for Topcoder API v2.\n */\n function ChallengesService(tokenV3, tokenV2) {\n var _this = this;\n\n (0, _classCallCheck3.default)(this, ChallengesService);\n\n /**\n * Private function being re-used in all methods related to getting\n * challenges. It handles query-related arguments in the uniform way:\n * @param {String} endpoint API endpoint, where the request will be send.\n * @param {Object} filters Optional. A map of filters to pass as `filter`\n * query parameter (this function takes care to stringify it properly).\n * @param {Object} params Optional. A map of any other parameters beside\n * `filter`.\n */\n var getChallenges = function () {\n var _ref4 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3(endpoint, filter) {\n var res, query, url, options;\n return _regenerator2.default.wrap(function _callee3$(_context3) {\n while (1) {\n switch (_context3.prev = _context3.next) {\n case 0:\n res = {};\n\n if (!(_lodash2.default.some(filter.frontFilter.tracks, function (val) {\n return val;\n }) && !_lodash2.default.isEqual(filter.frontFilter.types, []))) {\n _context3.next = 8;\n break;\n }\n\n query = getFilterUrl(filter.backendFilter, filter.frontFilter);\n url = endpoint + '?' + query;\n options = { headers: { 'app-version': CHALLENGE_APP_VERSION } };\n _context3.next = 7;\n return _this.private.apiV5.get(url, options).then(checkErrorV5);\n\n case 7:\n res = _context3.sent;\n\n case 8:\n return _context3.abrupt('return', {\n challenges: res.result || [],\n totalCount: res.headers ? res.headers.get('x-total') : 0,\n meta: {\n allChallengesCount: res.headers ? res.headers.get('x-total') : 0,\n allRecommendedChallengesCount: 0,\n myChallengesCount: 0,\n ongoingChallengesCount: 0,\n openChallengesCount: 0,\n totalCount: res.headers ? res.headers.get('x-total') : 0\n }\n });\n\n case 9:\n case 'end':\n return _context3.stop();\n }\n }\n }, _callee3, _this);\n }));\n\n return function getChallenges(_x3, _x4) {\n return _ref4.apply(this, arguments);\n };\n }();\n\n var getChallengeDetails = function () {\n var _ref5 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee4(endpoint, legacyInfo) {\n var query, url, options, res;\n return _regenerator2.default.wrap(function _callee4$(_context4) {\n while (1) {\n switch (_context4.prev = _context4.next) {\n case 0:\n query = '';\n\n if (legacyInfo) {\n query = 'legacyId=' + legacyInfo.legacyId;\n }\n url = endpoint + '?' + query;\n options = { headers: { 'app-version': CHALLENGE_APP_VERSION } };\n _context4.next = 6;\n return _this.private.apiV5.get(url, options).then(checkErrorV5);\n\n case 6:\n res = _context4.sent;\n return _context4.abrupt('return', {\n challenges: res.result || []\n });\n\n case 8:\n case 'end':\n return _context4.stop();\n }\n }\n }, _callee4, _this);\n }));\n\n return function getChallengeDetails(_x5, _x6) {\n return _ref5.apply(this, arguments);\n };\n }();\n\n /**\n * Private function being re-used in all methods related to getting\n * challenges. It handles query-related arguments in the uniform way:\n * @param {String} endpoint API endpoint, where the request will be send.\n * @param {Object} filters Optional. A map of filters to pass as `filter`\n * query parameter (this function takes care to stringify it properly).\n * @param {Object} params Optional. A map of any other parameters beside\n * `filter`.\n */\n var getMemberChallenges = function () {\n var _ref6 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee5(endpoint) {\n var filters = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var memberId, query, url, options, res, totalCount;\n return _regenerator2.default.wrap(function _callee5$(_context5) {\n while (1) {\n switch (_context5.prev = _context5.next) {\n case 0:\n memberId = (0, _tcAuthLib.decodeToken)(_this.private.tokenV3).userId;\n query = (0, _extends3.default)({}, params, filters, {\n memberId: memberId\n });\n url = endpoint + '?' + _qs2.default.stringify(_lodash2.default.omit(query, ['limit', 'offset', 'technologies']));\n options = { headers: { 'app-version': CHALLENGE_APP_VERSION } };\n _context5.next = 6;\n return _this.private.apiV5.get(url, options).then(checkError);\n\n case 6:\n res = _context5.sent;\n totalCount = res.length;\n return _context5.abrupt('return', {\n challenges: res || [],\n totalCount: totalCount\n });\n\n case 9:\n case 'end':\n return _context5.stop();\n }\n }\n }, _callee5, _this);\n }));\n\n return function getMemberChallenges(_x7) {\n return _ref6.apply(this, arguments);\n };\n }();\n\n this.private = {\n api: (0, _api.getApi)('V4', tokenV3),\n apiV5: (0, _api.getApi)('V5', tokenV3),\n apiV2: (0, _api.getApi)('V2', tokenV2),\n apiV3: (0, _api.getApi)('V3', tokenV3),\n getChallenges: getChallenges,\n getChallengeDetails: getChallengeDetails,\n getMemberChallenges: getMemberChallenges,\n tokenV2: tokenV2,\n tokenV3: tokenV3,\n memberService: (0, _members.getService)(),\n submissionsService: (0, _submissions.getService)(tokenV3)\n };\n }\n\n /**\n * Gets challenge statistics.\n * @param {Number} challengeId\n * @return {Promise} The array of statistics\n */\n\n\n (0, _createClass3.default)(ChallengesService, [{\n key: 'getChallengeStatistics',\n value: function () {\n var _ref7 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee6(challengeId) {\n return _regenerator2.default.wrap(function _callee6$(_context6) {\n while (1) {\n switch (_context6.prev = _context6.next) {\n case 0:\n return _context6.abrupt('return', this.private.apiV5.get('/challenges/' + challengeId + '/statistics').then(function (res) {\n return res.ok ? res.json() : new Error(res.statusText);\n }).then(function (res) {\n return res.message ? new Error(res.message) : res;\n }));\n\n case 1:\n case 'end':\n return _context6.stop();\n }\n }\n }, _callee6, this);\n }));\n\n function getChallengeStatistics(_x10) {\n return _ref7.apply(this, arguments);\n }\n\n return getChallengeStatistics;\n }()\n\n /**\n * Activates the specified challenge.\n * @param {Number} challengeId\n * @return {Promise} Resolves to null value in case of success; otherwise it\n * is rejected.\n */\n\n }, {\n key: 'activate',\n value: function () {\n var _ref8 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee7(challengeId) {\n var params, res;\n return _regenerator2.default.wrap(function _callee7$(_context7) {\n while (1) {\n switch (_context7.prev = _context7.next) {\n case 0:\n params = {\n status: 'Active'\n };\n _context7.next = 3;\n return this.private.apiV5.patch('/challenge/' + challengeId, params);\n\n case 3:\n res = _context7.sent;\n\n if (res.ok) {\n _context7.next = 6;\n break;\n }\n\n throw new Error(res.statusText);\n\n case 6:\n _context7.next = 8;\n return res.json();\n\n case 8:\n res = _context7.sent.result;\n\n if (!(res.status !== 200)) {\n _context7.next = 11;\n break;\n }\n\n throw new Error(res.content);\n\n case 11:\n return _context7.abrupt('return', res.content);\n\n case 12:\n case 'end':\n return _context7.stop();\n }\n }\n }, _callee7, this);\n }));\n\n function activate(_x11) {\n return _ref8.apply(this, arguments);\n }\n\n return activate;\n }()\n\n /**\n * Closes the specified challenge.\n * @param {Number} challengeId\n * @return {Promise} Resolves to null value in case of success; otherwise it\n * is rejected.\n */\n\n }, {\n key: 'close',\n value: function () {\n var _ref9 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee8(challengeId) {\n var params, res;\n return _regenerator2.default.wrap(function _callee8$(_context8) {\n while (1) {\n switch (_context8.prev = _context8.next) {\n case 0:\n params = {\n status: 'Completed'\n };\n _context8.next = 3;\n return this.private.apiV5.patch('/challenges/' + challengeId, params);\n\n case 3:\n res = _context8.sent;\n\n if (res.ok) {\n _context8.next = 6;\n break;\n }\n\n throw new Error(res.statusText);\n\n case 6:\n _context8.next = 8;\n return res.json();\n\n case 8:\n res = _context8.sent.result;\n\n if (!(res.status !== 200)) {\n _context8.next = 11;\n break;\n }\n\n throw new Error(res.content);\n\n case 11:\n return _context8.abrupt('return', res.content);\n\n case 12:\n case 'end':\n return _context8.stop();\n }\n }\n }, _callee8, this);\n }));\n\n function close(_x12) {\n return _ref9.apply(this, arguments);\n }\n\n return close;\n }()\n\n /**\n * Creates a new payment task.\n * @param {Number} projectId\n * @param {Number} accountId Billing account ID.\n * @param {String} title\n * @param {String} description\n * @param {String} assignee\n * @param {Number} payment\n * @param {String} submissionGuidelines\n * @param {Number} copilotId\n * @param {Number} copilotFee\n * @param {?} tags\n * @return {Promise} Resolves to the created challenge object (payment task).\n */\n\n }, {\n key: 'createTask',\n value: function () {\n var _ref10 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee9(projectId, accountId, title, description, assignee, payment, submissionGuidelines, copilotId, copilotFee, tags) {\n var registrationPhase, payload, res;\n return _regenerator2.default.wrap(function _callee9$(_context9) {\n while (1) {\n switch (_context9.prev = _context9.next) {\n case 0:\n _context9.next = 2;\n return this.private.apiV5.get('/challenge-phases?name=Registration');\n\n case 2:\n registrationPhase = _context9.sent;\n payload = {\n param: {\n name: title,\n typeId: 'e885273d-aeda-42c0-917d-bfbf979afbba',\n description: description,\n legacy: {\n track: 'FIRST_2_FINISH',\n reviewType: 'INTERNAL',\n confidentialityType: 'public',\n billingAccountId: accountId\n },\n phases: [{\n phaseId: registrationPhase.id,\n scheduledEndDate: (0, _moment2.default)().toISOString()\n }],\n prizeSets: [{\n type: 'Challenge Prizes',\n description: 'Challenge Prize',\n prizes: [{\n value: payment,\n type: 'First Placement'\n }]\n }],\n tags: tags,\n projectId: projectId\n }\n };\n\n if (copilotId) {\n _lodash2.default.assign(payload.param, {\n copilotId: copilotId,\n copilotFee: copilotFee\n });\n }\n _context9.next = 7;\n return this.private.apiV5.postJson('/challenges', payload);\n\n case 7:\n res = _context9.sent;\n\n if (res.ok) {\n _context9.next = 10;\n break;\n }\n\n throw new Error(res.statusText);\n\n case 10:\n _context9.next = 12;\n return res.json();\n\n case 12:\n res = _context9.sent.result;\n\n if (!(res.status !== 200)) {\n _context9.next = 15;\n break;\n }\n\n throw new Error(res.content);\n\n case 15:\n return _context9.abrupt('return', res.content);\n\n case 16:\n case 'end':\n return _context9.stop();\n }\n }\n }, _callee9, this);\n }));\n\n function createTask(_x13, _x14, _x15, _x16, _x17, _x18, _x19, _x20, _x21, _x22) {\n return _ref10.apply(this, arguments);\n }\n\n return createTask;\n }()\n\n /**\n * Gets challenge details from Topcoder API.\n * NOTE: This function also uses API v2 and other endpoints for now, due\n * to some information is missing or\n * incorrect in the main endpoint. This may change in the future.\n * @param {Number|String} challengeId\n * @return {Promise} Resolves to the challenge object.\n */\n\n }, {\n key: 'getChallengeDetails',\n value: function () {\n var _ref11 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee10(challengeId) {\n var memberId, challenge, registrants, submissions, isLegacyChallenge, isRegistered, userDetails, subParams, reviewScans;\n return _regenerator2.default.wrap(function _callee10$(_context10) {\n while (1) {\n switch (_context10.prev = _context10.next) {\n case 0:\n memberId = this.private.tokenV3 ? (0, _tcAuthLib.decodeToken)(this.private.tokenV3).userId : null;\n challenge = {};\n registrants = [];\n submissions = [];\n isLegacyChallenge = false;\n isRegistered = false;\n userDetails = { roles: [] };\n\n // condition based on ROUTE used for Review Opportunities, change if needed\n\n if (!/^[\\d]{5,8}$/.test(challengeId)) {\n _context10.next = 14;\n break;\n }\n\n isLegacyChallenge = true;\n _context10.next = 11;\n return this.private.getChallengeDetails('/challenges/', { legacyId: challengeId }).then(function (res) {\n return res.challenges[0] || {};\n });\n\n case 11:\n challenge = _context10.sent;\n _context10.next = 17;\n break;\n\n case 14:\n _context10.next = 16;\n return this.private.getChallengeDetails('/challenges/' + challengeId).then(function (res) {\n return res.challenges;\n });\n\n case 16:\n challenge = _context10.sent;\n\n case 17:\n if (!challenge) {\n _context10.next = 38;\n break;\n }\n\n _context10.next = 20;\n return this.getChallengeRegistrants(challenge.id);\n\n case 20:\n registrants = _context10.sent;\n\n\n // This TEMP fix to colorStyle, this will be fixed with issue #4530\n registrants = _lodash2.default.map(registrants, function (r) {\n return (0, _extends3.default)({}, r, { colorStyle: 'color: #151516'\n });\n });\n\n /* Prepare data to logged user */\n\n if (!memberId) {\n _context10.next = 37;\n break;\n }\n\n isRegistered = _lodash2.default.some(registrants, function (r) {\n return '' + r.memberId === '' + memberId;\n });\n\n subParams = {\n challengeId: challengeId,\n perPage: 100\n };\n _context10.next = 27;\n return this.private.submissionsService.getSubmissions(subParams);\n\n case 27:\n submissions = _context10.sent;\n\n if (!submissions) {\n _context10.next = 34;\n break;\n }\n\n _context10.next = 31;\n return this.private.submissionsService.getScanReviewIds();\n\n case 31:\n reviewScans = _context10.sent;\n\n submissions.forEach(function (s, i) {\n submissions[i].review = _lodash2.default.reject(s.review, function (r) {\n return r && _lodash2.default.includes(reviewScans, r.typeId);\n });\n });\n\n // Add submission date to registrants\n registrants.forEach(function (r, i) {\n var submission = submissions.find(function (s) {\n return '' + s.memberId === '' + r.memberId;\n });\n if (submission) {\n registrants[i].submissionDate = submission.created;\n }\n });\n\n case 34:\n _context10.next = 36;\n return this.getUserRolesInChallenge(challengeId);\n\n case 36:\n userDetails.roles = _context10.sent;\n\n case 37:\n\n challenge = (0, _extends3.default)({}, challenge, {\n isLegacyChallenge: isLegacyChallenge,\n isRegistered: isRegistered,\n registrants: registrants,\n submissions: submissions,\n userDetails: userDetails,\n events: _lodash2.default.map(challenge.events, function (e) {\n return {\n eventName: e.key,\n eventId: e.id,\n description: e.name\n };\n }),\n fetchedWithAuth: Boolean(this.private.apiV5.private.token)\n });\n\n case 38:\n return _context10.abrupt('return', challenge);\n\n case 39:\n case 'end':\n return _context10.stop();\n }\n }\n }, _callee10, this);\n }));\n\n function getChallengeDetails(_x23) {\n return _ref11.apply(this, arguments);\n }\n\n return getChallengeDetails;\n }()\n\n /**\n * Gets challenge registrants from Topcoder API.\n * @param {Number|String} challengeId\n * @return {Promise} Resolves to the challenge registrants array.\n */\n\n }, {\n key: 'getChallengeRegistrants',\n value: function () {\n var _ref12 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee11(challengeId) {\n var roleId, params, registrants;\n return _regenerator2.default.wrap(function _callee11$(_context11) {\n while (1) {\n switch (_context11.prev = _context11.next) {\n case 0:\n if (!this.private.tokenV3) {\n _context11.next = 6;\n break;\n }\n\n _context11.next = 3;\n return this.getRoleId('Submitter');\n\n case 3:\n _context11.t0 = _context11.sent;\n _context11.next = 7;\n break;\n\n case 6:\n _context11.t0 = null;\n\n case 7:\n roleId = _context11.t0;\n params = {\n challengeId: challengeId,\n perPage: 5000\n };\n\n\n if (roleId) {\n params = (0, _extends3.default)({}, params, { roleId: roleId });\n }\n\n _context11.next = 12;\n return this.private.apiV5.get('/resources?' + _qs2.default.stringify(params)).then(checkErrorV5).then(function (res) {\n return res.result;\n });\n\n case 12:\n registrants = _context11.sent;\n\n\n /* API will return all roles to currentUser, so need to filter in FE */\n if (roleId) {\n registrants = _lodash2.default.filter(registrants, function (r) {\n return r.roleId === roleId;\n });\n }\n\n return _context11.abrupt('return', registrants || []);\n\n case 15:\n case 'end':\n return _context11.stop();\n }\n }\n }, _callee11, this);\n }));\n\n function getChallengeRegistrants(_x24) {\n return _ref12.apply(this, arguments);\n }\n\n return getChallengeRegistrants;\n }()\n\n /**\n * Gets possible challenge types.\n * @return {Promise} Resolves to the array of subtrack names.\n */\n\n }, {\n key: 'getChallengeTypes',\n value: function getChallengeTypes() {\n return this.private.apiV5.get('/challenge-types').then(function (res) {\n return res.ok ? res.json() : new Error(res.statusText);\n }).then(function (res) {\n return res.message ? new Error(res.message) : res;\n });\n }\n\n /**\n * Get the ID from a challenge type by abbreviation\n * @param {String} abbreviation\n * @return {Promise} ID from first abbreviation match\n */\n\n }, {\n key: 'getChallengeTypeId',\n value: function () {\n var _ref13 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee12(abbreviation) {\n var ret;\n return _regenerator2.default.wrap(function _callee12$(_context12) {\n while (1) {\n switch (_context12.prev = _context12.next) {\n case 0:\n _context12.next = 2;\n return this.private.apiV5.get('/challenge-types?abbreviation=' + abbreviation).then(checkErrorV5).then(function (res) {\n return res;\n });\n\n case 2:\n ret = _context12.sent;\n\n if (!_lodash2.default.isEmpty(ret.result)) {\n _context12.next = 5;\n break;\n }\n\n throw new Error('Challenge typeId not found!');\n\n case 5:\n return _context12.abrupt('return', ret.result[0].id);\n\n case 6:\n case 'end':\n return _context12.stop();\n }\n }\n }, _callee12, this);\n }));\n\n function getChallengeTypeId(_x25) {\n return _ref13.apply(this, arguments);\n }\n\n return getChallengeTypeId;\n }()\n\n /**\n * Gets possible challenge tags (technologies).\n * @return {Promise} Resolves to the array of tag strings.\n */\n\n }, {\n key: 'getChallengeTags',\n value: function getChallengeTags() {\n return this.private.api.get('/technologies').then(function (res) {\n return res.ok ? res.json() : new Error(res.statusText);\n }).then(function (res) {\n return res.result.status === 200 ? res.result.content : new Error(res.result.content);\n });\n }\n\n /**\n * Gets challenges.\n * @param {Object} filters Optional.\n * @param {Object} params Optional.\n * @return {Promise} Resolves to the api response.\n */\n\n }, {\n key: 'getChallenges',\n value: function () {\n var _ref14 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee13(filter) {\n return _regenerator2.default.wrap(function _callee13$(_context13) {\n while (1) {\n switch (_context13.prev = _context13.next) {\n case 0:\n return _context13.abrupt('return', this.private.getChallenges('/challenges/', filter).then(function (res) {\n res.challenges.forEach(function (item) {\n return normalizeChallenge(item);\n });\n return res;\n }));\n\n case 1:\n case 'end':\n return _context13.stop();\n }\n }\n }, _callee13, this);\n }));\n\n function getChallenges(_x26) {\n return _ref14.apply(this, arguments);\n }\n\n return getChallenges;\n }()\n\n /**\n * Gets challenges.\n * @param {Object} filters Optional.\n * @param {Object} params Optional.\n * @param {String} handle user handle\n * @return {Promise} Resolves to the api response.\n */\n\n }, {\n key: 'getRecommendedChallenges',\n value: function () {\n var _ref15 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee14(filter, handle) {\n var query, res, totalCount, url, options, challenges;\n return _regenerator2.default.wrap(function _callee14$(_context14) {\n while (1) {\n switch (_context14.prev = _context14.next) {\n case 0:\n filter.frontFilter.per_page = filter.frontFilter.perPage;\n delete filter.frontFilter.perPage;\n\n query = getFilterUrl(filter.backendFilter, filter.frontFilter);\n res = {};\n totalCount = 0;\n\n if (!(_lodash2.default.some(filter.frontFilter.tracks, function (val) {\n return val;\n }) && !_lodash2.default.isEqual(filter.frontFilter.types, []))) {\n _context14.next = 12;\n break;\n }\n\n url = '/recommender-api/' + handle + '?' + query;\n options = { headers: { 'app-version': CHALLENGE_APP_VERSION } };\n _context14.next = 10;\n return this.private.apiV5.get(url, options).then(checkErrorV5);\n\n case 10:\n res = _context14.sent;\n\n totalCount = res.headers.get('x-total') || 0;\n\n case 12:\n challenges = res.result ? res.result.filter(function (ch) {\n return ch.bucket;\n }) : [];\n return _context14.abrupt('return', {\n challenges: challenges,\n totalCount: totalCount,\n meta: {\n allChallengesCount: totalCount,\n allRecommendedChallengesCount: 0,\n myChallengesCount: 0,\n ongoingChallengesCount: 0,\n openChallengesCount: 0,\n totalCount: totalCount\n }\n });\n\n case 14:\n case 'end':\n return _context14.stop();\n }\n }\n }, _callee14, this);\n }));\n\n function getRecommendedChallenges(_x27, _x28) {\n return _ref15.apply(this, arguments);\n }\n\n return getRecommendedChallenges;\n }()\n\n /**\n * Gets SRM matches.\n * @param {Object} params\n * @return {Promise}\n */\n\n }, {\n key: 'getSrms',\n value: function () {\n var _ref16 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee15(params) {\n var res;\n return _regenerator2.default.wrap(function _callee15$(_context15) {\n while (1) {\n switch (_context15.prev = _context15.next) {\n case 0:\n _context15.next = 2;\n return this.private.api.get('/srms/?' + _qs2.default.stringify(params));\n\n case 2:\n res = _context15.sent;\n return _context15.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n case 4:\n case 'end':\n return _context15.stop();\n }\n }\n }, _callee15, this);\n }));\n\n function getSrms(_x29) {\n return _ref16.apply(this, arguments);\n }\n\n return getSrms;\n }()\n }, {\n key: 'getUserChallenges',\n\n\n /**\n * Gets challenges of the specified user.\n * @param {String} userId User id whose challenges we want to fetch.\n * @return {Promise} Resolves to the api response.\n */\n value: function () {\n var _ref17 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee16(userId, filters, params) {\n var userFilters, query, url, options, userChallenges;\n return _regenerator2.default.wrap(function _callee16$(_context16) {\n while (1) {\n switch (_context16.prev = _context16.next) {\n case 0:\n userFilters = _lodash2.default.cloneDeep(filters);\n\n ChallengesService.updateFiltersParamsForGettingMemberChallenges(userFilters, params);\n\n query = (0, _extends3.default)({}, params, userFilters, {\n memberId: userId\n });\n url = '/challenges?' + _qs2.default.stringify(_lodash2.default.omit(query, ['limit', 'offset', 'technologies']));\n options = { headers: { 'app-version': CHALLENGE_APP_VERSION } };\n _context16.next = 7;\n return this.private.apiV5.get(url, options).then(checkErrorV5).then(function (res) {\n res.result.forEach(function (item) {\n return normalizeChallenge(item, userId);\n });\n return res.result;\n });\n\n case 7:\n userChallenges = _context16.sent;\n return _context16.abrupt('return', {\n challenges: userChallenges,\n totalCount: userChallenges.length\n });\n\n case 9:\n case 'end':\n return _context16.stop();\n }\n }\n }, _callee16, this);\n }));\n\n function getUserChallenges(_x30, _x31, _x32) {\n return _ref17.apply(this, arguments);\n }\n\n return getUserChallenges;\n }()\n\n /**\n * Gets challenges of the specified user from v4 api.\n * @param {String} username User name whose challenges we want to fetch.\n * @return {Promise} Resolves to the api response.\n */\n\n }, {\n key: 'getUserChallengesV4',\n value: function () {\n var _ref18 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee17(username, filters, params) {\n var endpoint, query, url, res;\n return _regenerator2.default.wrap(function _callee17$(_context17) {\n while (1) {\n switch (_context17.prev = _context17.next) {\n case 0:\n endpoint = '/members/' + username.toLowerCase() + '/challenges/';\n query = (0, _extends3.default)({\n filter: _qs2.default.stringify(filters, { encode: false })\n }, params);\n url = endpoint + '?' + _qs2.default.stringify(query);\n _context17.next = 5;\n return this.private.api.get(url).then(checkError);\n\n case 5:\n res = _context17.sent;\n return _context17.abrupt('return', {\n challenges: res.content || [],\n totalCount: res.metadata.totalCount\n });\n\n case 7:\n case 'end':\n return _context17.stop();\n }\n }\n }, _callee17, this);\n }));\n\n function getUserChallengesV4(_x33, _x34, _x35) {\n return _ref18.apply(this, arguments);\n }\n\n return getUserChallengesV4;\n }()\n\n /**\n * Gets user resources.\n * @param {String} userId User id whose challenges we want to fetch.\n * @param {Number} page Current page for paginated API response (default 1)\n * @param {Number} perPage Page size for paginated API response (default 1000)\n * @return {Promise} Resolves to the api response.\n */\n\n }, {\n key: 'getUserResources',\n value: function () {\n var _ref19 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee18(userId) {\n var page = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n var perPage = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1000;\n var res;\n return _regenerator2.default.wrap(function _callee18$(_context18) {\n while (1) {\n switch (_context18.prev = _context18.next) {\n case 0:\n _context18.next = 2;\n return this.private.apiV5.get('/resources/' + userId + '/challenges?page=' + page + '&perPage=' + perPage);\n\n case 2:\n res = _context18.sent;\n return _context18.abrupt('return', res.json());\n\n case 4:\n case 'end':\n return _context18.stop();\n }\n }\n }, _callee18, this);\n }));\n\n function getUserResources(_x36) {\n return _ref19.apply(this, arguments);\n }\n\n return getUserResources;\n }()\n\n /**\n * Gets marathon matches of the specified user.\n * @param {String} memberId User whose challenges we want to fetch.\n * @param {Object} filter\n * @param {Object} params\n * @return {Promise} Resolves to the api response.\n */\n\n }, {\n key: 'getUserMarathonMatches',\n value: function () {\n var _ref20 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee19(memberId, filter, params) {\n var newParams, options, res;\n return _regenerator2.default.wrap(function _callee19$(_context19) {\n while (1) {\n switch (_context19.prev = _context19.next) {\n case 0:\n newParams = (0, _extends3.default)({}, filter, params, {\n tag: 'Marathon Match',\n memberId: memberId\n });\n options = { headers: { 'app-version': CHALLENGE_APP_VERSION } };\n _context19.next = 4;\n return this.private.apiV5.get('/challenges?' + _qs2.default.stringify(newParams), options);\n\n case 4:\n res = _context19.sent;\n return _context19.abrupt('return', res.json());\n\n case 6:\n case 'end':\n return _context19.stop();\n }\n }\n }, _callee19, this);\n }));\n\n function getUserMarathonMatches(_x39, _x40, _x41) {\n return _ref20.apply(this, arguments);\n }\n\n return getUserMarathonMatches;\n }()\n\n /**\n * Gets SRM matches related to the user.\n * @param {String} handle\n * @param {Object} params\n * @return {Promise}\n */\n\n }, {\n key: 'getUserSrms',\n value: function () {\n var _ref21 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee20(handle, params) {\n var url, options, res;\n return _regenerator2.default.wrap(function _callee20$(_context20) {\n while (1) {\n switch (_context20.prev = _context20.next) {\n case 0:\n url = '/members/' + handle + '/srms/?' + _qs2.default.stringify(params);\n options = { headers: { 'app-version': CHALLENGE_APP_VERSION } };\n _context20.next = 4;\n return this.private.api.get(url, options);\n\n case 4:\n res = _context20.sent;\n return _context20.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n case 6:\n case 'end':\n return _context20.stop();\n }\n }\n }, _callee20, this);\n }));\n\n function getUserSrms(_x42, _x43) {\n return _ref21.apply(this, arguments);\n }\n\n return getUserSrms;\n }()\n\n /**\n * Get the Resource Role ID from provided Role Name\n * @param {String} roleName\n * @return {Promise}\n */\n\n }, {\n key: 'getRoleId',\n value: function () {\n var _ref22 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee21(roleName) {\n var params, roles;\n return _regenerator2.default.wrap(function _callee21$(_context21) {\n while (1) {\n switch (_context21.prev = _context21.next) {\n case 0:\n params = {\n name: roleName,\n isActive: true\n };\n _context21.next = 3;\n return this.private.apiV5.get('/resource-roles?' + _qs2.default.stringify(params)).then(checkErrorV5).then(function (res) {\n return res.result;\n });\n\n case 3:\n roles = _context21.sent;\n\n if (!_lodash2.default.isEmpty(roles)) {\n _context21.next = 6;\n break;\n }\n\n throw new Error('Resource Role not found!');\n\n case 6:\n return _context21.abrupt('return', roles[0].id);\n\n case 7:\n case 'end':\n return _context21.stop();\n }\n }\n }, _callee21, this);\n }));\n\n function getRoleId(_x44) {\n return _ref22.apply(this, arguments);\n }\n\n return getRoleId;\n }()\n\n /**\n * Registers user to the specified challenge.\n * @param {String} challengeId\n * @return {Promise}\n */\n\n }, {\n key: 'register',\n value: function () {\n var _ref23 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee22(challengeId) {\n var user, roleId, params, res;\n return _regenerator2.default.wrap(function _callee22$(_context22) {\n while (1) {\n switch (_context22.prev = _context22.next) {\n case 0:\n user = (0, _tcAuthLib.decodeToken)(this.private.tokenV3);\n _context22.next = 3;\n return this.getRoleId('Submitter');\n\n case 3:\n roleId = _context22.sent;\n params = {\n challengeId: challengeId,\n memberHandle: encodeURIComponent(user.handle),\n roleId: roleId\n };\n _context22.next = 7;\n return this.private.apiV5.postJson('/resources', params);\n\n case 7:\n res = _context22.sent;\n\n if (res.ok) {\n _context22.next = 10;\n break;\n }\n\n throw new Error(res.statusText);\n\n case 10:\n return _context22.abrupt('return', res.json());\n\n case 11:\n case 'end':\n return _context22.stop();\n }\n }\n }, _callee22, this);\n }));\n\n function register(_x45) {\n return _ref23.apply(this, arguments);\n }\n\n return register;\n }()\n\n /**\n * Unregisters user from the specified challenge.\n * @param {String} challengeId\n * @return {Promise}\n */\n\n }, {\n key: 'unregister',\n value: function () {\n var _ref24 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee23(challengeId) {\n var user, roleId, params, res;\n return _regenerator2.default.wrap(function _callee23$(_context23) {\n while (1) {\n switch (_context23.prev = _context23.next) {\n case 0:\n user = (0, _tcAuthLib.decodeToken)(this.private.tokenV3);\n _context23.next = 3;\n return this.getRoleId('Submitter');\n\n case 3:\n roleId = _context23.sent;\n params = {\n challengeId: challengeId,\n memberHandle: encodeURIComponent(user.handle),\n roleId: roleId\n };\n _context23.next = 7;\n return this.private.apiV5.delete('/resources', (0, _stringify2.default)(params));\n\n case 7:\n res = _context23.sent;\n\n if (res.ok) {\n _context23.next = 10;\n break;\n }\n\n throw new Error(res.statusText);\n\n case 10:\n return _context23.abrupt('return', res.json());\n\n case 11:\n case 'end':\n return _context23.stop();\n }\n }\n }, _callee23, this);\n }));\n\n function unregister(_x46) {\n return _ref24.apply(this, arguments);\n }\n\n return unregister;\n }()\n\n /**\n * Gets count of user's active challenges.\n * @param {String} handle Topcoder user handle.\n * @return {Action} Resolves to the api response.\n */\n\n }, {\n key: 'getActiveChallengesCount',\n value: function getActiveChallengesCount(handle) {\n var filter = { status: 'Active' };\n var params = { limit: 1, offset: 0 };\n return this.getUserChallenges(handle, filter, params).then(function (res) {\n return res.totalCount;\n });\n }\n\n /**\n * Submits a challenge submission. Uses APIV2 for Development submission\n * and APIV3 for Design submisisons.\n * @param {Object} body\n * @param {String} challengeId\n * @param {String} track Either DESIGN or DEVELOP\n * @return {Promise}\n */\n\n }, {\n key: 'submit',\n value: function submit(body, challengeId, track, onProgress) {\n var api = void 0;\n var contentType = void 0;\n var url = void 0;\n\n if (track === _tc.COMPETITION_TRACKS.DES) {\n api = this.private.api;\n\n contentType = 'application/json';\n url = '/submissions/'; // The submission info is contained entirely in the JSON body\n } else {\n api = this.private.apiV2;\n // contentType = 'multipart/form-data';\n contentType = null;\n url = '/develop/challenges/' + challengeId + '/upload';\n }\n\n return api.upload(url, {\n body: body,\n headers: { 'Content-Type': contentType },\n method: 'POST'\n }, onProgress).then(function (res) {\n var jres = JSON.parse(res);\n // Return result for Develop submission\n if (track === _tc.COMPETITION_TRACKS.DEV) {\n return jres;\n }\n // Design Submission requires an extra \"Processing\" POST\n var procId = jres.result.content.id;\n return api.upload('/submissions/' + procId + '/process/', {\n body: (0, _stringify2.default)({ param: jres.result.content }),\n headers: { 'Content-Type': contentType },\n method: 'POST'\n }, onProgress).then(function (procres) {\n return JSON.parse(procres);\n });\n }, function (err) {\n _logger2.default.error('Failed to submit to the challenge #' + challengeId, err);\n throw err;\n });\n }\n\n /**\n * Updates the challenge (saves the give challenge to the API).\n * @param {Object} challenge\n * @param {String} tokenV3\n * @return {Promise}\n */\n\n }, {\n key: 'updateChallenge',\n value: function () {\n var _ref25 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee24(challenge) {\n var url, res;\n return _regenerator2.default.wrap(function _callee24$(_context24) {\n while (1) {\n switch (_context24.prev = _context24.next) {\n case 0:\n url = '/challenges/' + challenge.id;\n _context24.next = 3;\n return this.private.apiV5.put(url, challenge);\n\n case 3:\n res = _context24.sent;\n\n if (res.ok) {\n _context24.next = 6;\n break;\n }\n\n throw new Error(res.statusText);\n\n case 6:\n _context24.next = 8;\n return res.json();\n\n case 8:\n res = _context24.sent.result;\n\n if (!(res.status !== 200)) {\n _context24.next = 11;\n break;\n }\n\n throw new Error(res.content);\n\n case 11:\n return _context24.abrupt('return', res.content);\n\n case 12:\n case 'end':\n return _context24.stop();\n }\n }\n }, _callee24, this);\n }));\n\n function updateChallenge(_x47) {\n return _ref25.apply(this, arguments);\n }\n\n return updateChallenge;\n }()\n\n /**\n * Gets roles of a user in the specified challenge. The user tested is\n * the owner of authentication token used to instantiate the service.\n *\n * Notice, if you have already loaded the challenge as that user, these roles\n * are attached to the challenge object under `userDetails.roles` path during\n * challenge normalization. However, if you have not, this method is the most\n * efficient way to get them, as it by-passes any unnecessary normalizations\n * of the challenge object.\n *\n * @param {Number} challengeId Challenge ID.\n */\n\n }, {\n key: 'getUserRolesInChallenge',\n value: function () {\n var _ref26 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee25(challengeId) {\n var user, url, getResourcesResponse, resources;\n return _regenerator2.default.wrap(function _callee25$(_context25) {\n while (1) {\n switch (_context25.prev = _context25.next) {\n case 0:\n user = (0, _tcAuthLib.decodeToken)(this.private.tokenV3);\n url = '/resources?challengeId=' + challengeId + '&memberHandle=' + user.handle;\n _context25.next = 4;\n return this.private.apiV5.get(url);\n\n case 4:\n getResourcesResponse = _context25.sent;\n _context25.next = 7;\n return getResourcesResponse.json();\n\n case 7:\n resources = _context25.sent;\n\n if (!resources) {\n _context25.next = 10;\n break;\n }\n\n return _context25.abrupt('return', _lodash2.default.map(_lodash2.default.filter(resources, function (r) {\n return r.memberHandle === user.handle;\n }), 'roleId'));\n\n case 10:\n throw new Error('Failed to fetch user role from challenge #' + challengeId);\n\n case 11:\n case 'end':\n return _context25.stop();\n }\n }\n }, _callee25, this);\n }));\n\n function getUserRolesInChallenge(_x48) {\n return _ref26.apply(this, arguments);\n }\n\n return getUserRolesInChallenge;\n }()\n }, {\n key: '__reactstandin__regenerateByEval',\n // @ts-ignore\n value: function __reactstandin__regenerateByEval(key, code) {\n // @ts-ignore\n this[key] = eval(code);\n }\n }], [{\n key: 'updateFiltersParamsForGettingMemberChallenges',\n value: function updateFiltersParamsForGettingMemberChallenges(filters, params) {\n if (params && params.perPage) {\n // eslint-disable-next-line no-param-reassign\n params.offset = (params.page - 1) * params.perPage;\n // eslint-disable-next-line no-param-reassign\n params.limit = params.perPage;\n }\n }\n }]);\n return ChallengesService;\n}();\n\nvar lastInstance = null;\n/**\n * Returns a new or existing challenges service.\n * @param {String} tokenV3 Optional. Auth token for Topcoder API v3.\n * @param {String} tokenV2 Optional. Auth token for Topcoder API v2.\n * @return {ChallengesService} Challenges service object\n */\nfunction getService(tokenV3, tokenV2) {\n if (!lastInstance || lastInstance.private.tokenV3 !== tokenV3 || lastInstance.tokenV2 !== tokenV2) {\n lastInstance = new ChallengesService(tokenV3, tokenV2);\n }\n return lastInstance;\n}\n\n/* Using default export would be confusing in this case. */\nvar _default = undefined;\nexports.default = _default;\n;\n\n(function () {\n var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n if (!reactHotLoader) {\n return;\n }\n\n reactHotLoader.register(CHALLENGE_APP_VERSION, 'CHALLENGE_APP_VERSION', '/Users/hentrymartin/development/topcoder-react-lib/src/services/challenges.js');\n reactHotLoader.register(getFilterUrl, 'getFilterUrl', '/Users/hentrymartin/development/topcoder-react-lib/src/services/challenges.js');\n reactHotLoader.register(ORDER_BY, 'ORDER_BY', '/Users/hentrymartin/development/topcoder-react-lib/src/services/challenges.js');\n reactHotLoader.register(normalizeChallenge, 'normalizeChallenge', '/Users/hentrymartin/development/topcoder-react-lib/src/services/challenges.js');\n reactHotLoader.register(checkError, 'checkError', '/Users/hentrymartin/development/topcoder-react-lib/src/services/challenges.js');\n reactHotLoader.register(checkErrorV5, 'checkErrorV5', '/Users/hentrymartin/development/topcoder-react-lib/src/services/challenges.js');\n reactHotLoader.register(ChallengesService, 'ChallengesService', '/Users/hentrymartin/development/topcoder-react-lib/src/services/challenges.js');\n reactHotLoader.register(lastInstance, 'lastInstance', '/Users/hentrymartin/development/topcoder-react-lib/src/services/challenges.js');\n reactHotLoader.register(getService, 'getService', '/Users/hentrymartin/development/topcoder-react-lib/src/services/challenges.js');\n reactHotLoader.register(_default, 'default', '/Users/hentrymartin/development/topcoder-react-lib/src/services/challenges.js');\n})();\n\n;\n\n(function () {\n var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/services/challenges.js?"); /***/ }), @@ -1258,7 +1258,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex /***/ (function(module, exports, __webpack_require__) { "use strict"; -eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _toConsumableArray2 = __webpack_require__(/*! babel-runtime/helpers/toConsumableArray */ \"babel-runtime/helpers/toConsumableArray\");\n\nvar _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);\n\nexports.getProvisionalScore = getProvisionalScore;\nexports.getFinalScore = getFinalScore;\nexports.processMMSubmissions = processMMSubmissions;\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n return a;\n}; /**\n * Various submissions functions.\n */\n/* global CONFIG */\n/* eslint-disable no-param-reassign */\n\n\nvar _CONFIG = {\"AV_SCAN_SCORER_REVIEW_TYPE_ID\":\"68c5a381-c8ab-48af-92a7-7a869a4ee6c3\",\"PROVISIONAL_SCORING_COMPLETED_REVIEW_TYPE_ID\":\"52c91e85-745f-4e62-b592-9879a2dfe9fd\",\"PAGE_SIZE\":50,\"REVIEW_OPPORTUNITY_PAGE_SIZE\":1000,\"CHALLENGE_APP_VERSION\":\"1.1.0\"},\n AV_SCAN_SCORER_REVIEW_TYPE_ID = _CONFIG.AV_SCAN_SCORER_REVIEW_TYPE_ID,\n PROVISIONAL_SCORING_COMPLETED_REVIEW_TYPE_ID = _CONFIG.PROVISIONAL_SCORING_COMPLETED_REVIEW_TYPE_ID;\n\n\nfunction removeDecimal(num) {\n var re = new RegExp('^-?\\\\d+');\n return num.toString().match(re)[0];\n}\n\nfunction toAcurateFixed(num, decimal) {\n var re = new RegExp('^-?\\\\d+(?:.\\\\d{0,' + decimal + '})?');\n return num.toString().match(re)[0];\n}\n\nfunction toFixed(num, decimal) {\n if (_lodash2.default.isNaN(parseFloat(num))) return num;\n num = parseFloat(num);\n\n var result = _lodash2.default.toFinite(toAcurateFixed(num, decimal));\n var integerResult = _lodash2.default.toFinite(removeDecimal(num));\n\n if (_lodash2.default.isInteger(result)) {\n return integerResult;\n }\n return result;\n}\n\n/**\n * Process each submission rank of MM challenge\n * @param submissions the array of submissions\n */\nfunction processRanks(submissions) {\n var maxFinalScore = 0;\n submissions.sort(function (a, b) {\n var pA = _lodash2.default.get(a, 'submissions[0]', { provisionalScore: 0 }).provisionalScore;\n var pB = _lodash2.default.get(b, 'submissions[0]', { provisionalScore: 0 }).provisionalScore;\n if (pA === '-') pA = 0;\n if (pB === '-') pB = 0;\n if (pA === pB) {\n var timeA = new Date(_lodash2.default.get(a, 'submissions[0].submissionTime'));\n var timeB = new Date(_lodash2.default.get(b, 'submissions[0].submissionTime'));\n return timeA - timeB;\n }\n return pB - pA;\n });\n _lodash2.default.each(submissions, function (submission, i) {\n submissions[i].provisionalRank = i + 1;\n });\n\n submissions.sort(function (a, b) {\n var pA = _lodash2.default.get(a, 'submissions[0]', { finalScore: 0 }).finalScore;\n var pB = _lodash2.default.get(b, 'submissions[0]', { finalScore: 0 }).finalScore;\n if (pA === '-') pA = 0;\n if (pB === '-') pB = 0;\n if (pA > 0) maxFinalScore = pA;\n if (pB > 0) maxFinalScore = pB;\n if (pA === pB) {\n var timeA = new Date(_lodash2.default.get(a, 'submissions[0].submissionTime'));\n var timeB = new Date(_lodash2.default.get(b, 'submissions[0].submissionTime'));\n return timeA - timeB;\n }\n return pB - pA;\n });\n if (maxFinalScore > 0) {\n _lodash2.default.each(submissions, function (submission, i) {\n submissions[i].finalRank = i + 1;\n });\n }\n return { submissions: submissions, maxFinalScore: maxFinalScore };\n}\n\n/**\n * Get provisional score of submission\n * @param submission\n */\nfunction getProvisionalScore(submission) {\n var subs = submission.submissions;\n\n if (!subs || subs.length === 0) {\n return 0;\n }\n var provisionalScore = subs[0].provisionalScore;\n\n if (!provisionalScore || provisionalScore < 0) {\n return 0;\n }\n return provisionalScore;\n}\n\n/**\n * Get final score of submission\n * @param submission\n */\nfunction getFinalScore(submission) {\n var subs = submission.submissions;\n\n if (!subs || subs.length === 0) {\n return 0;\n }\n var finalScore = subs[0].finalScore;\n\n if (!finalScore || finalScore < 0) {\n return 0;\n }\n return finalScore;\n}\n\n/**\n * Process submissions of MM challenge\n * @param submissions the array of submissions\n * @param resources the challenge resources\n * @param registrants the challenge registrants\n */\nfunction processMMSubmissions(submissions) {\n var data = {};\n var result = [];\n\n _lodash2.default.each(submissions, function (submission) {\n var memberId = submission.memberId;\n\n if (!data[memberId]) {\n data[memberId] = [];\n }\n var validReviews = _lodash2.default.reject(submission.review, ['typeId', AV_SCAN_SCORER_REVIEW_TYPE_ID]);\n validReviews.sort(function (a, b) {\n var dateA = new Date(a.created);\n var dateB = new Date(b.created);\n return dateB - dateA;\n });\n\n var provisionalScoringIsCompleted = _lodash2.default.some(submission.review, { typeId: PROVISIONAL_SCORING_COMPLETED_REVIEW_TYPE_ID });\n\n var provisionalScore = toFixed(_lodash2.default.get(validReviews, '[0].score', '-'), 5);\n var finalScore = toFixed(_lodash2.default.get(submission, 'reviewSummation[0].aggregateScore', '-'), 5);\n\n data[memberId].push({\n submissionId: submission.id,\n submissionTime: submission.created,\n provisionalScore: provisionalScore,\n finalScore: finalScore,\n provisionalScoringIsCompleted: provisionalScoringIsCompleted,\n review: submission.review\n });\n });\n\n _lodash2.default.each(data, function (value, key) {\n result.push({\n submissions: [].concat((0, _toConsumableArray3.default)(value.sort(function (a, b) {\n return new Date(b.submissionTime).getTime() - new Date(a.submissionTime).getTime();\n }))),\n memberId: key\n });\n });\n\n var _processRanks = processRanks(result),\n finalSubmissions = _processRanks.submissions,\n maxFinalScore = _processRanks.maxFinalScore;\n\n finalSubmissions.sort(function (a, b) {\n if (maxFinalScore === 0) {\n return a.provisionalRank - b.provisionalRank;\n }\n return a.finalRank - b.finalRank;\n });\n\n return finalSubmissions;\n}\n\nvar _default = undefined;\nexports.default = _default;\n;\n\n(function () {\n var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n if (!reactHotLoader) {\n return;\n }\n\n reactHotLoader.register(AV_SCAN_SCORER_REVIEW_TYPE_ID, 'AV_SCAN_SCORER_REVIEW_TYPE_ID', '/Users/hentrymartin/development/topcoder-react-lib/src/utils/submission.js');\n reactHotLoader.register(PROVISIONAL_SCORING_COMPLETED_REVIEW_TYPE_ID, 'PROVISIONAL_SCORING_COMPLETED_REVIEW_TYPE_ID', '/Users/hentrymartin/development/topcoder-react-lib/src/utils/submission.js');\n reactHotLoader.register(removeDecimal, 'removeDecimal', '/Users/hentrymartin/development/topcoder-react-lib/src/utils/submission.js');\n reactHotLoader.register(toAcurateFixed, 'toAcurateFixed', '/Users/hentrymartin/development/topcoder-react-lib/src/utils/submission.js');\n reactHotLoader.register(toFixed, 'toFixed', '/Users/hentrymartin/development/topcoder-react-lib/src/utils/submission.js');\n reactHotLoader.register(processRanks, 'processRanks', '/Users/hentrymartin/development/topcoder-react-lib/src/utils/submission.js');\n reactHotLoader.register(getProvisionalScore, 'getProvisionalScore', '/Users/hentrymartin/development/topcoder-react-lib/src/utils/submission.js');\n reactHotLoader.register(getFinalScore, 'getFinalScore', '/Users/hentrymartin/development/topcoder-react-lib/src/utils/submission.js');\n reactHotLoader.register(processMMSubmissions, 'processMMSubmissions', '/Users/hentrymartin/development/topcoder-react-lib/src/utils/submission.js');\n reactHotLoader.register(_default, 'default', '/Users/hentrymartin/development/topcoder-react-lib/src/utils/submission.js');\n})();\n\n;\n\n(function () {\n var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/utils/submission.js?"); +eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _toConsumableArray2 = __webpack_require__(/*! babel-runtime/helpers/toConsumableArray */ \"babel-runtime/helpers/toConsumableArray\");\n\nvar _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);\n\nexports.getProvisionalScore = getProvisionalScore;\nexports.getFinalScore = getFinalScore;\nexports.processMMSubmissions = processMMSubmissions;\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n return a;\n}; /**\n * Various submissions functions.\n */\n/* global CONFIG */\n/* eslint-disable no-param-reassign */\n\n\nvar _CONFIG = {\"AV_SCAN_SCORER_REVIEW_TYPE_ID\":\"1297f2db-687d-4ac8-bf9c-78b6df1b1281\",\"PROVISIONAL_SCORING_COMPLETED_REVIEW_TYPE_ID\":\"52c91e85-745f-4e62-b592-9879a2dfe9fd\",\"PAGE_SIZE\":50,\"REVIEW_OPPORTUNITY_PAGE_SIZE\":1000,\"CHALLENGE_APP_VERSION\":\"1.1.0\"},\n AV_SCAN_SCORER_REVIEW_TYPE_ID = _CONFIG.AV_SCAN_SCORER_REVIEW_TYPE_ID,\n PROVISIONAL_SCORING_COMPLETED_REVIEW_TYPE_ID = _CONFIG.PROVISIONAL_SCORING_COMPLETED_REVIEW_TYPE_ID;\n\n\nfunction removeDecimal(num) {\n var re = new RegExp('^-?\\\\d+');\n return num.toString().match(re)[0];\n}\n\nfunction toAcurateFixed(num, decimal) {\n var re = new RegExp('^-?\\\\d+(?:.\\\\d{0,' + decimal + '})?');\n return num.toString().match(re)[0];\n}\n\nfunction toFixed(num, decimal) {\n if (_lodash2.default.isNaN(parseFloat(num))) return num;\n num = parseFloat(num);\n\n var result = _lodash2.default.toFinite(toAcurateFixed(num, decimal));\n var integerResult = _lodash2.default.toFinite(removeDecimal(num));\n\n if (_lodash2.default.isInteger(result)) {\n return integerResult;\n }\n return result;\n}\n\n/**\n * Process each submission rank of MM challenge\n * @param submissions the array of submissions\n */\nfunction processRanks(submissions) {\n var maxFinalScore = 0;\n submissions.sort(function (a, b) {\n var pA = _lodash2.default.get(a, 'submissions[0]', { provisionalScore: 0 }).provisionalScore;\n var pB = _lodash2.default.get(b, 'submissions[0]', { provisionalScore: 0 }).provisionalScore;\n if (pA === '-') pA = 0;\n if (pB === '-') pB = 0;\n if (pA === pB) {\n var timeA = new Date(_lodash2.default.get(a, 'submissions[0].submissionTime'));\n var timeB = new Date(_lodash2.default.get(b, 'submissions[0].submissionTime'));\n return timeA - timeB;\n }\n return pB - pA;\n });\n _lodash2.default.each(submissions, function (submission, i) {\n submissions[i].provisionalRank = i + 1;\n });\n\n submissions.sort(function (a, b) {\n var pA = _lodash2.default.get(a, 'submissions[0]', { finalScore: 0 }).finalScore;\n var pB = _lodash2.default.get(b, 'submissions[0]', { finalScore: 0 }).finalScore;\n if (pA === '-') pA = 0;\n if (pB === '-') pB = 0;\n if (pA > 0) maxFinalScore = pA;\n if (pB > 0) maxFinalScore = pB;\n if (pA === pB) {\n var timeA = new Date(_lodash2.default.get(a, 'submissions[0].submissionTime'));\n var timeB = new Date(_lodash2.default.get(b, 'submissions[0].submissionTime'));\n return timeA - timeB;\n }\n return pB - pA;\n });\n if (maxFinalScore > 0) {\n _lodash2.default.each(submissions, function (submission, i) {\n submissions[i].finalRank = i + 1;\n });\n }\n return { submissions: submissions, maxFinalScore: maxFinalScore };\n}\n\n/**\n * Get provisional score of submission\n * @param submission\n */\nfunction getProvisionalScore(submission) {\n var subs = submission.submissions;\n\n if (!subs || subs.length === 0) {\n return 0;\n }\n var provisionalScore = subs[0].provisionalScore;\n\n if (!provisionalScore || provisionalScore < 0) {\n return 0;\n }\n return provisionalScore;\n}\n\n/**\n * Get final score of submission\n * @param submission\n */\nfunction getFinalScore(submission) {\n var subs = submission.submissions;\n\n if (!subs || subs.length === 0) {\n return 0;\n }\n var finalScore = subs[0].finalScore;\n\n if (!finalScore || finalScore < 0) {\n return 0;\n }\n return finalScore;\n}\n\n/**\n * Process submissions of MM challenge\n * @param submissions the array of submissions\n * @param resources the challenge resources\n * @param registrants the challenge registrants\n */\nfunction processMMSubmissions(submissions) {\n var data = {};\n var result = [];\n\n _lodash2.default.each(submissions, function (submission) {\n var memberId = submission.memberId;\n\n if (!data[memberId]) {\n data[memberId] = [];\n }\n var validReviews = _lodash2.default.reject(submission.review, ['typeId', AV_SCAN_SCORER_REVIEW_TYPE_ID]);\n validReviews.sort(function (a, b) {\n var dateA = new Date(a.created);\n var dateB = new Date(b.created);\n return dateB - dateA;\n });\n\n var provisionalScoringIsCompleted = _lodash2.default.some(submission.review, { typeId: PROVISIONAL_SCORING_COMPLETED_REVIEW_TYPE_ID });\n\n var provisionalScore = toFixed(_lodash2.default.get(validReviews, '[0].score', '-'), 5);\n var finalScore = toFixed(_lodash2.default.get(submission, 'reviewSummation[0].aggregateScore', '-'), 5);\n\n data[memberId].push({\n submissionId: submission.id,\n submissionTime: submission.created,\n provisionalScore: provisionalScore,\n finalScore: finalScore,\n provisionalScoringIsCompleted: provisionalScoringIsCompleted,\n review: submission.review\n });\n });\n\n _lodash2.default.each(data, function (value, key) {\n result.push({\n submissions: [].concat((0, _toConsumableArray3.default)(value.sort(function (a, b) {\n return new Date(b.submissionTime).getTime() - new Date(a.submissionTime).getTime();\n }))),\n memberId: key\n });\n });\n\n var _processRanks = processRanks(result),\n finalSubmissions = _processRanks.submissions,\n maxFinalScore = _processRanks.maxFinalScore;\n\n finalSubmissions.sort(function (a, b) {\n if (maxFinalScore === 0) {\n return a.provisionalRank - b.provisionalRank;\n }\n return a.finalRank - b.finalRank;\n });\n\n return finalSubmissions;\n}\n\nvar _default = undefined;\nexports.default = _default;\n;\n\n(function () {\n var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n if (!reactHotLoader) {\n return;\n }\n\n reactHotLoader.register(AV_SCAN_SCORER_REVIEW_TYPE_ID, 'AV_SCAN_SCORER_REVIEW_TYPE_ID', '/Users/hentrymartin/development/topcoder-react-lib/src/utils/submission.js');\n reactHotLoader.register(PROVISIONAL_SCORING_COMPLETED_REVIEW_TYPE_ID, 'PROVISIONAL_SCORING_COMPLETED_REVIEW_TYPE_ID', '/Users/hentrymartin/development/topcoder-react-lib/src/utils/submission.js');\n reactHotLoader.register(removeDecimal, 'removeDecimal', '/Users/hentrymartin/development/topcoder-react-lib/src/utils/submission.js');\n reactHotLoader.register(toAcurateFixed, 'toAcurateFixed', '/Users/hentrymartin/development/topcoder-react-lib/src/utils/submission.js');\n reactHotLoader.register(toFixed, 'toFixed', '/Users/hentrymartin/development/topcoder-react-lib/src/utils/submission.js');\n reactHotLoader.register(processRanks, 'processRanks', '/Users/hentrymartin/development/topcoder-react-lib/src/utils/submission.js');\n reactHotLoader.register(getProvisionalScore, 'getProvisionalScore', '/Users/hentrymartin/development/topcoder-react-lib/src/utils/submission.js');\n reactHotLoader.register(getFinalScore, 'getFinalScore', '/Users/hentrymartin/development/topcoder-react-lib/src/utils/submission.js');\n reactHotLoader.register(processMMSubmissions, 'processMMSubmissions', '/Users/hentrymartin/development/topcoder-react-lib/src/utils/submission.js');\n reactHotLoader.register(_default, 'default', '/Users/hentrymartin/development/topcoder-react-lib/src/utils/submission.js');\n})();\n\n;\n\n(function () {\n var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/utils/submission.js?"); /***/ }), pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy