summaryrefslogtreecommitdiffhomepage
path: root/app
diff options
context:
space:
mode:
authorAndrej Mihajlov <and@codeispoetry.ru>2017-06-21 14:11:49 +0300
committerAndrej Mihajlov <and@codeispoetry.ru>2017-06-21 14:11:49 +0300
commit5ae8eda0075ec72424c478fdf1ff731db43b0ff5 (patch)
treec642e59864520408cbe8c1f7967cf814fdee43e8 /app
parent7950d83c2d70c72bb08415d8ecf823d85ce7bd35 (diff)
parent00c6ccf614bc92b72262e4ac57e8d602573ffc65 (diff)
downloadmullvadvpn-5ae8eda0075ec72424c478fdf1ff731db43b0ff5.tar.xz
mullvadvpn-5ae8eda0075ec72424c478fdf1ff731db43b0ff5.zip
Merge branch 'feature/flow-typed/enums-migration'
Diffstat (limited to 'app')
-rw-r--r--app/app.js17
-rw-r--r--app/components/Connect.js27
-rw-r--r--app/components/Login.js29
-rw-r--r--app/components/Settings.js3
-rw-r--r--app/containers/LoginPage.js3
-rw-r--r--app/enums.js23
-rw-r--r--app/lib/backend-redux-actions.js13
-rw-r--r--app/reducers/connect.js3
-rw-r--r--app/reducers/user.js3
-rw-r--r--app/routes.js5
10 files changed, 51 insertions, 75 deletions
diff --git a/app/app.js b/app/app.js
index 7eef8f3685..86084202af 100644
--- a/app/app.js
+++ b/app/app.js
@@ -13,7 +13,8 @@ import connectActions from './actions/connect';
import Backend from './lib/backend';
import mapBackendEventsToReduxActions from './lib/backend-redux-actions';
import mapBackendEventsToRouter from './lib/backend-routing';
-import { LoginState, ConnectionState } from './enums';
+
+import type { LoginState, ConnectionState } from './enums';
import type { TrayIconType } from './lib/tray-icon-manager';
const initialState = {};
@@ -22,16 +23,16 @@ const store = configureStore(initialState, memoryHistory);
const backend = new Backend();
// reset login state if user quit the app during login
-if([LoginState.connecting, LoginState.failed].includes(store.getState().user.status)) {
+if((['connecting', 'failed']: Array<LoginState>).includes(store.getState().user.status)) {
store.dispatch(userActions.loginChange({
- status: LoginState.none
+ status: 'none'
}));
}
// reset connection state if user quit the app when connecting
-if(store.getState().connect.status === ConnectionState.connecting) {
+if(store.getState().connect.status === 'connecting') {
store.dispatch(connectActions.connectionChange({
- status: ConnectionState.disconnected
+ status: 'disconnected'
}));
}
@@ -40,10 +41,10 @@ if(store.getState().connect.status === ConnectionState.connecting) {
/**
* Get tray icon type based on connection state
*/
-const getIconType = (s: string): TrayIconType => {
+const getIconType = (s: ConnectionState): TrayIconType => {
switch(s) {
- case ConnectionState.connected: return 'secured';
- case ConnectionState.connecting: return 'securing';
+ case 'connected': return 'secured';
+ case 'connecting': return 'securing';
default: return 'unsecured';
}
};
diff --git a/app/components/Connect.js b/app/components/Connect.js
index c060986af3..0a3bd761a9 100644
--- a/app/components/Connect.js
+++ b/app/components/Connect.js
@@ -7,7 +7,6 @@ import cheapRuler from 'cheap-ruler';
import { Layout, Container, Header } from './Layout';
import { mapbox as mapboxConfig } from '../config';
import Backend from '../lib/backend';
-import { ConnectionState } from '../enums';
import ExternalLinkSVG from '../assets/images/icon-extLink.svg';
import type HeaderBarStyle from './HeaderBar';
@@ -109,9 +108,9 @@ export default class Connect extends Component {
const preferredServer = this.props.settings.preferredServer;
const serverInfo = this.props.getServerInfo(preferredServer);
- const isConnecting = this.props.connect.status === ConnectionState.connecting;
- const isConnected = this.props.connect.status === ConnectionState.connected;
- const isDisconnected = this.props.connect.status === ConnectionState.disconnected;
+ const isConnecting = this.props.connect.status === 'connecting';
+ const isConnected = this.props.connect.status === 'connected';
+ const isDisconnected = this.props.connect.status === 'disconnected';
const altitude = (isConnecting ? 300 : 100) * 1000;
@@ -338,19 +337,19 @@ export default class Connect extends Component {
headerStyle(): HeaderBarStyle {
switch(this.props.connect.status) {
- case ConnectionState.connecting:
- case ConnectionState.disconnected:
+ case 'connecting':
+ case 'disconnected':
return 'error';
- case ConnectionState.connected:
+ case 'connected':
return 'success';
}
}
networkSecurityClass() {
let classes = ['connect__status-security'];
- if(this.props.connect.status === ConnectionState.connected) {
+ if(this.props.connect.status === 'connected') {
classes.push('connect__status-security--secure');
- } else if(this.props.connect.status === ConnectionState.disconnected) {
+ } else if(this.props.connect.status === 'disconnected') {
classes.push('connect__status-security--unsecured');
}
@@ -359,15 +358,15 @@ export default class Connect extends Component {
networkSecurityMessage() {
switch(this.props.connect.status) {
- case ConnectionState.connected: return 'Secure connection';
- case ConnectionState.connecting: return 'Creating secure connection';
+ case 'connected': return 'Secure connection';
+ case 'connecting': return 'Creating secure connection';
default: return 'Unsecured connection';
}
}
spinnerClass() {
var classes = ['connect__status-icon'];
- if(this.props.connect.status !== ConnectionState.connecting) {
+ if(this.props.connect.status !== 'connecting') {
classes.push('connect__status-icon--hidden');
}
return classes.join(' ');
@@ -375,14 +374,14 @@ export default class Connect extends Component {
ipAddressClass() {
var classes = ['connect__status-ipaddress'];
- if(this.props.connect.status === ConnectionState.connecting) {
+ if(this.props.connect.status === 'connecting') {
classes.push('connect__status-ipaddress--invisible');
}
return classes.join(' ');
}
displayLocation() {
- if(this.props.connect.status === ConnectionState.disconnected) {
+ if(this.props.connect.status === 'disconnected') {
const { location, country, city } = this.props.user;
return { location, country, city };
}
diff --git a/app/components/Login.js b/app/components/Login.js
index 3e841e096f..2bcf40950e 100644
--- a/app/components/Login.js
+++ b/app/components/Login.js
@@ -1,7 +1,6 @@
import React, { Component, PropTypes } from 'react';
import { If, Then } from 'react-if';
import { Layout, Container, Header } from './Layout';
-import { LoginState } from '../enums';
import AccountInput from './AccountInput';
import ExternalLinkSVG from '../assets/images/icon-extLink.svg';
import LoginArrowSVG from '../assets/images/icon-arrow.svg';
@@ -28,7 +27,7 @@ export default class Login extends Component {
const prev = this.props.user || {};
const next = nextProps.user || {};
- if(prev.status !== next.status && next.status === LoginState.failed) {
+ if(prev.status !== next.status && next.status === 'failed') {
this.setState({ notifyOnFirstChangeAfterFailure: true });
}
}
@@ -63,17 +62,17 @@ export default class Login extends Component {
formTitle(s) {
switch(s) {
- case LoginState.connecting: return 'Logging in...';
- case LoginState.failed: return 'Login failed';
- case LoginState.ok: return 'Login successful';
+ case 'connecting': return 'Logging in...';
+ case 'failed': return 'Login failed';
+ case 'ok': return 'Login successful';
default: return 'Login';
}
}
formSubtitle(s, e) {
switch(s) {
- case LoginState.failed: return e.message;
- case LoginState.connecting: return 'Checking account number';
+ case 'failed': return e.message;
+ case 'connecting': return 'Checking account number';
default: return 'Enter your account number';
}
}
@@ -86,10 +85,10 @@ export default class Login extends Component {
}
switch(user.status) {
- case LoginState.connecting:
+ case 'connecting':
classes.push('login-form__input-wrap--inactive');
break;
- case LoginState.failed:
+ case 'failed':
classes.push('login-form__input-wrap--error');
break;
}
@@ -100,8 +99,8 @@ export default class Login extends Component {
footerClass(user) {
const classes = ['login-footer'];
switch(user.status) {
- case LoginState.ok:
- case LoginState.connecting:
+ case 'ok':
+ case 'connecting':
classes.push('login-footer--invisible');
break;
}
@@ -115,7 +114,7 @@ export default class Login extends Component {
classes.push('login-form__submit--active');
}
- if(user.status === LoginState.connecting) {
+ if(user.status === 'connecting') {
classes.push('login-form__submit--invisible');
}
@@ -126,9 +125,9 @@ export default class Login extends Component {
const { account, status, error } = this.props.user;
const title = this.formTitle(status);
const subtitle = this.formSubtitle(status, error);
- const isConnecting = status === LoginState.connecting;
- const isFailed = status === LoginState.failed;
- const isLoggedIn = status === LoginState.ok;
+ const isConnecting = status === 'connecting';
+ const isFailed = status === 'failed';
+ const isLoggedIn = status === 'ok';
const inputWrapClass = this.inputWrapClass(this.props.user);
const footerClass = this.footerClass(this.props.user);
diff --git a/app/components/Settings.js b/app/components/Settings.js
index 08a9af441b..cc8dc24f25 100644
--- a/app/components/Settings.js
+++ b/app/components/Settings.js
@@ -4,7 +4,6 @@ import { If, Then, Else } from 'react-if';
import { Layout, Container, Header } from './Layout';
import Switch from './Switch';
import CustomScrollbars from './CustomScrollbars';
-import { LoginState } from '../enums';
export default class Settings extends Component {
@@ -34,7 +33,7 @@ export default class Settings extends Component {
}
render() {
- const isLoggedIn = this.props.user.status === LoginState.ok;
+ const isLoggedIn = this.props.user.status === 'ok';
let isOutOfTime = false, formattedPaidUntil = '';
let paidUntilIso = this.props.user.paidUntil;
diff --git a/app/containers/LoginPage.js b/app/containers/LoginPage.js
index f5a75ca989..163e55f145 100644
--- a/app/containers/LoginPage.js
+++ b/app/containers/LoginPage.js
@@ -4,7 +4,6 @@ import { bindActionCreators } from 'redux';
import { push } from 'react-router-redux';
import Login from '../components/Login';
import userActions from '../actions/user';
-import { LoginState } from '../enums';
import { links } from '../config';
const mapStateToProps = (state) => state;
@@ -15,7 +14,7 @@ const mapDispatchToProps = (dispatch, props) => {
onSettings: () => dispatch(push('/settings')),
onLogin: (account) => login(backend, account),
onChange: (account) => loginChange({ account }),
- onFirstChangeAfterFailure: () => loginChange({ status: LoginState.none, error: null }),
+ onFirstChangeAfterFailure: () => loginChange({ status: 'none', error: null }),
onExternalLink: (type) => shell.openExternal(links[type])
};
};
diff --git a/app/enums.js b/app/enums.js
index 8613b52bf8..6f4647efa6 100644
--- a/app/enums.js
+++ b/app/enums.js
@@ -1,20 +1,3 @@
-import Enum from './lib/enum';
-
-/**
- * Login state enum used for React components
- * @type {LoginState}
- * @property {string} none Initial state (not logged in)
- * @property {string} connecting Attempting to log in
- * @property {string} failed Failed to log in
- * @property {string} ok Logged in
- */
-export const LoginState = new Enum('none', 'connecting', 'failed', 'ok');
-
-/**
- * Connection state enum used for React components
- * @type {ConnectionState}
- * @property {string} disconnected Initial state (disconnected)
- * @property {string} connecting Connecting
- * @property {string} connected Connected
- */
-export const ConnectionState = new Enum('disconnected', 'connecting', 'connected');
+// @flow
+export type LoginState = 'none' | 'connecting' | 'failed' | 'ok';
+export type ConnectionState = 'disconnected' | 'connecting' | 'connected';
diff --git a/app/lib/backend-redux-actions.js b/app/lib/backend-redux-actions.js
index 4e3dd63323..50bfd22943 100644
--- a/app/lib/backend-redux-actions.js
+++ b/app/lib/backend-redux-actions.js
@@ -1,7 +1,6 @@
import userActions from '../actions/user';
import connectActions from '../actions/connect';
import Backend from './backend';
-import { LoginState, ConnectionState } from '../enums';
import log from 'electron-log';
/**
@@ -22,7 +21,7 @@ export default function mapBackendEventsToReduxActions(backend, store) {
const onConnecting = (serverAddress) => {
store.dispatch(connectActions.connectionChange({
- status: ConnectionState.connecting,
+ status: 'connecting',
serverAddress
}));
};
@@ -31,33 +30,33 @@ export default function mapBackendEventsToReduxActions(backend, store) {
if (error) {
log.error('Unable to connect to', serverAddress, error);
} else {
- store.dispatch(connectActions.connectionChange({ status: ConnectionState.connected }));
+ store.dispatch(connectActions.connectionChange({ status: 'connected' }));
}
};
const onDisconnect = () => {
store.dispatch(connectActions.connectionChange({
- status: ConnectionState.disconnected,
+ status: 'disconnected',
serverAddress: null
}));
};
const onLoggingIn = (info) => {
store.dispatch(userActions.loginChange(Object.assign({
- status: LoginState.connecting,
+ status: 'connecting',
error: null
}, info)));
};
const onLogin = (info, error) => {
- const status = error ? LoginState.failed : LoginState.ok;
+ const status = error ? 'failed' : 'ok';
const paidUntil = info.paidUntil ? info.paidUntil : null;
store.dispatch(userActions.loginChange({ paidUntil, status, error }));
};
const onLogout = () => {
store.dispatch(userActions.loginChange({
- status: LoginState.none,
+ status: 'none',
account: '',
paidUntil: null,
error: null
diff --git a/app/reducers/connect.js b/app/reducers/connect.js
index 35af5e888b..cf3dc35906 100644
--- a/app/reducers/connect.js
+++ b/app/reducers/connect.js
@@ -1,9 +1,8 @@
import { handleActions } from 'redux-actions';
-import { ConnectionState } from '../enums';
import actions from '../actions/connect';
const initialState = {
- status: ConnectionState.disconnected,
+ status: 'disconnected',
isOnline: true,
serverAddress: null,
clientIp: null
diff --git a/app/reducers/user.js b/app/reducers/user.js
index 15685034b8..1409c77a4e 100644
--- a/app/reducers/user.js
+++ b/app/reducers/user.js
@@ -1,6 +1,5 @@
import { handleActions } from 'redux-actions';
import actions from '../actions/user';
-import { LoginState } from '../enums';
const initialState = {
account: null,
@@ -8,7 +7,7 @@ const initialState = {
location: [0, 0],
country: null,
city: null,
- status: LoginState.none,
+ status: 'none',
error: null
};
diff --git a/app/routes.js b/app/routes.js
index e61782f5f1..d815d12100 100644
--- a/app/routes.js
+++ b/app/routes.js
@@ -7,7 +7,6 @@ import ConnectPage from './containers/ConnectPage';
import SettingsPage from './containers/SettingsPage';
import AccountPage from './containers/AccountPage';
import SelectLocationPage from './containers/SelectLocationPage';
-import { LoginState } from './enums';
import { getTransitionProps } from './transitions';
/**
@@ -55,7 +54,7 @@ export default function makeRoutes(getState, componentProps) {
return (
<Route {...rest} render={ (routeProps) => {
const { user } = getState();
- const isLoggedIn = user.status === LoginState.ok;
+ const isLoggedIn = user.status === 'ok';
if(isLoggedIn) {
return renderMergedProps(component, routeProps, ...rest);
@@ -76,7 +75,7 @@ export default function makeRoutes(getState, componentProps) {
return (
<Route {...rest} render={ (routeProps) => {
const { user } = getState();
- const isLoggedIn = user.status === LoginState.ok;
+ const isLoggedIn = user.status === 'ok';
if(isLoggedIn) {
return (<Redirect to={ '/connect' } />);