Skip to content

Commit 6575e74

Browse files
committed
Issue #19 - When you log in (successfully) the login window remains open (also when you log out)
Fixes #19
1 parent 0baa411 commit 6575e74

File tree

7 files changed

+59
-61
lines changed

7 files changed

+59
-61
lines changed

src/api/User.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ class UserApi {
2424

2525
login(email, password) {
2626
const url = `${this.basePath}/api/v1/login`;
27-
2827
return reqwest({
2928
url,
3029
method: 'post',

src/containers/HeaderContainer.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import Header from 'components/Header';
22
import {asyncConnect} from 'redux-connect';
3-
import {actions, toggleNotification, loginAction, logoutAction} from '../store/modules/global';
3+
import {actions, toggleNotification, logoutAction} from '../store/modules/global';
44

55
const resolve = [{
66
promise: () => Promise.resolve(),

src/routes/Home/components/LoginModal/LoginModal.jsx

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -76,17 +76,6 @@ class LogInModal extends React.Component {
7676
this.setState({modalLoginIsOpen: true});
7777
}
7878

79-
handleLogin(handleLoggedIn, loggedUser) {
80-
const _self = this;
81-
setTimeout(() => {
82-
handleLoggedIn();
83-
if (loggedUser) {
84-
_self.setState({modalLoginIsOpen: false});
85-
_self.setState({modalSignupIsOpen: false});
86-
}
87-
}, 100);
88-
}
89-
9079
forgetPassword() {
9180
this.setState({showForgetPassword: true});
9281
}
@@ -133,7 +122,7 @@ class LogInModal extends React.Component {
133122

134123
render() {
135124
const _self = this;
136-
const {handleSubmit, fields, handleLoggedIn, loggedUser, hasError, errorText} = this.props;
125+
const {handleSubmit, fields, hasError, errorText} = this.props;
137126
return (
138127
<div styleName="signin-modal">
139128
<div styleName="login-signup">
@@ -154,7 +143,7 @@ class LogInModal extends React.Component {
154143
{this.state.showForgetPassword === true && <div styleName="title">Reset forgotten password</div>}
155144
</div>
156145
{this.state.showForgetPassword === false &&
157-
<form styleName="login-form" onSubmit={handleSubmit}>
146+
<form styleName="login-form">
158147
<div styleName="login-with-fb">
159148
<a href="javascript:;" onClick={this.facebookLogin.bind(this)}>
160149
<i styleName="icon-facebook" />
@@ -176,7 +165,7 @@ class LogInModal extends React.Component {
176165
</div>
177166
{/* or end */}
178167
<div>
179-
{hasError && <span className="error-msg">{errorText.error}</span>}
168+
{hasError && <span className="error-msg">{errorText}</span>}
180169
<div styleName="email-input">
181170
<FormField {...fields.email}>
182171
<TextField {...fields.email} login type="email" label="Email" />
@@ -203,8 +192,9 @@ class LogInModal extends React.Component {
203192
</div>
204193
<div styleName="login-btn">
205194
<Button
206-
type="submit" color="black"
207-
className={styles.btnLogin} onClick={() => this.handleLogin(handleLoggedIn, loggedUser)}
195+
color="black"
196+
className={styles.btnLogin}
197+
onClick={handleSubmit(this.props.loginAction)}
208198
>
209199
Log In
210200
</Button>
@@ -217,7 +207,7 @@ class LogInModal extends React.Component {
217207
{ this.state.showForgetPassword === true &&
218208
<form styleName="login-form" onSubmit={handleSubmit((data) => _self.handleForgetPassword(data))}>
219209
<div>
220-
{hasError && <span className="error-msg">{errorText.error}</span>}
210+
{hasError && <span className="error-msg">{errorText}</span>}
221211
<div styleName="email-input">
222212
<FormField {...fields.emailUp}>
223213
<TextField {...fields.emailUp} login type="email" label="Email" />
@@ -238,10 +228,9 @@ class LogInModal extends React.Component {
238228
}
239229

240230
LogInModal.propTypes = {
241-
handleSubmit: PropTypes.func.isRequired,
231+
handleSubmit: PropTypes.func,
242232
fields: PropTypes.object,
243-
handleLoggedIn: PropTypes.func.isRequired,
244-
loggedUser: PropTypes.bool,
233+
loginAction: PropTypes.func.isRequired,
245234
hasError: PropTypes.bool,
246235
errorText: PropTypes.string,
247236
};

src/routes/Home/components/SignupModal/SignupModal.jsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import CSSModules from 'react-css-modules';
33
import {reduxForm} from 'redux-form';
44
import cn from 'classnames';
55
import Modal from 'react-modal';
6-
import Select from 'components/Select';
76
import Button from 'components/Button';
87
import TextField from 'components/TextField';
98
import styles from './SignupModal.scss';
@@ -152,7 +151,7 @@ class SignupModal extends React.Component {
152151
</div>
153152
{/* or end */}
154153
<div>
155-
{hasError && <span className="error-msg">{errorText.error}</span>}
154+
{hasError && <span className="error-msg">{errorText}</span>}
156155
<div styleName="email-input">
157156
<FormField {...fields.email}>
158157
<TextField {...fields.email} login type="email" label="Email" />
Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
import {connect} from 'react-redux';
2-
import {sendLoginRequest, loginAction} from '../../../store/modules/global';
2+
import {loginAction} from '../../../store/modules/global';
33
import LogInModal from '../components/LoginModal';
44

5-
const mapState = (state) => ({...state.global, onSubmit: sendLoginRequest});
5+
const mapState = (state) => ({...state.global});
66

7-
const mapDispatchToProps = (dispatch) => ({
8-
handleLoggedIn: (value) => dispatch(loginAction(value)),
9-
});
10-
11-
export default connect(mapState, mapDispatchToProps)(LogInModal);
7+
export default connect(mapState, {
8+
loginAction,
9+
})(LogInModal);

src/routes/Home/containers/SignupModalContainer.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import {sendSignupRequest, signupAction} from '../../../store/modules/global';
33

44
import SignupModal from '../components/SignupModal';
55

6-
const mapState = (state) => ({...state.global, onSubmit: sendSignupRequest,});
6+
const mapState = (state) => ({...state.global, onSubmit: sendSignupRequest});
77

88
const mapDispatchToProps = (dispatch) => ({
99
handleSigned: (value) => dispatch(signupAction(value)),

src/store/modules/global.js

Lines changed: 42 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,26 @@ const userApi = new UserApi(config.api.basePath);
1010
//------------------------------------------------------------------------------
1111
// Constants
1212

13+
const LOGIN_ACTION_FAILURE = 'LOGIN_ACTION_FAILURE';
14+
const LOGIN_ACTION_SUCCESS = 'LOGIN_ACTION_SUCCESS';
15+
16+
const LOGIN_REDIRECT = {
17+
admin: '/admin',
18+
consumer: '/browse-provider',
19+
pilot: '/pilot',
20+
provider: '/dashboard',
21+
};
22+
1323
const LOGOUT_ACTION = 'LOGOUT_ACTION';
1424
const USER_INFO_KEY = 'userInfo';
1525

1626
// ------------------------------------
1727
// Actions
1828
// ------------------------------------
29+
30+
// TODO: Any use of these local variables should be eliminated!
31+
// Their current usage should be entirely replaced using the redux state,
32+
// and action payloads!
1933
let isLogged = false;
2034
let hasError = false;
2135
let errorText = '';
@@ -30,29 +44,6 @@ function loadUserInfo() {
3044
return userInfo;
3145
}
3246

33-
export const sendLoginRequest = (values) => new Promise((resolve) => {
34-
userApi.login(values.email, values.password).then((authResult) => {
35-
isLogged = true;
36-
hasError = false;
37-
userInfo = authResult;
38-
localStorage.setItem(USER_INFO_KEY, JSON.stringify(authResult));
39-
if (authResult.user.role === 'consumer') {
40-
browserHistory.push('/browse-provider');
41-
} else if (authResult.user.role === 'provider') {
42-
browserHistory.push('/dashboard');
43-
} else if (authResult.user.role === 'admin') {
44-
browserHistory.push('/admin');
45-
} else if (authResult.user.role === 'pilot') {
46-
browserHistory.push('/pilot');
47-
}
48-
}).catch((err) => {
49-
isLogged = false;
50-
hasError = true;
51-
errorText = JSON.parse(err.responseText);
52-
});
53-
resolve();
54-
});
55-
5647
export const sendSignupRequest = (values) => new Promise((resolve) => {
5748
userApi.register(values.firstName, values.lastName, values.email, values.password).then(() => {
5849
isLogged = true;
@@ -68,14 +59,25 @@ export const sendSignupRequest = (values) => new Promise((resolve) => {
6859

6960
export const toggleNotification = createAction('TOGGLE_NOTIFICATION');
7061

71-
export const loginAction = createAction('LOGIN_ACTION');
62+
export const loginAction = (data) => (dispatch) => {
63+
userApi.login(data.email, data.password).then((res) => {
64+
localStorage.setItem(USER_INFO_KEY, JSON.stringify(res));
65+
dispatch({type: LOGIN_ACTION_SUCCESS});
66+
browserHistory.push(LOGIN_REDIRECT[res.user.role]);
67+
}).catch((failure) => {
68+
dispatch({
69+
type: LOGIN_ACTION_FAILURE,
70+
payload: JSON.parse(failure.response).error,
71+
});
72+
});
73+
};
7274

73-
export const logoutAction = () => dispatch => {
75+
export const logoutAction = () => (dispatch) => {
7476
browserHistory.push('/home');
7577
dispatch({
76-
type: LOGOUT_ACTION
78+
type: LOGOUT_ACTION,
7779
});
78-
}
80+
};
7981

8082
export const signupAction = createAction('SIGNUP_ACTION');
8183

@@ -90,8 +92,19 @@ export default handleActions({
9092
[toggleNotification]: (state, action) => ({
9193
...state, toggleNotif: action.payload,
9294
}),
93-
[loginAction]: (state) => ({
94-
...state, loggedUser: isLogged, hasError, errorText, user: (loadUserInfo() ? loadUserInfo().user : {}),
95+
[LOGIN_ACTION_FAILURE]: (state, action) => ({
96+
...state,
97+
loggedUser: false,
98+
hasError: true,
99+
errorText: action.payload,
100+
user: {},
101+
}),
102+
[LOGIN_ACTION_SUCCESS]: (state) => ({
103+
...state,
104+
loggedUser: true,
105+
hasError: false,
106+
errorText: '',
107+
user: (loadUserInfo() ? loadUserInfo().user : {}),
95108
}),
96109
[LOGOUT_ACTION]: (state) => {
97110
localStorage.removeItem(USER_INFO_KEY);

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy