summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--app/actions/user.js42
-rw-r--r--app/app.js8
-rw-r--r--app/components/Tray.js8
-rw-r--r--app/containers/LoginPage.js4
-rw-r--r--app/lib/backend.js11
-rw-r--r--app/reducers/user.js5
6 files changed, 62 insertions, 16 deletions
diff --git a/app/actions/user.js b/app/actions/user.js
index 1a229d850f..90d02bd269 100644
--- a/app/actions/user.js
+++ b/app/actions/user.js
@@ -1,25 +1,55 @@
import assert from 'assert';
import { createAction } from 'redux-actions';
+import { replace } from 'react-router-redux'
import { LoginState } from '../constants';
const loginChange = createAction('USER_LOGIN_CHANGE');
-const requestLogin = (backend, account) => {
+const login = (backend, account) => {
return async (dispatch, getState) => {
try {
- dispatch(loginChange({ account: account, status: LoginState.connecting }));
+ dispatch(loginChange({
+ account: account,
+ status: LoginState.connecting
+ }));
await backend.login(account);
- dispatch(loginChange({ status: LoginState.ok }));
+ dispatch(loginChange({
+ status: LoginState.ok
+ }));
} catch(e) {
- dispatch(loginChange({ status: LoginState.failed, error: e }));
+ dispatch(loginChange({
+ status: LoginState.failed,
+ error: e
+ }));
}
};
};
+const logout = (backend) => {
+ return async (dispatch, getState) => {
+ try {
+ await backend.logout();
+ } catch(e) {
+ console.log(`Failed to log out: ${e.message}`)
+ }
+
+ // reset login information
+ dispatch(loginChange({
+ status: LoginState.none,
+ account: '',
+ error: undefined
+ }));
+
+ // redirect user to /
+ dispatch(replace('/'));
+ };
+};
+
export default {
- requestLogin,
- loginChange
+ login,
+ logout,
+ loginChange
};
diff --git a/app/app.js b/app/app.js
index 4b85a79ffd..6ac3ce492f 100644
--- a/app/app.js
+++ b/app/app.js
@@ -33,11 +33,11 @@ const createElement = (Component, props) => {
ReactDOM.render(
<div>
- <Provider store={store}>
- <Router history={routerHistory} routes={routes} createElement={createElement} />
+ <Provider store={ store }>
+ <Router history={ routerHistory } routes={ routes } createElement={ createElement } />
</Provider>
- <Provider store={store}>
- <Tray handle={tray} history={routerHistory} />
+ <Provider store={ store }>
+ <Tray handle={ tray } backend={ backend } />
</Provider>
</div>,
rootElement
diff --git a/app/components/Tray.js b/app/components/Tray.js
index 11075cab36..00dc679981 100644
--- a/app/components/Tray.js
+++ b/app/components/Tray.js
@@ -2,15 +2,17 @@ import React, { Component, PropTypes } from 'react';
import { TrayMenu, TrayItem } from '../lib/components/TrayMenu';
import { shell } from 'electron';
+import { LoginState } from '../constants';
+
export default class Tray extends Component {
static propTypes = {
handle: PropTypes.object.isRequired,
+ backend: PropTypes.object.isRequired
}
logout() {
- this.props.login({ username: '', loggedIn: false });
- this.props.history.push('/');
+ this.props.logout(this.props.backend);
}
openPrivacyPolicy() {
@@ -22,7 +24,7 @@ export default class Tray extends Component {
}
render() {
- const loggedIn = this.props.user && this.props.user.loggedIn;
+ const loggedIn = this.props.user.status === LoginState.ok;
return (
<TrayMenu tray={ this.props.handle }>
diff --git a/app/containers/LoginPage.js b/app/containers/LoginPage.js
index 6db5d3656c..51cdd297c2 100644
--- a/app/containers/LoginPage.js
+++ b/app/containers/LoginPage.js
@@ -12,13 +12,13 @@ const mapDispatchToProps = (dispatch, props) => {
const user = bindActionCreators(userActions, dispatch);
return {
onLogin: (account) => {
- return user.requestLogin(props.backend, account);
+ return user.login(props.backend, account);
},
onChange: (account) => {
return user.loginChange({ account });
},
onFirstChangeAfterFailure: () => {
- return user.loginChange({ status: LoginState.none, error: null })
+ return user.loginChange({ status: LoginState.none, error: undefined })
}
};
};
diff --git a/app/lib/backend.js b/app/lib/backend.js
index 7cd5c0af1f..7d94baa5a5 100644
--- a/app/lib/backend.js
+++ b/app/lib/backend.js
@@ -36,6 +36,13 @@ class BackendImpl {
}, 2000);
});
}
+
+ logout() {
+ return new Promise((resolve, reject) => {
+ // @TODO: Add logout call
+ resolve();
+ });
+ }
}
/**
@@ -62,4 +69,8 @@ export default class Backend {
return getImpl(this).login(account);
}
+ logout() {
+ return getImpl(this).logout();
+ }
+
};
diff --git a/app/reducers/user.js b/app/reducers/user.js
index 981e0d1d64..1d74cb31fd 100644
--- a/app/reducers/user.js
+++ b/app/reducers/user.js
@@ -2,8 +2,11 @@ import { handleActions } from 'redux-actions';
import actions from '../actions/user';
+import { LoginState } from '../constants';
+
const initialState = {
- account: ""
+ account: "",
+ status: LoginState.none
};
export default handleActions({