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?"); /***/ }),