Merge pull request #1616 from coralproject/gdpr-change-email-bug

GDPR Bug - Confirm Email Dialog inputs shouldn't be connected to the save button in the background
This commit is contained in:
Kim Gardner
2018-05-15 12:54:39 -04:00
committed by GitHub
2 changed files with 86 additions and 20 deletions
@@ -4,10 +4,74 @@ import styles from './ChangeEmailContentDialog.css';
import InputField from './InputField';
import { Button } from 'plugin-api/beta/client/components/ui';
import { t } from 'plugin-api/beta/client/services';
import validate from 'coral-framework/helpers/validate';
import errorMsj from 'coral-framework/helpers/error';
const initialState = {
showError: false,
formData: {
confirmPassword: '',
},
errors: {},
};
class ChangeEmailContentDialog extends React.Component {
state = {
showError: false,
state = initialState;
clearForm = () => {
this.setState(initialState);
};
addError = err => {
this.setState(({ errors }) => ({
errors: { ...errors, ...err },
}));
};
removeError = errKey => {
this.setState(state => {
const { [errKey]: _, ...errors } = state.errors;
return {
errors,
};
});
};
fieldValidation = (value, type, name) => {
if (!value.length) {
this.addError({
[name]: t('talk-plugin-local-auth.change_password.required_field'),
});
} else if (!validate[type](value)) {
this.addError({ [name]: errorMsj[type] });
} else {
this.removeError(name);
}
};
onChange = e => {
const { name, value, type, dataset } = e.target;
const validationType = dataset.validationType || type;
this.setState(
state => ({
formData: {
...state.formData,
[name]: value,
},
}),
() => {
this.fieldValidation(value, validationType, name);
}
);
};
hasError = err => {
return Object.keys(this.state.errors).indexOf(err) !== -1;
};
getError = errorKey => {
return this.state.errors[errorKey];
};
showError = () => {
@@ -16,24 +80,31 @@ class ChangeEmailContentDialog extends React.Component {
});
};
cancel = () => {
this.clearForm();
this.props.closeDialog();
};
confirmChanges = async e => {
e.preventDefault();
const { confirmPassword = '' } = this.state.formData;
if (this.formHasError()) {
this.showError();
return;
}
await this.props.save();
await this.props.save(confirmPassword);
this.props.next();
};
formHasError = () => this.props.hasError('confirmPassword');
formHasError = () => this.hasError('confirmPassword');
render() {
return (
<div>
<span className={styles.close} onClick={this.props.cancel}>
<span className={styles.close} onClick={this.cancel}>
×
</span>
<h1 className={styles.title}>
@@ -59,17 +130,17 @@ class ChangeEmailContentDialog extends React.Component {
label={t('talk-plugin-local-auth.change_email.enter_password')}
name="confirmPassword"
type="password"
onChange={this.props.onChange}
defaultValue=""
hasError={this.props.hasError('confirmPassword')}
errorMsg={this.props.getError('confirmPassword')}
onChange={this.onChange}
value={this.state.formData.confirmPassword}
hasError={this.hasError('confirmPassword')}
errorMsg={this.getError('confirmPassword')}
showError={this.state.showError}
columnDisplay
/>
<div className={styles.bottomActions}>
<Button
className={styles.cancel}
onClick={this.props.cancel}
onClick={this.cancel}
type="button"
>
{t('talk-plugin-local-auth.change_email.cancel')}
@@ -86,14 +157,11 @@ class ChangeEmailContentDialog extends React.Component {
}
ChangeEmailContentDialog.propTypes = {
save: PropTypes.func,
next: PropTypes.func,
cancel: PropTypes.func,
onChange: PropTypes.func,
save: PropTypes.func,
formData: PropTypes.object,
email: PropTypes.string,
hasError: PropTypes.func,
getError: PropTypes.func,
closeDialog: PropTypes.func,
};
export default ChangeEmailContentDialog;
@@ -138,8 +138,8 @@ class Profile extends React.Component {
}
};
saveEmail = async () => {
const { newEmail, confirmPassword } = this.state.formData;
saveEmail = async confirmPassword => {
const { newEmail } = this.state.formData;
try {
await this.props.updateEmailAddress({
@@ -202,12 +202,10 @@ class Profile extends React.Component {
)}
<ChangeEmailContentDialog
save={this.saveEmail}
onChange={this.onChange}
formData={this.state.formData}
email={email}
enable={formData.newEmail && email !== formData.newEmail}
hasError={this.hasError}
getError={this.getError}
closeDialog={this.closeDialog}
/>
</ConfirmChangesDialog>