diff --git a/src/forgot-password/ForgotPasswordPage.jsx b/src/forgot-password/ForgotPasswordPage.jsx index ec9cf247..ac7c1a37 100644 --- a/src/forgot-password/ForgotPasswordPage.jsx +++ b/src/forgot-password/ForgotPasswordPage.jsx @@ -8,8 +8,10 @@ import { Input, StatefulButton, ValidationFormGroup, + Alert, } from '@edx/paragon'; import { injectIntl, intlShape } from '@edx/frontend-platform/i18n'; +import { getConfig } from '@edx/frontend-platform'; import { Formik } from 'formik'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; @@ -25,22 +27,23 @@ import { INTERNAL_SERVER_ERROR } from '../login/data/constants'; const ForgotPasswordPage = (props) => { const { intl, status } = props; - let invalidEmailMessage; - const validateEmail = (e, setFieldValue) => { - invalidEmailMessage = intl.formatMessage(messages['forgot.password.page.invalid.email.message']); - const regex = new RegExp(VALID_EMAIL_REGEX, 'i'); - - const inputEmail = e.target.value; - const isEmailValid = regex.test(inputEmail); - setFieldValue('email', inputEmail); - setFieldValue('isEmailValid', isEmailValid); - if (inputEmail.length < 3) { - invalidEmailMessage = `${intl.formatMessage(messages['forgot.password.page.email.invalid.length.message'])} ${invalidEmailMessage}`; - } + const platformName = getConfig().SITE_NAME; + const handleOnChange = (e, setFieldValue) => { + setFieldValue('email', e.target.value); }; - const getStatusBannerifAny = () => { + const getStatusBannerifAny = (errors) => { + if (errors.email) { + return ( + + + {intl.formatMessage(messages['forgot.password.invalid.email.heading'])} + + {intl.formatMessage(messages['forgot.password.invalid.email.message'])} + + ); + } if (status === INTERNAL_SERVER_ERROR) { return ; } @@ -50,27 +53,33 @@ const ForgotPasswordPage = (props) => { return ( { - if (values.isEmailValid) { - props.forgotPassword(values.email); + onSubmit={(values) => props.forgotPassword(values.email)} + validate={(values) => { + const regex = new RegExp(VALID_EMAIL_REGEX, 'i'); + if (!regex.test(values.email)) { + return { email: intl.formatMessage(messages['forgot.password.page.invalid.email.message']) }; } + return {}; }} initialValues={{ email: '', isEmailValid: true, }} + validateOnChange={false} + validateOnBlur={false} > {({ handleSubmit, values, setFieldValue, + errors, }) => ( <> {status === 'complete' ? : null}
- { getStatusBannerifAny()} + { getStatusBannerifAny(errors)}

{intl.formatMessage(messages['forgot.password.page.heading'])}

@@ -80,8 +89,9 @@ const ForgotPasswordPage = (props) => { {intl.formatMessage(messages['forgot.password.page.email.field.label'])} @@ -92,11 +102,8 @@ const ForgotPasswordPage = (props) => { type="email" placeholder="username@domain.com" value={values.email} - onChange={e => validateEmail(e, setFieldValue)} + onChange={e => handleOnChange(e, setFieldValue)} /> -

- {intl.formatMessage(messages['forgot.password.page.email.field.help.text'])} -

{ }); it('should display email validation error message', async () => { - const validationMessage = "Email must have at least 3 characters. The email address you've provided isn't formatted correctly."; + const validationMessage = "The email address you've provided isn't formatted correctly."; const wrapper = mount(reduxWrapper()); await act(async () => { - await wrapper.find('input#forgot-password-input').simulate('change', { target: { value: '', name: 'email' } }); + await wrapper.find('button.btn-primary').simulate('click', { target: { value: 'random', name: 'email' } }); }); wrapper.update(); expect(wrapper.find('#email-invalid-feedback').text()).toEqual(validationMessage); }); + it('should display alert banner incase of invalid email', async () => { + const validationMessage = "An error occurred.The email address you've provided isn't formatted correctly."; + const wrapper = mount(reduxWrapper()); + await act(async () => { + await wrapper.find('button.btn-primary').simulate('click', { target: { value: 'random', name: 'email' } }); + }); + wrapper.update(); + expect(wrapper.find('.alert-danger').text()).toEqual(validationMessage); + }); + it('should handle 500 error code', async () => { const params = { payload: { diff --git a/src/forgot-password/tests/__snapshots__/ForgotPasswordPage.test.jsx.snap b/src/forgot-password/tests/__snapshots__/ForgotPasswordPage.test.jsx.snap index 8feef6d5..e99da32d 100644 --- a/src/forgot-password/tests/__snapshots__/ForgotPasswordPage.test.jsx.snap +++ b/src/forgot-password/tests/__snapshots__/ForgotPasswordPage.test.jsx.snap @@ -30,7 +30,7 @@ exports[`ForgotPasswordPage should match default section snapshot 1`] = ` Email -

- The email address you used to register with edX. -

+ The email address you used to register with edX +