Skip to content

Commit 690645b

Browse files
authored
Merge pull request #2830 from appirio-tech/feature/account-settings-improvements
Feature/account settings improvements
2 parents eb295ac + 6ea8394 commit 690645b

File tree

4 files changed

+48
-41
lines changed

4 files changed

+48
-41
lines changed

src/api/users.js

Lines changed: 35 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
import _ from 'lodash'
22
import { axiosInstance as axios } from './requestInterceptor'
33
import { TC_API_URL, RESET_PASSWORD_URL } from '../config/constants'
4+
import querystring from 'querystring'
45

56
/**
67
* Get a user based on it's handle/username
7-
*
8+
*
89
* @param {String} handle user handle
9-
*
10+
*
1011
* @returns {Promise<Object>} user profile data
1112
*/
1213
export function getUserProfile(handle) {
@@ -18,15 +19,19 @@ export function getUserProfile(handle) {
1819

1920
/**
2021
* Update user profile
21-
*
22+
*
2223
* @param {String} handle user handle
2324
* @param {Object} updatedProfile updated user data
24-
*
25+
* @param {Object} [queryParams] optional query params
26+
*
2527
* @returns {Promise<Object>} user profile data
2628
*/
27-
export function updateUserProfile(handle, updatedProfile) {
28-
return axios.put(`${TC_API_URL}/v3/members/${handle}/`, {
29-
param: updatedProfile
29+
export function updateUserProfile(handle, updatedProfile, queryParams = {}) {
30+
let query = querystring.stringify(queryParams)
31+
query = query ? `?${query}` : ''
32+
33+
return axios.put(`${TC_API_URL}/v3/members/${handle}/${query}`, {
34+
param: updatedProfile
3035
})
3136
.then(resp => {
3237
return _.get(resp.data, 'result.content', {})
@@ -35,9 +40,9 @@ export function updateUserProfile(handle, updatedProfile) {
3540

3641
/**
3742
* Get member traits
38-
*
43+
*
3944
* @param {String} handle member handle
40-
*
45+
*
4146
* @returns {Promise<Array>} member traits
4247
*/
4348
export const getMemberTraits = (handle) => {
@@ -47,10 +52,10 @@ export const getMemberTraits = (handle) => {
4752

4853
/**
4954
* Update member traits
50-
*
55+
*
5156
* @param {String} handle member handle
5257
* @param {Array} updatedTraits list of updated traits
53-
*
58+
*
5459
* @returns {Promise<Array>} member traits
5560
*/
5661
export const updateMemberTraits = (handle, updatedTraits) => {
@@ -62,10 +67,10 @@ export const updateMemberTraits = (handle, updatedTraits) => {
6267

6368
/**
6469
* Create member traits
65-
*
70+
*
6671
* @param {String} handle member handle
6772
* @param {Array} traits list of traits to create
68-
*
73+
*
6974
* @returns {Promise<Array>} member traits
7075
*/
7176
export const createMemberTraits = (handle, traits) => {
@@ -77,12 +82,12 @@ export const createMemberTraits = (handle, traits) => {
7782

7883
/**
7984
* Update member photo
80-
*
85+
*
8186
* @param {String} handle member handle
8287
* @param {Object} data params to update photo
8388
* @param {String} data.contentType photo file content type
8489
* @param {String} data.token token provided by pre signed URL
85-
*
90+
*
8691
* @returns {Promise<String>} photo URL
8792
*/
8893
export const updateMemberPhoto = (handle, data) => {
@@ -94,26 +99,26 @@ export const updateMemberPhoto = (handle, data) => {
9499

95100
/**
96101
* Get pre-signed URL for member photo
97-
*
102+
*
98103
* @param {String} handle member handle
99104
* @param {File} file file to upload
100-
*
101-
* @returns {Promise<Object>} data of pre-signed URL
105+
*
106+
* @returns {Promise<Object>} data of pre-signed URL
102107
*/
103108
export const getPreSignedUrl = (handle, file) => {
104-
return axios.post(`${TC_API_URL}/v3/members/${handle}/photoUploadUrl`, {
105-
param: {
106-
contentType: file.type
107-
}
109+
return axios.post(`${TC_API_URL}/v3/members/${handle}/photoUploadUrl`, {
110+
param: {
111+
contentType: file.type
112+
}
108113
})
109114
.then(resp => _.get(resp.data, 'result.content', {}))
110115
}
111116

112117
/**
113118
* Check if email is available to be used for a user
114-
*
119+
*
115120
* @param {String} email email to validate
116-
*
121+
*
117122
* @returns {Promise<Object>} response body
118123
*/
119124
export const checkEmailValidity = (email) => {
@@ -123,24 +128,24 @@ export const checkEmailValidity = (email) => {
123128

124129
/**
125130
* Update user password
126-
*
131+
*
127132
* @param {Number} userId user id
128133
* @param {Object} credential user credentials old and new one
129-
*
134+
*
130135
* @returns {Promise<Object>} response body
131136
*/
132137
export const updatePassword = (userId, credential) => {
133-
return axios.patch(`${TC_API_URL}/v3/users/${userId}`, {
134-
param: { credential }
138+
return axios.patch(`${TC_API_URL}/v3/users/${userId}`, {
139+
param: { credential }
135140
})
136141
.then(resp => _.get(resp.data, 'result.content', {}))
137142
}
138143

139144
/**
140145
* Send reset password email to the user
141-
*
146+
*
142147
* @param {String} email user email
143-
*
148+
*
144149
* @returns {Promise<Object>} response body
145150
*/
146151
export const resetPassword = (email) => {

src/routes/settings/actions/index.js

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import {
3333
RESET_PASSWORD_SUCCESS,
3434
RESET_PASSWORD_FAILURE,
3535
CLEAR_PROFILE_SETTINGS_PHOTO,
36+
CONNECT_DOMAIN,
3637
} from '../../../config/constants'
3738
import settingsService from '../services/settings'
3839
import * as memberService from '../../../api/users'
@@ -67,9 +68,11 @@ export const checkEmailAvailability = (email) => (dispatch) => {
6768
memberService.checkEmailValidity(email)
6869
.then(data => {
6970
const isEmailAvailable = _.get(data, 'valid')
71+
const reason = _.get(data, 'reason')
72+
7073
dispatch({
7174
type: CHECK_EMAIL_AVAILABILITY_SUCCESS,
72-
payload: {email, isEmailAvailable}
75+
payload: {email, isEmailAvailable, reason}
7376
})
7477
})
7578
.catch(err => {
@@ -93,7 +96,12 @@ export const changeEmail = (email) => (dispatch, getState) => {
9396
// as we used `omit` above we have a new object and can directly update it
9497
newProfile.email = email
9598

96-
memberService.updateUserProfile(handle, newProfile)
99+
const queryParams = {
100+
successUrl: `${CONNECT_DOMAIN}/settings/account/email-verification/success`,
101+
failUrl: `${CONNECT_DOMAIN}/settings/account/email-verification/failure`
102+
}
103+
104+
memberService.updateUserProfile(handle, newProfile, queryParams)
97105
.then(data => {
98106
dispatch({
99107
type: CHANGE_EMAIL_SUCCESS,
@@ -205,13 +213,13 @@ export const saveProfileSettings = (settings) => (dispatch, getState) => {
205213
// some traits could have categoryName as null
206214
// for such traits we have to use POST method instead of PUT or we will get
207215
// error 404 for such traits
208-
traits.filter((trait) => trait.categoryName),
216+
traits.filter((trait) => trait.categoryName),
209217
'traitId'
210218
)
211219
const updatedTraits = applyProfileSettingsToTraits(traits, settings)
212220

213221
// we will only update on server traits which can be updated on the settings page
214-
const traitsForServer = updatedTraits.filter((trait) =>
222+
const traitsForServer = updatedTraits.filter((trait) =>
215223
// TODO Revert to 'connect_info' again when PROD supports it
216224
_.includes(['basic_info', customerTraitId], trait.traitId)
217225
)

src/routes/settings/reducers/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ export default (state = initialState, action) => {
148148
checkingEmail: null,
149149
checkedEmail: action.payload.email,
150150
isEmailAvailable: action.payload.isEmailAvailable,
151-
checkingEmailError: null
151+
checkingEmailError: action.payload.isEmailAvailable ? null : action.payload.reason
152152
} : state.system
153153
}
154154

src/routes/settings/routes/system/components/ChangeEmailForm.jsx

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -140,13 +140,7 @@ class ChangeEmailForm extends React.Component {
140140
}}
141141
disabled={isEmailChanging}
142142
ref={(ref) => this.emailRef = ref}
143-
/* disable email field for now, as backend doesn't support returnUrl yet
144-
and verification link which is sent to email leads to Community app, instead of Connect app for now */
145-
disabled
146143
/>
147-
<div className="email-hint">
148-
To change the email please <a href="mailto:support@topcoder.com">get in touch with support</a>
149-
</div>
150144
{ isFocused && isCheckingCurrentEmail && (
151145
<div className="field-status">
152146
Verifying email

0 commit comments

Comments
 (0)