diff --git a/src/components/PageLayout/PageLayout.js b/src/components/PageLayout/PageLayout.js
index 381c08a5..7e7ece26 100644
--- a/src/components/PageLayout/PageLayout.js
+++ b/src/components/PageLayout/PageLayout.js
@@ -1,4 +1,5 @@
import React, { Component, PropTypes } from 'react';
+import { connect } from 'react-redux';
import Helmet from 'react-helmet';
import { Topbar } from '../../containers';
@@ -17,10 +18,13 @@ class PageLayout extends Component {
}
render() {
- const { className, title, children } = this.props;
+ const { className, title, children, loginError, logoutError } = this.props;
+ // TODO: use FlashMessages for loginError/logoutError
return (
+ {loginError ?
Error in login: {loginError}
: null}
+ {logoutError ?
Error in logout: {logoutError}
: null}
{title}
{children}
@@ -33,8 +37,19 @@ const { any, object, string } = PropTypes;
PageLayout.contextTypes = { history: object };
-PageLayout.defaultProps = { className: '', children: null };
+PageLayout.defaultProps = { className: '', children: null, loginError: '', logoutError: '' };
-PageLayout.propTypes = { className: string, title: string.isRequired, children: any };
+PageLayout.propTypes = {
+ className: string,
+ title: string.isRequired,
+ children: any,
+ loginError: string,
+ logoutError: string,
+};
-export default PageLayout;
+const mapStateToProps = state => ({
+ loginError: state.Auth.loginError,
+ logoutError: state.Auth.logoutError,
+});
+
+export default connect(mapStateToProps)(PageLayout);
diff --git a/src/ducks/Auth.ducks.js b/src/ducks/Auth.ducks.js
index 8a5be972..ff9c9177 100644
--- a/src/ducks/Auth.ducks.js
+++ b/src/ducks/Auth.ducks.js
@@ -30,13 +30,26 @@ export default function reducer(state = initialState, action = {}) {
case LOGIN:
return { ...state, loginInProgress: true };
case LOGIN_SUCCESS:
- return { ...state, loginInProgress: false, isAuthenticated: true, user: payload };
+ return {
+ ...state,
+ loginInProgress: false,
+ isAuthenticated: true,
+ user: payload,
+ loginError: null,
+ logoutError: null,
+ };
case LOGIN_FAILURE:
- return { ...state, loginInProgress: false, loginError: payload };
+ return { ...state, loginInProgress: false, loginError: payload.message };
case LOGOUT:
return { ...state, logoutInProgress: true };
case LOGOUT_SUCCESS:
- return { ...state, logoutInProgress: false, isAuthenticated: false, user: null };
+ return {
+ ...state,
+ logoutInProgress: false,
+ isAuthenticated: false,
+ user: null,
+ logoutError: null,
+ };
case LOGOUT_FAILURE:
return { ...state, logoutInProgress: false, logoutError: payload };
default:
@@ -59,7 +72,11 @@ export const logoutFailure = error => ({ type: LOGOUT_FAILURE, payload: error, e
function* callLogin(action) {
const { payload } = action;
yield call(delay, 1000);
- yield put(loginSuccess(payload));
+ if (payload.email === 'me@example.com' && payload.password) {
+ yield put(loginSuccess(payload));
+ } else {
+ yield put(loginFailure(new Error('Invalid credentials')));
+ }
}
function* callLogout() {