diff --git a/src/login/LoginPage.jsx b/src/login/LoginPage.jsx index fb7a724a..04109179 100644 --- a/src/login/LoginPage.jsx +++ b/src/login/LoginPage.jsx @@ -35,7 +35,7 @@ import { import ResetPasswordSuccess from '../reset-password/ResetPasswordSuccess'; import AccountActivationMessage from './AccountActivationMessage'; import { - loginRequest, loginRequestFailure, loginRequestReset, setLoginFormData, + loginRemovePasswordResetBanner, loginRequest, loginRequestFailure, loginRequestReset, setLoginFormData, } from './data/actions'; import { INVALID_FORM } from './data/constants'; import { loginErrorSelector, loginFormDataSelector, loginRequestSelector } from './data/selectors'; @@ -85,12 +85,21 @@ class LoginPage extends React.Component { return true; } + componentWillUnmount() { + if (this.props.resetPassword) { + this.props.loginRemovePasswordResetBanner(); + } + } + getEnterPriseLoginURL() { return getConfig().LMS_BASE_URL + ENTERPRISE_LOGIN_URL; } handleSubmit = (e) => { e.preventDefault(); + if (this.props.resetPassword) { + this.props.loginRemovePasswordResetBanner(); + } this.setState({ isSubmitted: true }); const { emailOrUsername, password } = this.state; const emailValidationError = this.validateEmail(emailOrUsername); @@ -367,6 +376,7 @@ LoginPage.propTypes = { loginRequestFailure: PropTypes.func.isRequired, loginRequestReset: PropTypes.func.isRequired, setLoginFormData: PropTypes.func.isRequired, + loginRemovePasswordResetBanner: PropTypes.func.isRequired, loginResult: PropTypes.shape({ redirectUrl: PropTypes.string, success: PropTypes.bool, @@ -417,5 +427,6 @@ export default connect( loginRequestFailure, loginRequestReset, setLoginFormData, + loginRemovePasswordResetBanner, }, )(injectIntl(LoginPage)); diff --git a/src/login/data/actions.js b/src/login/data/actions.js index b3d93dde..d9a547f2 100644 --- a/src/login/data/actions.js +++ b/src/login/data/actions.js @@ -2,6 +2,7 @@ import { AsyncActionType } from '../../data/utils'; export const LOGIN_REQUEST = new AsyncActionType('LOGIN', 'REQUEST'); export const LOGIN_PERSIST_FORM_DATA = 'LOGIN_PERSIST_FORM_DATA'; +export const LOGIN_REMOVE_PASSWORD_RESET_BANNER = 'LOGIN_REMOVE_PASSWORD_RESET_BANNER'; // Login export const loginRequest = creds => ({ @@ -31,3 +32,7 @@ export const setLoginFormData = (formData) => ({ type: LOGIN_PERSIST_FORM_DATA, payload: { formData }, }); + +export const loginRemovePasswordResetBanner = () => ({ + type: LOGIN_REMOVE_PASSWORD_RESET_BANNER, +}); diff --git a/src/login/data/reducers.js b/src/login/data/reducers.js index 7b7afe4f..f0a0ae32 100644 --- a/src/login/data/reducers.js +++ b/src/login/data/reducers.js @@ -1,6 +1,6 @@ import { DEFAULT_STATE, PENDING_STATE } from '../../data/constants'; import { RESET_PASSWORD } from '../../reset-password'; -import { LOGIN_PERSIST_FORM_DATA, LOGIN_REQUEST } from './actions'; +import { LOGIN_PERSIST_FORM_DATA, LOGIN_REMOVE_PASSWORD_RESET_BANNER, LOGIN_REQUEST } from './actions'; export const defaultState = { loginError: null, @@ -49,13 +49,18 @@ const reducer = (state = defaultState, action) => { const { formData } = action.payload; return { ...state, - resetPassword: false, loginFormData: { ...state.loginFormData, ...formData, }, }; } + case LOGIN_REMOVE_PASSWORD_RESET_BANNER: { + return { + ...state, + resetPassword: false, + }; + } default: return { ...state, diff --git a/src/login/data/tests/reducers.test.js b/src/login/data/tests/reducers.test.js index 914fd8ba..d9887fbc 100644 --- a/src/login/data/tests/reducers.test.js +++ b/src/login/data/tests/reducers.test.js @@ -1,5 +1,5 @@ import { - LOGIN_PERSIST_FORM_DATA, + LOGIN_PERSIST_FORM_DATA, LOGIN_REMOVE_PASSWORD_RESET_BANNER, } from '../actions'; import reducer from '../reducers'; @@ -38,4 +38,21 @@ describe('login reducer', () => { }, ); }); + + it('should set resetPassword', () => { + const state = { + resetPassword: true, + }; + const action = { + type: LOGIN_REMOVE_PASSWORD_RESET_BANNER, + }; + + expect( + reducer(state, action), + ).toEqual( + { + resetPassword: false, + }, + ); + }); }); diff --git a/src/login/tests/LoginPage.test.jsx b/src/login/tests/LoginPage.test.jsx index 8f9974f8..5daeee47 100644 --- a/src/login/tests/LoginPage.test.jsx +++ b/src/login/tests/LoginPage.test.jsx @@ -13,7 +13,7 @@ import configureStore from 'redux-mock-store'; import { COMPLETE_STATE, PENDING_STATE } from '../../data/constants'; import { - loginRequest, loginRequestFailure, loginRequestReset, setLoginFormData, + loginRemovePasswordResetBanner, loginRequest, loginRequestFailure, loginRequestReset, setLoginFormData, } from '../data/actions'; import { INTERNAL_SERVER_ERROR } from '../data/constants'; import LoginFailureMessage from '../LoginFailure'; @@ -557,4 +557,20 @@ describe('LoginPage', () => { expect(loginPage.find('LoginPage').state('emailOrUsername')).toEqual('john_doe'); expect(loginPage.find('LoginPage').state('password')).toEqual('password1'); }); + + it('should update reset password value when unmount called', () => { + store = mockStore({ + ...initialState, + login: { + ...initialState.login, + resetPassword: true, + }, + }); + + store.dispatch = jest.fn(store.dispatch); + const loginPage = mount(reduxWrapper()); + loginPage.unmount(); + + expect(store.dispatch).toHaveBeenCalledWith(loginRemovePasswordResetBanner()); + }); });