Skip to content

Commit e394cb2

Browse files
committed
fix: refactor extended profile fields handling and improve error message management
1 parent 0fb7996 commit e394cb2

File tree

8 files changed

+30
-46
lines changed

8 files changed

+30
-46
lines changed

src/profile/ProfilePage.jsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ class ProfilePage extends React.Component {
6767

6868
componentDidMount() {
6969
this.props.fetchProfile(this.props.params.username);
70-
this.props.fetchExtraFieldsInfo({ is_register_page: true });
70+
this.props.fetchExtraFieldsInfo();
7171
sendTrackingLogEvent('edx.profile.viewed', {
7272
username: this.props.params.username,
7373
});
@@ -396,7 +396,7 @@ ProfilePage.propTypes = {
396396
label: PropTypes.string.isRequired,
397397
})),
398398
// https://github.com/openedx/edx-platform/blob/master/openedx/core/djangoapps/user_api/helpers.py#L179
399-
error_message: PropTypes.shape({
399+
errorMessage: PropTypes.shape({
400400
required: PropTypes.string,
401401
}),
402402
// https://github.com/openedx/edx-platform/blob/master/openedx/core/djangoapps/user_api/helpers.py#L167

src/profile/data/actions.js

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -148,13 +148,11 @@ export const resetDrafts = () => ({
148148
type: RESET_DRAFTS,
149149
});
150150

151-
// Third party auth context
152151
export const EXTENDED_PROFILE_FIELDS = new AsyncActionType('EXTENDED_PROFILE_FIELDS', 'GET_EXTENDED_PROFILE_FIELDS');
153152
export const EXTENDED_PROFILE_FIELDS_CLEAR_ERROR_MSG = 'EXTENDED_PROFILE_FIELDS_CLEAR_ERROR_MSG';
154153

155-
export const getExtendedProfileFields = (urlParams) => ({
154+
export const getExtendedProfileFields = () => ({
156155
type: EXTENDED_PROFILE_FIELDS.BASE,
157-
payload: { urlParams },
158156
});
159157

160158
export const getExtendedProfileFieldsBegin = () => ({
@@ -169,7 +167,3 @@ export const getExtendedProfileFieldsSuccess = (fields) => ({
169167
export const getExtendedProfileFieldsFailure = () => ({
170168
type: EXTENDED_PROFILE_FIELDS.FAILURE,
171169
});
172-
173-
export const clearThirdPartyAuthContextErrorMessage = () => ({
174-
type: EXTENDED_PROFILE_FIELDS_CLEAR_ERROR_MSG,
175-
});

src/profile/data/sagas.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -210,12 +210,12 @@ export function* handleDeleteProfilePhoto(action) {
210210
}
211211
}
212212

213-
export function* fetchThirdPartyAuthContext(action) {
213+
export function* fetchExtendedProfileFields() {
214214
try {
215215
yield put(getExtendedProfileFieldsBegin());
216216
const {
217217
fields,
218-
} = yield call(ProfileApiService.getExtendedProfileFields, action.payload.urlParams);
218+
} = yield call(ProfileApiService.getExtendedProfileFields);
219219

220220
yield put(getExtendedProfileFieldsSuccess(fields));
221221
} catch (e) {
@@ -229,5 +229,5 @@ export default function* profileSaga() {
229229
yield takeEvery(SAVE_PROFILE.BASE, handleSaveProfile);
230230
yield takeEvery(SAVE_PROFILE_PHOTO.BASE, handleSaveProfilePhoto);
231231
yield takeEvery(DELETE_PROFILE_PHOTO.BASE, handleDeleteProfilePhoto);
232-
yield takeEvery(EXTENDED_PROFILE_FIELDS.BASE, fetchThirdPartyAuthContext);
232+
yield takeEvery(EXTENDED_PROFILE_FIELDS.BASE, fetchExtendedProfileFields);
233233
}

src/profile/data/selectors.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
getCountryMessages,
77
getLanguageMessages,
88
} from '@edx/frontend-platform/i18n'; // eslint-disable-line
9+
import { moveCheckboxFieldsToEnd } from '../utils';
910

1011
export const formIdSelector = (state, props) => props.formId;
1112
export const userAccountSelector = state => state.userAccount;
@@ -414,7 +415,7 @@ export const profilePageSelector = createSelector(
414415
value: account.extendedProfile?.find(
415416
(extendedProfileField) => extendedProfileField.fieldName === field.name,
416417
)?.fieldValue,
417-
})),
418+
}))?.sort(moveCheckboxFieldsToEnd) ?? [],
418419
}),
419420

420421
);

src/profile/data/services.js

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -157,25 +157,16 @@ export async function getCourseCertificates(username) {
157157
}
158158
}
159159

160-
export async function getExtendedProfileFields(urlParams) {
161-
const requestConfig = {
162-
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
163-
params: urlParams,
164-
isPublic: true,
165-
};
160+
export async function getExtendedProfileFields() {
161+
const url = `${getConfig().LMS_BASE_URL}/user_api/v1/account/registration/`;
166162

167163
const { data } = await getAuthenticatedHttpClient()
168164
.get(
169-
`${getConfig().LMS_BASE_URL}/api/mfe_context`,
170-
requestConfig,
165+
url,
171166
)
172167
.catch((e) => {
173168
throw (e);
174169
});
175170

176-
const extendedProfileFields = data.optionalFields.extended_profile
177-
.map((fieldName) => (data.registrationFields.fields[fieldName]))
178-
.filter(Boolean);
179-
180-
return { fields: extendedProfileFields };
171+
return { fields: data.fields };
181172
}

src/profile/forms/ExtendedProfileFields.jsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import SwitchContent from './elements/SwitchContent';
88
import SelectField from './elements/SelectField';
99
import TextField from './elements/TextField';
1010
import CheckboxField from './elements/CheckboxField';
11-
import { moveCheckboxFieldsToEnd } from '../utils';
1211

1312
const ExtendedProfileFields = (props) => {
1413
const {
@@ -42,7 +41,7 @@ const ExtendedProfileFields = (props) => {
4241

4342
return (
4443
<div>
45-
{extendedProfileFields.sort(moveCheckboxFieldsToEnd)?.map((field) => {
44+
{extendedProfileFields?.map((field) => {
4645
const value = draftProfile?.extendedProfile?.find(
4746
(extendedField) => extendedField.fieldName === field.name,
4847
)?.fieldValue ?? field.value;
@@ -52,7 +51,7 @@ const ExtendedProfileFields = (props) => {
5251

5352
const commonProps = {
5453
...field,
55-
errorMessage: field.error_message,
54+
errorMessage: field.errorMessage,
5655
formId: `${formId}/${field.name}`,
5756
changeHandler: handleChangeExtendedField,
5857
submitHandler: handleSubmitExtendedField,
@@ -91,7 +90,7 @@ ExtendedProfileFields.propTypes = {
9190
value: PropTypes.string.isRequired,
9291
label: PropTypes.string.isRequired,
9392
})),
94-
error_message: PropTypes.shape({
93+
errorMessage: PropTypes.shape({
9594
required: PropTypes.string,
9695
}),
9796
restrictions: PropTypes.shape({

src/profile/forms/elements/SelectField.jsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,8 @@ const SelectField = ({
6666
onChange={handleChange}
6767
>
6868
<option value="">&nbsp;</option>
69-
{options.map(([code, name]) => (
70-
<option key={code} value={code}>{name}</option>
69+
{options?.map(({ name, value: optionValue }) => (
70+
<option key={optionValue} value={optionValue}>{name}</option>
7171
))}
7272
</select>
7373
{error !== null && (
@@ -130,10 +130,9 @@ SelectField.propTypes = {
130130
saveState: PropTypes.string,
131131
error: PropTypes.string,
132132
options: PropTypes.arrayOf(PropTypes.shape({
133-
code: PropTypes.string.isRequired,
133+
value: PropTypes.string.isRequired,
134134
name: PropTypes.string.isRequired,
135135
})).isRequired,
136-
// fieldMessages: PropTypes.objectOf(PropTypes.string).isRequired,
137136
label: PropTypes.string.isRequired,
138137
emptyMessage: PropTypes.string.isRequired,
139138
changeHandler: PropTypes.func.isRequired,

src/profile/forms/elements/TextField.jsx

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -30,20 +30,20 @@ const TextField = ({
3030

3131
useEffect(() => {
3232
if (!value && errorMessage?.required) {
33-
setErrorMessage(errorMessage.required);
34-
} else if (restrictions.max_length && value.length > restrictions.max_length) {
35-
setErrorMessage(errorMessage.max_length);
36-
} else if (restrictions.min_length && value.length < restrictions.min_length) {
37-
setErrorMessage(errorMessage.min_length);
33+
setErrorMessage(errorMessage?.required);
34+
} else if (restrictions?.max_length && value?.length > restrictions?.max_length) {
35+
setErrorMessage(errorMessage?.max_length);
36+
} else if (restrictions?.min_length && value?.length < restrictions?.min_length) {
37+
setErrorMessage(errorMessage?.min_length);
3838
} else {
3939
setErrorMessage(null);
4040
}
4141
}, [
42-
errorMessage.max_length,
43-
errorMessage.min_length,
44-
errorMessage.required,
45-
restrictions.max_length,
46-
restrictions.min_length,
42+
errorMessage?.max_length,
43+
errorMessage?.min_length,
44+
errorMessage?.required,
45+
restrictions?.max_length,
46+
restrictions?.min_length,
4747
value,
4848
]);
4949

@@ -85,8 +85,8 @@ const TextField = ({
8585
name={formId}
8686
value={value}
8787
onChange={handleChange}
88-
minLength={restrictions.min_length}
89-
maxLength={restrictions.max_length}
88+
minLength={restrictions?.min_length}
89+
maxLength={restrictions?.max_length}
9090
/>
9191
{displayedMessage !== null && (
9292
<Form.Control.Feedback hasIcon={false}>

0 commit comments

Comments
 (0)