diff --git a/__tests__/__snapshots__/index.js.snap b/__tests__/__snapshots__/index.js.snap
index 180895cd..47276ed3 100644
--- a/__tests__/__snapshots__/index.js.snap
+++ b/__tests__/__snapshots__/index.js.snap
@@ -69,6 +69,7 @@ Object {
"dropAll": [Function],
"getAchievementsDone": [Function],
"getAchievementsInit": [Function],
+ "getAchievementsV3Done": [Function],
"getActiveChallengesDone": [Function],
"getActiveChallengesInit": [Function],
"getFinancesDone": [Function],
@@ -98,6 +99,7 @@ Object {
"deleteWebLinkInit": [Function],
"getAchievementsDone": [Function],
"getAchievementsInit": [Function],
+ "getAchievementsV3Done": [Function],
"getCredentialDone": [Function],
"getCredentialInit": [Function],
"getEmailPreferencesDone": [Function],
@@ -206,14 +208,17 @@ Object {
"countReset": [Function],
"debug": [Function],
"dir": [Function],
+ "dirxml": [Function],
"error": [Function],
"group": [Function],
"groupCollapsed": [Function],
"groupEnd": [Function],
"info": [Function],
"log": [Function],
+ "table": [Function],
"time": [Function],
"timeEnd": [Function],
+ "timeLog": [Function],
"trace": [Function],
"warn": [Function],
},
diff --git a/__tests__/actions/__snapshots__/profile.js.snap b/__tests__/actions/__snapshots__/profile.js.snap
index 3ae1356e..b784f238 100644
--- a/__tests__/actions/__snapshots__/profile.js.snap
+++ b/__tests__/actions/__snapshots__/profile.js.snap
@@ -14,6 +14,7 @@ Object {
"deleteWebLinkInit": [Function],
"getAchievementsDone": [Function],
"getAchievementsInit": [Function],
+ "getAchievementsV3Done": [Function],
"getCredentialDone": [Function],
"getCredentialInit": [Function],
"getEmailPreferencesDone": [Function],
diff --git a/docs/actions.members.md b/docs/actions.members.md
index 7a04f558..0a0e18e8 100644
--- a/docs/actions.members.md
+++ b/docs/actions.members.md
@@ -9,6 +9,7 @@ Actions related to members data.
* [.dropAll()](#module_actions.members.dropAll) ⇒ Action
* [.getAchievementsInit(handle, uuid)](#module_actions.members.getAchievementsInit) ⇒ Action
* [.getAchievementsDone(handle, uuid)](#module_actions.members.getAchievementsDone) ⇒ Action
+ * [.getAchievementsV3Done(handle, uuid)](#module_actions.members.getAchievementsV3Done) ⇒ Action
* [.getFinancesInit(handle, uuid)](#module_actions.members.getFinancesInit) ⇒ Action
* [.getFinancesDone(handle, uuid, tokenV3)](#module_actions.members.getFinancesDone) ⇒ Action
* [.getStatsInit(handle, uuid)](#module_actions.members.getStatsInit) ⇒ Action
@@ -55,7 +56,19 @@ Creates an action that signals beginning of member achievements
### actions.members.getAchievementsDone(handle, uuid) ⇒ Action
-Creates an action that loads member achievements.
+Creates an action that loads member achievements from v2 API.
+
+**Kind**: static method of [actions.members
](#module_actions.members)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| handle | String
| Member handle. |
+| uuid | String
| Loading operation |
+
+
+
+### actions.members.getAchievementsV3Done(handle, uuid) ⇒ Action
+Creates an action that loads member achievements from v3 API.
**Kind**: static method of [actions.members
](#module_actions.members)
diff --git a/docs/actions.profile.md b/docs/actions.profile.md
index 528d0612..9129918d 100644
--- a/docs/actions.profile.md
+++ b/docs/actions.profile.md
@@ -14,6 +14,7 @@ Actions for interactions with profile details API.
* [.clearProfile()](#module_actions.profile.clearProfile) ⇒ Action
* [.getAchievementsInit()](#module_actions.profile.getAchievementsInit) ⇒ Action
* [.getAchievementsDone(handle)](#module_actions.profile.getAchievementsDone) ⇒ Action
+ * [.getAchievementsV3Done(handle)](#module_actions.profile.getAchievementsV3Done) ⇒ Action
* [.getExternalAccountsInit()](#module_actions.profile.getExternalAccountsInit) ⇒ Action
* [.getExternalAccountsDone(handle)](#module_actions.profile.getExternalAccountsDone) ⇒ Action
* [.getExternalLinksInit()](#module_actions.profile.getExternalLinksInit) ⇒ Action
@@ -94,7 +95,7 @@ Creates an action that signals beginning of user achievements loading.
### actions.profile.getAchievementsDone(handle) ⇒ Action
-Creates an action that loads user achievements.
+Creates an action that loads user achievements from v2 API.
**Kind**: static method of [actions.profile
](#module_actions.profile)
**Todo**
@@ -106,6 +107,13 @@ Creates an action that loads user achievements.
| --- | --- | --- |
| handle | String
| User handle. |
+
+
+### actions.profile.getAchievementsV3Done(handle) ⇒ Action
+Creates an action that loads user achievements from V3 API.
+
+**Kind**: static method of [actions.profile
](#module_actions.profile)
+
### actions.profile.getExternalAccountsInit() ⇒ Action
diff --git a/docs/reducers.members.md b/docs/reducers.members.md
index 4d75fcfc..56811eb3 100644
--- a/docs/reducers.members.md
+++ b/docs/reducers.members.md
@@ -17,6 +17,7 @@ Reducer for the Redux store segment that holds members data.
* [~onDropAll()](#module_reducers.members..onDropAll) ⇒ Object
* [~onGetAchievementsInit(state)](#module_reducers.members..onGetAchievementsInit) ⇒ Object
* [~onGetAchievementsDone(state, error)](#module_reducers.members..onGetAchievementsDone) ⇒ Object
+ * [~onGetAchievementsV3Done(state, error)](#module_reducers.members..onGetAchievementsV3Done) ⇒ Object
* [~onGetFinancesInit(state)](#module_reducers.members..onGetFinancesInit) ⇒ Object
* [~onGetFinancesDone(state, action)](#module_reducers.members..onGetFinancesDone) ⇒ Object
* [~onGetStatsInit(state, action)](#module_reducers.members..onGetStatsInit) ⇒ Object
@@ -81,7 +82,23 @@ Inits the loading of member achievements.
### reducers.members~onGetAchievementsDone(state, error) ⇒ Object
-Finalizes the loading of member achievements.
+Finalizes the loading of member achievements from v2 API.
+
+**Kind**: inner method of [reducers.members
](#module_reducers.members)
+**Returns**: Object
- New state.
+
+| Param | Type |
+| --- | --- |
+| state | Object
|
+| error | Object
|
+| payload.data | Array
|
+| payload.handle | String
|
+| payload.uuid | String
|
+
+
+
+### reducers.members~onGetAchievementsV3Done(state, error) ⇒ Object
+Finalizes the loading of member achievements from v3 API.
**Kind**: inner method of [reducers.members
](#module_reducers.members)
**Returns**: Object
- New state.
diff --git a/docs/reducers.profile.md b/docs/reducers.profile.md
index 43d9ad78..21ae1d12 100644
--- a/docs/reducers.profile.md
+++ b/docs/reducers.profile.md
@@ -14,6 +14,7 @@ Actions for interactions with profile details API.
* [.clearProfile()](#module_actions.profile.clearProfile) ⇒ Action
* [.getAchievementsInit()](#module_actions.profile.getAchievementsInit) ⇒ Action
* [.getAchievementsDone(handle)](#module_actions.profile.getAchievementsDone) ⇒ Action
+ * [.getAchievementsV3Done(handle)](#module_actions.profile.getAchievementsV3Done) ⇒ Action
* [.getExternalAccountsInit()](#module_actions.profile.getExternalAccountsInit) ⇒ Action
* [.getExternalAccountsDone(handle)](#module_actions.profile.getExternalAccountsDone) ⇒ Action
* [.getExternalLinksInit()](#module_actions.profile.getExternalLinksInit) ⇒ Action
@@ -94,7 +95,22 @@ Creates an action that signals beginning of user achievements loading.
### actions.profile.getAchievementsDone(handle) ⇒ Action
-Creates an action that loads user achievements.
+Creates an action that loads user achievements from v2 API.
+
+**Kind**: static method of [actions.profile
](#module_actions.profile)
+**Todo**
+
+- [ ] This duplicates similar action in [actions.members.md](actions.members.md)!
+
+
+| Param | Type | Description |
+| --- | --- | --- |
+| handle | String
| User handle. |
+
+
+
+### actions.profile.getAchievementsV3Done(handle) ⇒ Action
+Creates an action that loads user achievements from v3 API.
**Kind**: static method of [actions.profile
](#module_actions.profile)
**Todo**
diff --git a/docs/services.user.md b/docs/services.user.md
index de282529..fc039b68 100644
--- a/docs/services.user.md
+++ b/docs/services.user.md
@@ -14,6 +14,7 @@ The User service provides functionality related to Topcoder user
* [new User(tokenV3, tokenV2)](#new_module_services.user..User_new)
* [.getAchievements(username)](#module_services.user..User+getAchievements) ⇒ Object
* [.getUserPublic(username)](#module_services.user..User+getUserPublic) ⇒ Object
+ * [.getUserPublicV3(username)](#module_services.user..User+getUserPublicV3) ⇒ Object
* [.getUser(username)](#module_services.user..User+getUser) ⇒ Promise
* [.getEmailPreferences(userId)](#module_services.user..User+getEmailPreferences) ⇒ Promise
* [.saveEmailPreferences(user, preferences)](#module_services.user..User+saveEmailPreferences) ⇒ Promise
@@ -54,6 +55,7 @@ Service class.
* [new User(tokenV3, tokenV2)](#new_module_services.user..User_new)
* [.getAchievements(username)](#module_services.user..User+getAchievements) ⇒ Object
* [.getUserPublic(username)](#module_services.user..User+getUserPublic) ⇒ Object
+ * [.getUserPublicV3(username)](#module_services.user..User+getUserPublicV3) ⇒ Object
* [.getUser(username)](#module_services.user..User+getUser) ⇒ Promise
* [.getEmailPreferences(userId)](#module_services.user..User+getEmailPreferences) ⇒ Promise
* [.saveEmailPreferences(user, preferences)](#module_services.user..User+saveEmailPreferences) ⇒ Promise
@@ -88,7 +90,18 @@ Gets user achievements. Does not need auth.
#### user.getUserPublic(username) ⇒ Object
-Gets public user info. Does not need auth.
+Gets public user info from v2 API. Does not need auth.
+
+**Kind**: instance method of [User
](#module_services.user..User)
+
+| Param | Type |
+| --- | --- |
+| username | String
|
+
+
+
+#### user.getUserPublicV3(username) ⇒ Object
+Gets public user info from v3 API. Does not need auth.
**Kind**: instance method of [User
](#module_services.user..User)
diff --git a/docs/tc.md b/docs/tc.md
index e1e92105..8e060798 100644
--- a/docs/tc.md
+++ b/docs/tc.md
@@ -21,7 +21,7 @@ Review Opportunity types
### tc.getApiResponsePayload(res) ⇒ Promise
-Gets payload from a standard success response from TC API; or throws
+Gets payload from a standard success response from TC v2 API; or throws
an error in case of a failure response.
**Kind**: static method of [tc
](#module_tc)
diff --git a/package-lock.json b/package-lock.json
index 05183fd7..abdb3ada 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -6849,8 +6849,7 @@
"ansi-regex": {
"version": "2.1.1",
"resolved": false,
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
- "optional": true
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
},
"aproba": {
"version": "1.2.0",
@@ -6871,14 +6870,12 @@
"balanced-match": {
"version": "1.0.0",
"resolved": false,
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
- "optional": true
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
},
"brace-expansion": {
"version": "1.1.11",
"resolved": false,
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "optional": true,
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
@@ -6893,20 +6890,17 @@
"code-point-at": {
"version": "1.1.0",
"resolved": false,
- "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
- "optional": true
+ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
},
"concat-map": {
"version": "0.0.1",
"resolved": false,
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
- "optional": true
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
},
"console-control-strings": {
"version": "1.1.0",
"resolved": false,
- "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
- "optional": true
+ "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4="
},
"core-util-is": {
"version": "1.0.2",
@@ -7023,8 +7017,7 @@
"inherits": {
"version": "2.0.3",
"resolved": false,
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
- "optional": true
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
},
"ini": {
"version": "1.3.5",
@@ -7036,7 +7029,6 @@
"version": "1.0.0",
"resolved": false,
"integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
- "optional": true,
"requires": {
"number-is-nan": "^1.0.0"
}
@@ -7051,7 +7043,6 @@
"version": "3.0.4",
"resolved": false,
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "optional": true,
"requires": {
"brace-expansion": "^1.1.7"
}
@@ -7059,14 +7050,12 @@
"minimist": {
"version": "0.0.8",
"resolved": false,
- "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
- "optional": true
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
},
"minipass": {
"version": "2.2.4",
"resolved": false,
"integrity": "sha512-hzXIWWet/BzWhYs2b+u7dRHlruXhwdgvlTMDKC6Cb1U7ps6Ac6yQlR39xsbjWJE377YTCtKwIXIpJ5oP+j5y8g==",
- "optional": true,
"requires": {
"safe-buffer": "^5.1.1",
"yallist": "^3.0.0"
@@ -7085,7 +7074,6 @@
"version": "0.5.1",
"resolved": false,
"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
- "optional": true,
"requires": {
"minimist": "0.0.8"
}
@@ -7166,8 +7154,7 @@
"number-is-nan": {
"version": "1.0.1",
"resolved": false,
- "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
- "optional": true
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
},
"object-assign": {
"version": "4.1.1",
@@ -7179,7 +7166,6 @@
"version": "1.4.0",
"resolved": false,
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "optional": true,
"requires": {
"wrappy": "1"
}
@@ -7265,8 +7251,7 @@
"safe-buffer": {
"version": "5.1.1",
"resolved": false,
- "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==",
- "optional": true
+ "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
},
"safer-buffer": {
"version": "2.1.2",
@@ -7302,7 +7287,6 @@
"version": "1.0.2",
"resolved": false,
"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
- "optional": true,
"requires": {
"code-point-at": "^1.0.0",
"is-fullwidth-code-point": "^1.0.0",
@@ -7322,7 +7306,6 @@
"version": "3.0.1",
"resolved": false,
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "optional": true,
"requires": {
"ansi-regex": "^2.0.0"
}
@@ -7366,14 +7349,12 @@
"wrappy": {
"version": "1.0.2",
"resolved": false,
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
- "optional": true
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
},
"yallist": {
"version": "3.0.2",
"resolved": false,
- "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=",
- "optional": true
+ "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k="
}
}
},
diff --git a/src/actions/members.js b/src/actions/members.js
index 34425a6d..38b25a1c 100644
--- a/src/actions/members.js
+++ b/src/actions/members.js
@@ -57,6 +57,23 @@ async function getAchievementsDone(handle, uuid) {
return { data, handle, uuid };
}
+/**
+ * @static
+ * @desc Creates an action that loads member achievements from v3 API.
+ * @param {String} handle Member handle.
+ * @param {String} uuid Loading operation
+ * @return {Action}
+ */
+async function getAchievementsV3Done(handle, uuid) {
+ let data;
+ try {
+ data = await getUserService().getAchievementsV3(handle);
+ } catch (e) {
+ data = [];
+ }
+ return { data, handle, uuid };
+}
+
/**
* @static
* @desc Creates an action that signals beginning of loading the member's
@@ -344,6 +361,7 @@ export default createActions({
DROP_ALL: dropAll,
GET_ACHIEVEMENTS_INIT: getAchievementsInit,
GET_ACHIEVEMENTS_DONE: getAchievementsDone,
+ GET_ACHIEVEMENTS_V3_DONE: getAchievementsV3Done,
GET_FINANCES_INIT: getFinancesInit,
GET_FINANCES_DONE: getFinancesDone,
GET_STATS_INIT: getStatsInit,
diff --git a/src/actions/profile.js b/src/actions/profile.js
index 3996263c..21643c99 100644
--- a/src/actions/profile.js
+++ b/src/actions/profile.js
@@ -31,7 +31,7 @@ function getAchievementsInit() {}
/**
* @static
- * @desc Creates an action that loads user achievements.
+ * @desc Creates an action that loads user achievements from API v2.
* @todo This duplicates similar action in {@link actions.members.md}!
* @param {String} handle User handle.
* @return {Action}
@@ -40,6 +40,17 @@ function getAchievementsDone(handle) {
return getUserService().getUserPublic(handle);
}
+/**
+ * @static
+ * @desc Creates an action that loads user achievements from API v3.
+ * @todo This duplicates similar action in {@link actions.members.md}!
+ * @param {String} handle User handle.
+ * @return {Action}
+ */
+function getAchievementsV3Done(handle) {
+ return getUserService().getUserPublicV3(handle);
+}
+
/**
* @static
* @todo To be documented.
@@ -450,6 +461,7 @@ export default createActions({
CLEAR_PROFILE: _.noop,
GET_ACHIEVEMENTS_INIT: getAchievementsInit,
GET_ACHIEVEMENTS_DONE: getAchievementsDone,
+ GET_ACHIEVEMENTS_V3_DONE: getAchievementsV3Done,
GET_EXTERNAL_ACCOUNTS_INIT: getExternalAccountsInit,
GET_EXTERNAL_ACCOUNTS_DONE: getExternalAccountsDone,
GET_EXTERNAL_LINKS_INIT: getExternalLinksInit,
diff --git a/src/actions/settings.js b/src/actions/settings.js
index f0f506f3..7c538300 100644
--- a/src/actions/settings.js
+++ b/src/actions/settings.js
@@ -10,11 +10,10 @@ import { getService } from '../services/user-traits';
/**
* @static
* @desc Creates an action that loads user's all traits.
- * @param {String} uuid Operation UUID.
+ * @param {String} handle the topcoder member handle
* @param {String} tokenV3 v3 auth token.
* @return {Action}
*/
-
async function getAllUserTraits(handle, tokenV3) {
const data = await getService(tokenV3).getAllUserTraits(handle);
return { data, handle };
diff --git a/src/reducers/members.js b/src/reducers/members.js
index f4cce8cf..23d0a08b 100644
--- a/src/reducers/members.js
+++ b/src/reducers/members.js
@@ -438,6 +438,7 @@ function create(initialState = {}) {
[a.dropAll]: onDropAll,
[a.getAchievementsInit]: onGetAchievementsInit,
[a.getAchievementsDone]: onGetAchievementsDone,
+ [a.getAchievementsV3Done]: onGetAchievementsDone,
[a.getFinancesInit]: onGetFinancesInit,
[a.getFinancesDone]: onGetFinancesDone,
[a.getStatsInit]: onGetStatsInit,
diff --git a/src/reducers/profile.js b/src/reducers/profile.js
index 1d7711a7..875dc582 100644
--- a/src/reducers/profile.js
+++ b/src/reducers/profile.js
@@ -29,6 +29,26 @@ function onGetAchievementsDone(state, { payload, error }) {
});
}
+/**
+ * Handles PROFILE/GET_ACHIEVEMENTS_V3_DONE action.
+ * @param {Object} state
+ * @param {Object} action Payload will be JSON from api call
+ * @return {Object} New state
+ */
+function onGetAchievementsV3Done(state, { payload, error }) {
+ if (error) {
+ return { ...state, loadingError: true };
+ }
+
+ return ({
+ ...state,
+ achievements: payload.achievements || [],
+ copilot: payload.copilot,
+ country: payload.country,
+ loadingError: false,
+ });
+}
+
/**
* Handles PROFILE/GET_EXTERNAL_ACCOUNTS_DONE action.
* @param {Object} state
@@ -490,6 +510,7 @@ function create(initialState) {
[a.loadProfile]: (state, action) => ({ ...state, profileForHandle: action.payload }),
[a.getAchievementsInit]: state => state,
[a.getAchievementsDone]: onGetAchievementsDone,
+ [a.getAchievementsV3Done]: onGetAchievementsV3Done,
[a.getExternalAccountsInit]: state => state,
[a.getExternalAccountsDone]: onGetExternalAccountsDone,
[a.getExternalLinksInit]: state => state,
diff --git a/src/services/user.js b/src/services/user.js
index 7da7f53b..802f5af3 100644
--- a/src/services/user.js
+++ b/src/services/user.js
@@ -141,6 +141,16 @@ class User {
return res.json() || null;
}
+ /**
+ * Gets public user info from v3 API. Does not need auth.
+ * @param {String} username
+ * @return {Object}
+ */
+ async getUserPublicV3(username) {
+ const res = await this.private.api.get(`/members/${username}`);
+ return getApiResponsePayload(res);
+ }
+
/**
* Gets user data object for the specified username.
*
diff --git a/src/utils/tc.js b/src/utils/tc.js
index 16d47b3d..77fce85a 100644
--- a/src/utils/tc.js
+++ b/src/utils/tc.js
@@ -38,7 +38,6 @@ export async function getApiResponsePayload(res) {
return x.content;
}
-
/**
* Gets payload from a standard success response from TC LOOKER API; or throws
* an error in case of a failure response.
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: