in src/app/(proper_react)/(redesign)/(authenticated)/user/(dashboard)/settings/panels/SettingsPanelEditProfile/EditProfileForm.tsx [168:318]
function EditProfileForm(props: {
actions: {
onHandleUpdateProfileData: typeof onHandleUpdateProfileData;
};
profileData: OnerepProfileRow;
}) {
const l10n = useL10n();
const [profileFormData, setProfileFormData] = useState(props.profileData);
const [updatingForm, setUpdatingForm] = useState(false);
const formRef = useRef<HTMLFormElement>(null);
const hasProfileDataChanged = !isEqual(props.profileData, profileFormData);
const profileFormDataValidated = validateProfileFormData(profileFormData);
const handleOnInputChange = ({
key,
value,
index,
}: EditProfileInputOnChangeReturnValue) => {
if (typeof index === "undefined") {
setProfileFormData({
...profileFormData,
[key]: value,
});
} else {
const formDataUpdated = {
...profileFormData,
[key]: [...profileFormData[key as ProfileDataListKey]],
};
const [city, state, _countryCode] = value.split(", ");
formDataUpdated[key as ProfileDataListKey][index] =
// This line show as not covered even though there are unit tests for updating
// the LocationAutocompleteInput in the test file `SettingsPageRedesign.test.tsx`.
/* c8 ignore next */
key === "addresses" ? { city, state } : value;
setProfileFormData(formDataUpdated);
}
};
const handleOnAdd = (profileDataKey: ProfileDataListKey) => {
const formDataUpdated = {
...profileFormData,
[profileDataKey]: [...profileFormData[profileDataKey], ""],
};
setProfileFormData(formDataUpdated);
};
const handleOnRemove = (
profileDataKey: ProfileDataListKey,
itemIndex: number,
) => {
const formDataUpdated = {
...profileFormData,
[profileDataKey]: profileFormData[profileDataKey].filter(
(_, filteIndex) => itemIndex !== filteIndex,
),
};
setProfileFormData(formDataUpdated);
};
const handleSubmitForm = async (event: FormEvent) => {
event.preventDefault();
setUpdatingForm(true);
const result =
await props.actions.onHandleUpdateProfileData(profileFormData);
if (!result.success) {
toast.error(
l10n.getString(
"settings-edit-profile-info-form-error-submission-failed",
),
{ autoClose: 15000 },
);
captureException(result.error);
}
setUpdatingForm(false);
};
return (
<form
ref={formRef}
className={styles.profileForm}
onSubmit={handleSubmitForm}
>
{profileFields.map((profileDataKey, detailIndex) => {
const label = l10n.getString(
`settings-edit-profile-info-form-fieldset-label-${profileDataKey.replaceAll("_", "-")}`,
);
return (
<Fragment key={profileDataKey}>
<fieldset className="noList" disabled={updatingForm}>
<legend>
<span>{label}</span>
</legend>
<div className={styles.formInputs}>
<EditProfileFormInputs
profileData={profileFormDataValidated.data}
profileDataKey={profileDataKey}
handleOnInputChange={handleOnInputChange}
onAdd={handleOnAdd}
onRemove={handleOnRemove}
/>
</div>
</fieldset>
{detailIndex < Object.keys(profileFormData).length - 1 && <hr />}
</Fragment>
);
})}
<div className={styles.profileFormButtons}>
{hasProfileDataChanged ? (
<EditProfileCancelDialog
isSaving={updatingForm}
onSave={() => {
formRef.current?.requestSubmit();
}}
/>
) : (
<TelemetryButton
variant="secondary"
href="/user/settings/edit-info"
event={{
module: "button",
name: "click",
data: {
button_id: "settings_edit_profile_form_cancel",
},
}}
>
{l10n.getString(
"settings-edit-profile-info-form-cancel-button-label",
)}
</TelemetryButton>
)}
<TelemetryButton
type="submit"
variant="primary"
isLoading={updatingForm}
disabled={!profileFormDataValidated.isValid || !hasProfileDataChanged}
event={{
module: "ctaButton",
name: "click",
data: {
button_id: "settings_edit_profile_form_submitted",
},
}}
>
{l10n.getString("settings-edit-profile-info-form-save-button-label")}
</TelemetryButton>
</div>
</form>
);
}