|
1 |
| -import React, { useState } from 'react'; |
| 1 | +import React from 'react'; |
2 | 2 | import PropTypes from 'prop-types';
|
3 |
| -import { connect, useSelector } from 'react-redux'; |
4 |
| -import { injectIntl, intlShape } from '@edx/frontend-platform/i18n'; |
| 3 | +import { useSelector } from 'react-redux'; |
| 4 | +import { intlShape } from '@edx/frontend-platform/i18n'; |
5 | 5 |
|
6 | 6 | // Components
|
7 |
| -import EditableItemHeader from './elements/EditableItemHeader'; |
8 | 7 | import SwitchContent from './elements/SwitchContent';
|
9 | 8 | import SelectField from './elements/SelectField';
|
10 |
| -import { editableFormSelector } from '../data/selectors'; |
11 | 9 | import TextField from './elements/TextField';
|
| 10 | +import CheckboxField from './elements/CheckboxField'; |
| 11 | +import { moveCheckboxFieldsToEnd } from '../utils'; |
12 | 12 |
|
13 | 13 | const ExtendedProfileFields = (props) => {
|
14 | 14 | const {
|
15 |
| - extendedProfileFields, formId, changeHandler, submitHandler, closeHandler, openHandler, editMode, |
| 15 | + extendedProfileFields, formId, changeHandler, submitHandler, closeHandler, openHandler, |
16 | 16 | } = props;
|
17 | 17 |
|
18 | 18 | const draftProfile = useSelector((state) => state.profilePage.drafts);
|
19 | 19 | const extendedProfile = useSelector((state) => state.profilePage.account.extendedProfile);
|
20 | 20 | const visibilityExtendedProfile = useSelector((state) => state.profilePage.preferences.visibilityExtendedProfile);
|
21 |
| - const [currentEditingField, setCurrentEditingField] = useState(null); |
22 |
| - |
23 |
| - const handleOpenEdit = (form) => { |
24 |
| - const [parentFormId, fieldId] = form.split('/'); |
25 |
| - |
26 |
| - openHandler(parentFormId); |
27 |
| - setCurrentEditingField(fieldId); |
28 |
| - }; |
29 |
| - |
30 |
| - const handleCloseEdit = () => { |
31 |
| - closeHandler(null); |
32 |
| - setCurrentEditingField(null); |
33 |
| - }; |
34 | 21 |
|
35 | 22 | const handleChangeExtendedField = (name, value) => {
|
36 |
| - const [parentFormId, fieldName] = name.split('/'); |
37 |
| - if (name.includes('visibility')) { |
38 |
| - changeHandler(parentFormId, { [fieldName]: value }); |
39 |
| - } else { |
40 |
| - const fieldIndex = extendedProfile.findIndex((field) => field.fieldName === fieldName); |
41 |
| - const newFields = extendedProfile.map( |
42 |
| - (extendedField, index) => (index === fieldIndex ? { ...extendedField, fieldValue: value } : extendedField), |
| 23 | + const [parentPropKey, fieldName] = name.split('/'); |
| 24 | + const isVisibilityChange = name.includes('visibility'); |
| 25 | + const fields = isVisibilityChange ? visibilityExtendedProfile : extendedProfile; |
| 26 | + const newFields = isVisibilityChange |
| 27 | + ? { |
| 28 | + ...fields, |
| 29 | + [fieldName]: value, |
| 30 | + } |
| 31 | + : fields.map( |
| 32 | + (extendedField) => ( |
| 33 | + extendedField.fieldName === fieldName ? { ...extendedField, fieldValue: value } : extendedField |
| 34 | + ), |
43 | 35 | );
|
44 |
| - changeHandler(parentFormId, newFields); |
45 |
| - } |
| 36 | + changeHandler(parentPropKey, newFields); |
46 | 37 | };
|
47 | 38 |
|
48 | 39 | const handleSubmitExtendedField = (form) => {
|
49 |
| - const [parentFormId] = form.split('/'); |
50 |
| - submitHandler(parentFormId); |
51 |
| - setCurrentEditingField(null); |
| 40 | + submitHandler(form); |
52 | 41 | };
|
53 | 42 |
|
54 |
| - return extendedProfileFields?.map((field) => ( |
55 |
| - <SwitchContent |
56 |
| - className="mb-5" |
57 |
| - expression={field.type} |
58 |
| - cases={{ |
59 |
| - checkbox: ( |
60 |
| - <> |
61 |
| - <EditableItemHeader content={field.label} /> |
62 |
| - <p data-hj-suppress className="lead"> |
63 |
| - {field.default} |
64 |
| - </p> |
65 |
| - </> |
66 |
| - ), |
67 |
| - text: ( |
68 |
| - <TextField |
69 |
| - formId={`${formId}/${field.name}`} |
70 |
| - editMode={currentEditingField === field.name ? editMode : 'editable'} |
71 |
| - changeHandler={handleChangeExtendedField} |
72 |
| - submitHandler={handleSubmitExtendedField} |
73 |
| - closeHandler={handleCloseEdit} |
74 |
| - openHandler={handleOpenEdit} |
75 |
| - {...field} |
76 |
| - /> |
77 |
| - ), |
78 |
| - select: ( |
79 |
| - <SelectField |
80 |
| - formId={`${formId}/${field.name}`} |
81 |
| - editMode={currentEditingField === field.name ? editMode : 'editable'} |
82 |
| - changeHandler={handleChangeExtendedField} |
83 |
| - submitHandler={handleSubmitExtendedField} |
84 |
| - closeHandler={handleCloseEdit} |
85 |
| - openHandler={handleOpenEdit} |
86 |
| - {...field} |
87 |
| - value={draftProfile?.extendedProfile?.find( |
88 |
| - (extendedField) => extendedField.fieldName === field.name, |
89 |
| - )?.fieldValue ?? field.value} |
90 |
| - visibility={ |
91 |
| - draftProfile?.visibilityExtendedProfile?.[field.name] ?? visibilityExtendedProfile?.[field.name] |
92 |
| - } |
| 43 | + return ( |
| 44 | + <div className=""> |
| 45 | + {extendedProfileFields.sort(moveCheckboxFieldsToEnd)?.map((field) => { |
| 46 | + const value = draftProfile?.extendedProfile?.find( |
| 47 | + (extendedField) => extendedField.fieldName === field.name, |
| 48 | + )?.fieldValue ?? field.value; |
| 49 | + |
| 50 | + const visibility = draftProfile?.visibilityExtendedProfile?.[field.name] |
| 51 | + ?? visibilityExtendedProfile?.[field.name]; |
| 52 | + |
| 53 | + const commonProps = { |
| 54 | + ...field, |
| 55 | + formId: `${formId}/${field.name}`, |
| 56 | + changeHandler: handleChangeExtendedField, |
| 57 | + submitHandler: handleSubmitExtendedField, |
| 58 | + closeHandler, |
| 59 | + openHandler, |
| 60 | + value, |
| 61 | + visibility, |
| 62 | + }; |
| 63 | + |
| 64 | + return ( |
| 65 | + <SwitchContent |
| 66 | + className="mb-5" |
| 67 | + expression={field.type} |
| 68 | + cases={{ |
| 69 | + checkbox: ( |
| 70 | + <CheckboxField {...commonProps} /> |
| 71 | + ), |
| 72 | + text: ( |
| 73 | + <TextField {...commonProps} /> |
| 74 | + ), |
| 75 | + select: ( |
| 76 | + <SelectField {...commonProps} /> |
| 77 | + ), |
| 78 | + }} |
93 | 79 | />
|
94 |
| - ), |
95 |
| - }} |
96 |
| - /> |
97 |
| - )); |
| 80 | + ); |
| 81 | + })} |
| 82 | + </div> |
| 83 | + ); |
98 | 84 | };
|
99 | 85 |
|
100 | 86 | ExtendedProfileFields.propTypes = {
|
@@ -126,11 +112,14 @@ ExtendedProfileFields.propTypes = {
|
126 | 112 | closeHandler: PropTypes.func.isRequired,
|
127 | 113 | openHandler: PropTypes.func.isRequired,
|
128 | 114 |
|
| 115 | + // Props |
| 116 | + isAuthenticatedUserProfile: PropTypes.bool.isRequired, |
| 117 | + |
129 | 118 | // i18n
|
130 | 119 | intl: intlShape.isRequired,
|
131 | 120 | };
|
132 | 121 |
|
133 | 122 | ExtendedProfileFields.defaultProps = {
|
134 | 123 | };
|
135 | 124 |
|
136 |
| -export default connect(editableFormSelector, {})(injectIntl(ExtendedProfileFields)); |
| 125 | +export default ExtendedProfileFields; |
0 commit comments