diff options
| author | Andrej Mihajlov <and@codeispoetry.ru> | 2017-02-13 17:06:05 +0000 |
|---|---|---|
| committer | Andrej Mihajlov <and@codeispoetry.ru> | 2017-02-13 17:06:05 +0000 |
| commit | 18f8c8bdfa2575242f41dd775b6a51a38f962e1e (patch) | |
| tree | f007b6942fcf587534ac0f8d3b072f9045bcdb34 /app | |
| parent | 91c10ffcf4c0577507970d71f1d21f4a7de51196 (diff) | |
| download | mullvadvpn-18f8c8bdfa2575242f41dd775b6a51a38f962e1e.tar.xz mullvadvpn-18f8c8bdfa2575242f41dd775b6a51a38f962e1e.zip | |
Add logout
Diffstat (limited to 'app')
| -rw-r--r-- | app/actions/user.js | 42 | ||||
| -rw-r--r-- | app/app.js | 8 | ||||
| -rw-r--r-- | app/components/Tray.js | 8 | ||||
| -rw-r--r-- | app/containers/LoginPage.js | 4 | ||||
| -rw-r--r-- | app/lib/backend.js | 11 | ||||
| -rw-r--r-- | app/reducers/user.js | 5 |
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({ |
