diff --git a/src/components/FieldTextInput/FieldTextInput.js b/src/components/FieldTextInput/FieldTextInput.js
index f0b4f6f6..9af3262c 100644
--- a/src/components/FieldTextInput/FieldTextInput.js
+++ b/src/components/FieldTextInput/FieldTextInput.js
@@ -41,9 +41,9 @@ class FieldTextInputComponent extends Component {
// Error message and input error styles are only shown if the
// field has been touched and the validation has failed.
- const hasError = touched && invalid && errorText;
+ const hasError = !!customErrorText || !!(touched && invalid && error);
- const fieldMeta = { touched, error: errorText };
+ const fieldMeta = { touched: hasError, error: errorText };
const inputClasses =
inputRootClass ||
@@ -116,6 +116,6 @@ class FieldTextInput extends Component {
render() {
return ;
}
-};
+}
export default FieldTextInput;
diff --git a/src/containers/ContactDetailsForm/ContactDetailsForm.js b/src/containers/ContactDetailsForm/ContactDetailsForm.js
index b60b1dab..bdd84c8f 100644
--- a/src/containers/ContactDetailsForm/ContactDetailsForm.js
+++ b/src/containers/ContactDetailsForm/ContactDetailsForm.js
@@ -3,6 +3,7 @@ import PropTypes from 'prop-types';
import { compose } from 'redux';
import { FormattedMessage, injectIntl, intlShape } from 'react-intl';
import { Form as FinalForm } from 'react-final-form';
+import { isEqual } from 'lodash';
import classNames from 'classnames';
import { propTypes } from '../../util/types';
import * as validators from '../../util/validators';
@@ -24,6 +25,7 @@ class ContactDetailsFormComponent extends Component {
this.state = { showVerificationEmailSentMessage: false };
this.emailSentTimeoutId = null;
this.handleResendVerificationEmail = this.handleResendVerificationEmail.bind(this);
+ this.submittedValues = {};
}
componentWillUnmount() {
@@ -54,7 +56,6 @@ class ContactDetailsFormComponent extends Component {
currentUser,
formId,
handleSubmit,
- submitting,
inProgress,
intl,
invalid,
@@ -97,6 +98,7 @@ class ContactDetailsFormComponent extends Component {
sendVerificationEmailError
);
+ const emailTouched = this.submittedValues.email !== values.email;
const emailTakenErrorText = isChangeEmailTakenError(saveEmailError)
? intl.formatMessage({ id: 'ContactDetailsForm.emailTakenError' })
: null;
@@ -221,6 +223,7 @@ class ContactDetailsFormComponent extends Component {
const passwordFailedMessage = intl.formatMessage({
id: 'ContactDetailsForm.passwordFailed',
});
+ const passwordTouched = this.submittedValues.currentPassword !== values.currentPassword;
const passwordErrorText = isChangeEmailWrongPassword(saveEmailError)
? passwordFailedMessage
: null;
@@ -255,11 +258,22 @@ class ContactDetailsFormComponent extends Component {
}
const classes = classNames(rootClassName || css.root, className);
+ const submittedOnce = Object.keys(this.submittedValues).length > 0;
+ const pristineSinceLastSubmit = submittedOnce && isEqual(values, this.submittedValues);
const submitDisabled =
- invalid || submitting || inProgress || !(emailChanged || phoneNumberChanged);
+ invalid ||
+ pristineSinceLastSubmit ||
+ inProgress ||
+ !(emailChanged || phoneNumberChanged);
return (
-