From 506c51479927c1f5c048bfc350607f3b98a7bd1a Mon Sep 17 00:00:00 2001 From: Riley Davis Date: Fri, 18 Nov 2016 15:09:13 -0700 Subject: [PATCH] request pw reset from ui --- client/coral-framework/actions/auth.js | 6 +- client/coral-framework/reducers/auth.js | 12 ++++ .../coral-sign-in/components/ForgotContent.js | 69 ++++++++++++++----- client/coral-sign-in/components/styles.css | 14 +++- routes/api/user/index.js | 2 +- 5 files changed, 79 insertions(+), 24 deletions(-) diff --git a/client/coral-framework/actions/auth.js b/client/coral-framework/actions/auth.js index a1a44611f..e562fd29f 100644 --- a/client/coral-framework/actions/auth.js +++ b/client/coral-framework/actions/auth.js @@ -87,9 +87,9 @@ const forgotPassowordRequest = () => ({type: actions.FETCH_FORGOT_PASSWORD_REQUE const forgotPassowordSuccess = () => ({type: actions.FETCH_FORGOT_PASSWORD_SUCCESS}); const forgotPassowordFailure = () => ({type: actions.FETCH_FORGOT_PASSWORD_FAILURE}); -export const fetchForgotPassword = () => dispatch => { - dispatch(forgotPassowordRequest()); - fetch(`${base}/user/request-password-reset`, getInit('POST')) +export const fetchForgotPassword = email => dispatch => { + dispatch(forgotPassowordRequest(email)); + fetch(`${base}/user/request-password-reset`, getInit('POST', {email})) .then(handleResp) .then(() => dispatch(forgotPassowordSuccess())) .catch(error => dispatch(forgotPassowordFailure(error))); diff --git a/client/coral-framework/reducers/auth.js b/client/coral-framework/reducers/auth.js index 3e454892f..343ac9c09 100644 --- a/client/coral-framework/reducers/auth.js +++ b/client/coral-framework/reducers/auth.js @@ -8,6 +8,8 @@ const initialState = Map({ showSignInDialog: false, view: 'SIGNIN', error: '', + passwordRequestSuccess: null, + passwordRequestFailure: null, successSignUp: false }); @@ -22,6 +24,8 @@ export default function auth (state = initialState, action) { showSignInDialog: false, view: 'SIGNIN', error: '', + passwordRequestFailure: null, + passwordRequestSuccess: null, successSignUp: false })); case actions.CHANGE_VIEW : @@ -70,6 +74,14 @@ export default function auth (state = initialState, action) { case actions.VALID_FORM: return state .set('error', ''); + case actions.FETCH_FORGOT_PASSWORD_SUCCESS: + return state + .set('passwordRequestFailure', null) + .set('passwordRequestSuccess', 'If you have a registered account, a password reset link was sent to that email'); + case actions.FETCH_FORGOT_PASSWORD_FAILURE: + return state + .set('passwordRequestFailure', 'There was an error sending your password reset email. Please try again soon!') + .set('passwordRequestSuccess', null); default : return state; } diff --git a/client/coral-sign-in/components/ForgotContent.js b/client/coral-sign-in/components/ForgotContent.js index 7214d2bb6..c9a99f6d7 100644 --- a/client/coral-sign-in/components/ForgotContent.js +++ b/client/coral-sign-in/components/ForgotContent.js @@ -5,25 +5,56 @@ import I18n from 'coral-framework/modules/i18n/i18n'; import translations from '../translations'; const lang = new I18n(translations); -const ForgotContent = ({changeView, ...props}) => ( -
-
-

{lang.t('signIn.recoverPassword')}

-
-
{e.preventDefault(); props.fetchForgotPassword();}}> -
- - +class ForgotContent extends React.Component { + constructor (props) { + super(props); + this.handleSubmit = this.handleSubmit.bind(this); + } + + handleSubmit (e) { + e.preventDefault(); + this.props.fetchForgotPassword(this.emailInput.value); + } + + render () { + const {changeView, auth} = this.props; + const {passwordRequestSuccess, passwordRequestFailure} = auth; + + return ( +
+
+

{lang.t('signIn.recoverPassword')}

+
+ +
+ + this.emailInput = input} + type="text" + id="email" + name="email" /> +
+ + { + passwordRequestSuccess + ?

{passwordRequestSuccess}

+ : null + } + { + passwordRequestFailure + ?

{passwordRequestFailure}

+ : null + } + +
+ {lang.t('signIn.needAnAccount')} changeView('SIGNUP')}>{lang.t('signIn.register')} + {lang.t('signIn.alreadyHaveAnAccount')} changeView('SIGNIN')}>{lang.t('signIn.signIn')} +
- - -
- {lang.t('signIn.needAnAccount')} changeView('SIGNUP')}>{lang.t('signIn.register')} - {lang.t('signIn.alreadyHaveAnAccount')} changeView('SIGNIN')}>{lang.t('signIn.signIn')} -
-
-); + ); + } +} export default ForgotContent; diff --git a/client/coral-sign-in/components/styles.css b/client/coral-sign-in/components/styles.css index 81864eb2f..a821006fb 100644 --- a/client/coral-sign-in/components/styles.css +++ b/client/coral-sign-in/components/styles.css @@ -128,4 +128,16 @@ input.error{ .action { margin-top: 15px; -} \ No newline at end of file +} + +.passwordRequestSuccess { + border: 1px solid green; + background-color: lightgreen; + padding: 10px; +} + +.passwordRequestFailure { + border: 1px solid orange; + background-color: 1px solid coral +} + diff --git a/routes/api/user/index.js b/routes/api/user/index.js index 39bb8a5c9..14959eb65 100644 --- a/routes/api/user/index.js +++ b/routes/api/user/index.js @@ -100,7 +100,7 @@ router.post('/request-password-reset', (req, res, next) => { const {email} = req.body; if (!email) { - return next(); + return next('you must submit an email when requesting a password.'); } User