diff --git a/src/actions/profile.js b/src/actions/profile.js index f877b3ab..3996263c 100644 --- a/src/actions/profile.js +++ b/src/actions/profile.js @@ -434,6 +434,16 @@ function verifyMemberNewEmailDone(handle, tokenV3, emailVerifyToken) { .then(res => ({ data: res })); } +/** + * @static + * @desc Creates an action that toggles isEmailConflict state + * @param {boolean} state + * @return {Action} + */ +function updateEmailConflict(state = false) { + return state; +} + export default createActions({ PROFILE: { LOAD_PROFILE: loadProfile, @@ -480,5 +490,6 @@ export default createActions({ UPDATE_PASSWORD_DONE: updatePasswordDone, VERIFY_MEMBER_NEW_EMAIL_INIT: verifyMemberNewEmailInit, VERIFY_MEMBER_NEW_EMAIL_DONE: verifyMemberNewEmailDone, + UPDATE_EMAIL_CONFLICT: updateEmailConflict, }, }); diff --git a/src/reducers/profile.js b/src/reducers/profile.js index c463bf10..1d7711a7 100644 --- a/src/reducers/profile.js +++ b/src/reducers/profile.js @@ -212,6 +212,14 @@ function onDeletePhotoDone(state, { payload, error }) { function onUpdateProfileDone(state, { payload, error }) { const newState = { ...state, updatingProfile: false }; + if (payload.isEmailConflict) { + return { + ...newState, + isEmailConflict: true, + updateProfileSuccess: false, + }; + } + if (error) { logger.error('Failed to update user profile', payload); fireErrorMessage('ERROR: Failed to update user profile!'); @@ -455,6 +463,19 @@ function onVerifyMemberNewEmailDone(state, { payload, error }) { }; } +/** + * Handles UPDATE_EMAIL_CONFLICT action + * @param {Object} state + * @param {Object} action Payload will be a boolean value + * @return {Object} New state + */ +function onUpdateEmailConflict(state, { payload }) { + return { + ...state, + isEmailConflict: payload, + }; +} + /** * Creates a new Profile reducer with the specified initial state. * @param {Object} initialState Optional. Initial state. @@ -509,6 +530,7 @@ function create(initialState) { [a.updatePasswordDone]: onUpdatePasswordDone, [a.verifyMemberNewEmailInit]: state => ({ ...state, verifyingEmail: true }), [a.verifyMemberNewEmailDone]: onVerifyMemberNewEmailDone, + [a.updateEmailConflict]: onUpdateEmailConflict, }, _.defaults(initialState, { achievements: null, copilot: false, diff --git a/src/services/members.js b/src/services/members.js index 84b97f56..62afbf36 100644 --- a/src/services/members.js +++ b/src/services/members.js @@ -204,6 +204,9 @@ class MembersService { async updateMemberProfile(profile) { const url = profile.verifyUrl ? `/members/${profile.handle}?verifyUrl=${profile.verifyUrl}` : `/members/${profile.handle}`; const res = await this.private.api.putJson(url, { param: profile.verifyUrl ? _.omit(profile, ['verifyUrl']) : profile }); + if (profile.verifyUrl && res.status === 409) { + return Promise.resolve(Object.assign({}, profile, { isEmailConflict: true })); + } return getApiResponsePayload(res); }