add login error for invalid username or password
This commit is contained in:
parent
3b6bfbc552
commit
1d86d766d9
6 changed files with 57 additions and 16 deletions
|
@ -21,7 +21,6 @@ export const INDENT_WITH_TAB = 'INDENT_WITH_TAB';
|
||||||
|
|
||||||
export const AUTH_USER = 'AUTH_USER';
|
export const AUTH_USER = 'AUTH_USER';
|
||||||
export const UNAUTH_USER = 'UNAUTH_USER';
|
export const UNAUTH_USER = 'UNAUTH_USER';
|
||||||
|
|
||||||
export const AUTH_ERROR = 'AUTH_ERROR';
|
export const AUTH_ERROR = 'AUTH_ERROR';
|
||||||
|
|
||||||
export const SET_PROJECT_NAME = 'SET_PROJECT_NAME';
|
export const SET_PROJECT_NAME = 'SET_PROJECT_NAME';
|
||||||
|
|
|
@ -25,17 +25,53 @@ export function signUpUser(formValues) {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// export function loginUser(formValues) {
|
||||||
|
// return (dispatch) => {
|
||||||
|
// axios.post(`${ROOT_URL}/login`, formValues, { withCredentials: true })
|
||||||
|
// .then(response => {
|
||||||
|
// dispatch({ type: ActionTypes.AUTH_USER,
|
||||||
|
// user: response.data
|
||||||
|
// });
|
||||||
|
// browserHistory.push('/');
|
||||||
|
// })
|
||||||
|
// .catch(response => {
|
||||||
|
// return Promise.reject({ email: response.data.message, _error: 'Login failed!' });
|
||||||
|
// });
|
||||||
|
// };
|
||||||
|
// }
|
||||||
|
|
||||||
export function loginUser(formValues) {
|
export function loginUser(formValues) {
|
||||||
return (dispatch) => {
|
return axios.post(`${ROOT_URL}/login`, formValues, { withCredentials: true });
|
||||||
axios.post(`${ROOT_URL}/login`, formValues, { withCredentials: true })
|
}
|
||||||
|
|
||||||
|
export function loginUserSuccess(user) {
|
||||||
|
return {
|
||||||
|
type: ActionTypes.AUTH_USER,
|
||||||
|
user
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export function loginUserFailure(error) {
|
||||||
|
return {
|
||||||
|
type: ActionTypes.AUTH_ERROR,
|
||||||
|
error
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export function validateAndLoginUser(formProps, dispatch) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
loginUser(formProps)
|
||||||
.then(response => {
|
.then(response => {
|
||||||
dispatch({ type: ActionTypes.AUTH_USER,
|
dispatch({ type: ActionTypes.AUTH_USER,
|
||||||
user: response.data
|
user: response.data
|
||||||
});
|
});
|
||||||
browserHistory.push('/');
|
browserHistory.push('/');
|
||||||
|
resolve();
|
||||||
})
|
})
|
||||||
.catch(response => dispatch(authError(response.data.error)));
|
.catch(response => {
|
||||||
};
|
reject({ email: response.data.message, _error: 'Login failed!' });
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getUser() {
|
export function getUser() {
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
import React, { PropTypes } from 'react';
|
import React, { PropTypes } from 'react';
|
||||||
|
|
||||||
function LoginForm(props) {
|
function LoginForm(props) {
|
||||||
const { fields: { email, password }, handleSubmit } = props;
|
const { fields: { email, password }, handleSubmit, submitting, invalid, pristine } = props;
|
||||||
return (
|
return (
|
||||||
<form className="login-form" onSubmit={handleSubmit(props.loginUser.bind(this))}>
|
<form className="login-form" onSubmit={handleSubmit(props.validateAndLoginUser.bind(this))}>
|
||||||
<p className="login-form__field">
|
<p className="login-form__field">
|
||||||
<input
|
<input
|
||||||
className="login-form__email-input"
|
className="login-form__email-input"
|
||||||
|
@ -12,6 +12,7 @@ function LoginForm(props) {
|
||||||
placeholder="Email"
|
placeholder="Email"
|
||||||
{...email}
|
{...email}
|
||||||
/>
|
/>
|
||||||
|
{email.touched && email.error && <span className="form-error">{email.error}</span>}
|
||||||
</p>
|
</p>
|
||||||
<p className="login-form__field">
|
<p className="login-form__field">
|
||||||
<input
|
<input
|
||||||
|
@ -21,8 +22,9 @@ function LoginForm(props) {
|
||||||
placeholder="Password"
|
placeholder="Password"
|
||||||
{...password}
|
{...password}
|
||||||
/>
|
/>
|
||||||
|
{password.touched && password.error && <span className="form-error">{password.error}</span>}
|
||||||
</p>
|
</p>
|
||||||
<input type="submit" value="Login" aria-label="login" />
|
<input type="submit" disabled={submitting || invalid || pristine} value="Login" aria-label="login" />
|
||||||
</form>
|
</form>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -33,7 +35,10 @@ LoginForm.propTypes = {
|
||||||
password: PropTypes.string.isRequired
|
password: PropTypes.string.isRequired
|
||||||
}).isRequired,
|
}).isRequired,
|
||||||
handleSubmit: PropTypes.func.isRequired,
|
handleSubmit: PropTypes.func.isRequired,
|
||||||
loginUser: PropTypes.func.isRequired
|
validateAndLoginUser: PropTypes.func.isRequired,
|
||||||
|
submitting: PropTypes.bool,
|
||||||
|
invalid: PropTypes.bool,
|
||||||
|
pristine: PropTypes.bool
|
||||||
};
|
};
|
||||||
|
|
||||||
export default LoginForm;
|
export default LoginForm;
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { bindActionCreators } from 'redux';
|
|
||||||
import { reduxForm } from 'redux-form';
|
import { reduxForm } from 'redux-form';
|
||||||
import * as UserActions from '../actions';
|
import { validateAndLoginUser } from '../actions';
|
||||||
import LoginForm from '../components/LoginForm';
|
import LoginForm from '../components/LoginForm';
|
||||||
import GithubButton from '../components/GithubButton';
|
import GithubButton from '../components/GithubButton';
|
||||||
|
|
||||||
|
@ -23,8 +22,10 @@ function mapStateToProps(state) {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
function mapDispatchToProps(dispatch) {
|
function mapDispatchToProps() {
|
||||||
return bindActionCreators(UserActions, dispatch);
|
return {
|
||||||
|
validateAndLoginUser
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
function validate(formProps) {
|
function validate(formProps) {
|
||||||
|
|
|
@ -95,7 +95,7 @@
|
||||||
"react-router": "^2.4.1",
|
"react-router": "^2.4.1",
|
||||||
"react-split-pane": "^0.1.44",
|
"react-split-pane": "^0.1.44",
|
||||||
"redux": "^3.5.2",
|
"redux": "^3.5.2",
|
||||||
"redux-form": "^5.2.5",
|
"redux-form": "^5.3.3",
|
||||||
"redux-thunk": "^2.1.0",
|
"redux-thunk": "^2.1.0",
|
||||||
"s3-policy": "^0.2.0",
|
"s3-policy": "^0.2.0",
|
||||||
"shortid": "^2.2.6",
|
"shortid": "^2.2.6",
|
||||||
|
|
|
@ -4,7 +4,7 @@ export function createSession(req, res, next) {
|
||||||
passport.authenticate('local', (err, user) => { // eslint-disable-line consistent-return
|
passport.authenticate('local', (err, user) => { // eslint-disable-line consistent-return
|
||||||
if (err) { return next(err); }
|
if (err) { return next(err); }
|
||||||
if (!user) {
|
if (!user) {
|
||||||
return res.status(401).send({ error: 'Invalid username or password' });
|
return res.status(401).send({ message: 'Invalid username or password.' });
|
||||||
}
|
}
|
||||||
|
|
||||||
req.logIn(user, (innerErr) => {
|
req.logIn(user, (innerErr) => {
|
||||||
|
|
Loading…
Reference in a new issue