summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2018-09-24 10:14:02 -0300
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2018-09-24 10:14:02 -0300
commitcd6675854025b3866a931ba4d42205ffbf7613a0 (patch)
tree8c32cae0f18c98d8cc05a5759a7e5c8c3ae3fa69
parent6d05c951c73f0166def069238d1324867ceb0058 (diff)
parent0420e721ab9b6743510979faf442a27ff757ceee (diff)
downloadmullvadvpn-cd6675854025b3866a931ba4d42205ffbf7613a0.tar.xz
mullvadvpn-cd6675854025b3866a931ba4d42205ffbf7613a0.zip
Merge branch 'simplify-account-data-update'
-rw-r--r--gui/packages/desktop/src/main/index.js7
-rw-r--r--gui/packages/desktop/src/renderer/app.js9
-rw-r--r--gui/packages/desktop/src/renderer/components/Account.js33
-rw-r--r--gui/packages/desktop/src/renderer/components/Connect.js13
-rw-r--r--gui/packages/desktop/src/renderer/components/Settings.js16
-rw-r--r--gui/packages/desktop/src/renderer/containers/AccountPage.js1
-rw-r--r--gui/packages/desktop/src/renderer/containers/ConnectPage.js1
-rw-r--r--gui/packages/desktop/src/renderer/containers/SettingsPage.js3
-rw-r--r--gui/packages/desktop/src/renderer/lib/window-state-observer.js64
9 files changed, 17 insertions, 130 deletions
diff --git a/gui/packages/desktop/src/main/index.js b/gui/packages/desktop/src/main/index.js
index c9067a0146..46806ae767 100644
--- a/gui/packages/desktop/src/main/index.js
+++ b/gui/packages/desktop/src/main/index.js
@@ -158,6 +158,7 @@ const ApplicationMain = {
const windowController = new WindowController(window, tray);
const trayIconController = new TrayIconController(tray, 'unsecured');
+ this._registerWindowListener(windowController);
this._registerIpcListeners();
this._setAppMenu();
this._addContextMenu(window);
@@ -189,6 +190,12 @@ const ApplicationMain = {
window.loadFile(path.resolve(path.join(__dirname, '../renderer/index.html')));
},
+ _registerWindowListener(windowController: WindowController) {
+ const window = windowController.window;
+
+ window.on('show', () => window.webContents.send('window-shown'));
+ },
+
_registerIpcListeners() {
ipcMain.on('show-window', () => {
const windowController = this._windowController;
diff --git a/gui/packages/desktop/src/renderer/app.js b/gui/packages/desktop/src/renderer/app.js
index fe38ab21d6..e973340107 100644
--- a/gui/packages/desktop/src/renderer/app.js
+++ b/gui/packages/desktop/src/renderer/app.js
@@ -118,6 +118,8 @@ export default class AppRenderer {
}
});
+ ipcRenderer.on('window-shown', () => this.updateAccountExpiry());
+
// disable pinch to zoom
webFrame.setVisualZoomLevelLimits(1, 1);
}
@@ -613,6 +615,7 @@ type AccountVerification =
// An account data cache that helps to throttle RPC requests to get_account_data and retain the
// cached value for 1 minute.
class AccountDataCache {
+ _currentAccount: ?AccountToken;
_executingPromise: ?Promise<AccountData>;
_value: ?AccountData;
_expiresAt: ?Date;
@@ -623,6 +626,12 @@ class AccountDataCache {
}
async fetch(accountToken: AccountToken): Promise<AccountData> {
+ // invalidate cache if account token has changed
+ if (accountToken !== this._currentAccount) {
+ this.invalidate();
+ this._currentAccount = accountToken;
+ }
+
// return the same promise if still fetching from remote
const executingPromise = this._executingPromise;
if (executingPromise) {
diff --git a/gui/packages/desktop/src/renderer/components/Account.js b/gui/packages/desktop/src/renderer/components/Account.js
index 4209496317..83ab3721cb 100644
--- a/gui/packages/desktop/src/renderer/components/Account.js
+++ b/gui/packages/desktop/src/renderer/components/Account.js
@@ -9,7 +9,6 @@ import NavigationBar, { BackBarItem } from './NavigationBar';
import SettingsHeader, { HeaderTitle } from './SettingsHeader';
import styles from './AccountStyles';
import Img from './Img';
-import WindowStateObserver from '../lib/window-state-observer';
import type { AccountToken } from '../lib/daemon-rpc';
@@ -17,44 +16,26 @@ type Props = {
accountToken: AccountToken,
accountExpiry: string,
expiryLocale: string,
- updateAccountExpiry: () => Promise<void>,
onLogout: () => void,
onClose: () => void,
onBuyMore: () => void,
};
type State = {
- isRefreshingExpiry: boolean,
showAccountTokenCopiedMessage: boolean,
};
export default class Account extends Component<Props, State> {
state = {
- isRefreshingExpiry: false,
showAccountTokenCopiedMessage: false,
};
- _isMounted = false;
_copyTimer: ?TimeoutID;
- _windowStateObserver = new WindowStateObserver();
-
- componentDidMount() {
- this._isMounted = true;
- this._refreshAccountExpiry();
-
- this._windowStateObserver.onShow = () => {
- this._refreshAccountExpiry();
- };
- }
componentWillUnmount() {
- this._isMounted = false;
-
if (this._copyTimer) {
clearTimeout(this._copyTimer);
}
-
- this._windowStateObserver.dispose();
}
onAccountTokenClick() {
@@ -139,18 +120,4 @@ export default class Account extends Component<Props, State> {
</Layout>
);
}
-
- async _refreshAccountExpiry() {
- this.setState({ isRefreshingExpiry: true });
-
- try {
- await this.props.updateAccountExpiry();
- } catch (e) {
- // TODO: Report the error to user
- }
-
- if (this._isMounted) {
- this.setState({ isRefreshingExpiry: false });
- }
- }
}
diff --git a/gui/packages/desktop/src/renderer/components/Connect.js b/gui/packages/desktop/src/renderer/components/Connect.js
index e24c2aac46..8e29cedfb6 100644
--- a/gui/packages/desktop/src/renderer/components/Connect.js
+++ b/gui/packages/desktop/src/renderer/components/Connect.js
@@ -12,7 +12,6 @@ import Img from './Img';
import Map from './Map';
import styles from './ConnectStyles';
import { NoCreditError, NoInternetError } from '../errors';
-import WindowStateObserver from '../lib/window-state-observer';
import type { BlockReason, TunnelStateTransition } from '../lib/daemon-rpc';
import type { HeaderBarStyle } from './HeaderBar';
@@ -27,7 +26,6 @@ type Props = {
onConnect: () => void,
onDisconnect: () => void,
onExternalLink: (type: string) => void,
- updateAccountExpiry: () => Promise<void>,
};
type State = {
@@ -71,7 +69,6 @@ export default class Connect extends Component<Props, State> {
};
_copyTimer: ?TimeoutID;
- _windowStateObserver = new WindowStateObserver();
constructor(props: Props) {
super();
@@ -83,20 +80,10 @@ export default class Connect extends Component<Props, State> {
};
}
- componentDidMount() {
- this.props.updateAccountExpiry();
-
- this._windowStateObserver.onShow = () => {
- this.props.updateAccountExpiry();
- };
- }
-
componentWillUnmount() {
if (this._copyTimer) {
clearTimeout(this._copyTimer);
}
-
- this._windowStateObserver.dispose();
}
componentDidUpdate(oldProps: Props, _oldState: State) {
diff --git a/gui/packages/desktop/src/renderer/components/Settings.js b/gui/packages/desktop/src/renderer/components/Settings.js
index cb8071a9ce..8a7df34f43 100644
--- a/gui/packages/desktop/src/renderer/components/Settings.js
+++ b/gui/packages/desktop/src/renderer/components/Settings.js
@@ -11,7 +11,6 @@ import NavigationBar, { CloseBarItem } from './NavigationBar';
import SettingsHeader, { HeaderTitle } from './SettingsHeader';
import CustomScrollbars from './CustomScrollbars';
import styles from './SettingsStyles';
-import WindowStateObserver from '../lib/window-state-observer';
import { colors } from '../../config';
import type { LoginState } from '../redux/account/reducers';
@@ -29,24 +28,9 @@ type Props = {
onViewPreferences: () => void,
onViewAdvancedSettings: () => void,
onExternalLink: (type: string) => void,
- updateAccountExpiry: () => Promise<void>,
};
export default class Settings extends Component<Props> {
- _windowStateObserver = new WindowStateObserver();
-
- componentDidMount() {
- this.props.updateAccountExpiry();
-
- this._windowStateObserver.onShow = () => {
- this.props.updateAccountExpiry();
- };
- }
-
- componentWillUnmount() {
- this._windowStateObserver.dispose();
- }
-
render() {
return (
<Layout>
diff --git a/gui/packages/desktop/src/renderer/containers/AccountPage.js b/gui/packages/desktop/src/renderer/containers/AccountPage.js
index 8047764348..fc9d5394be 100644
--- a/gui/packages/desktop/src/renderer/containers/AccountPage.js
+++ b/gui/packages/desktop/src/renderer/containers/AccountPage.js
@@ -18,7 +18,6 @@ const mapStateToProps = (state: ReduxState) => ({
const mapDispatchToProps = (dispatch: ReduxDispatch, props: SharedRouteProps) => {
const history = bindActionCreators({ goBack }, dispatch);
return {
- updateAccountExpiry: () => props.app.updateAccountExpiry(),
onLogout: () => {
props.app.logout();
},
diff --git a/gui/packages/desktop/src/renderer/containers/ConnectPage.js b/gui/packages/desktop/src/renderer/containers/ConnectPage.js
index 5edb4447cc..e98398a32c 100644
--- a/gui/packages/desktop/src/renderer/containers/ConnectPage.js
+++ b/gui/packages/desktop/src/renderer/containers/ConnectPage.js
@@ -88,7 +88,6 @@ const mapDispatchToProps = (dispatch: ReduxDispatch, props: SharedRouteProps) =>
}
},
onExternalLink: (type) => shell.openExternal(links[type]),
- updateAccountExpiry: () => props.app.updateAccountExpiry(),
};
};
diff --git a/gui/packages/desktop/src/renderer/containers/SettingsPage.js b/gui/packages/desktop/src/renderer/containers/SettingsPage.js
index 98b0fcd061..8913e79fcd 100644
--- a/gui/packages/desktop/src/renderer/containers/SettingsPage.js
+++ b/gui/packages/desktop/src/renderer/containers/SettingsPage.js
@@ -17,7 +17,7 @@ const mapStateToProps = (state: ReduxState) => ({
consistentVersion: state.version.consistent,
upToDateVersion: state.version.upToDate,
});
-const mapDispatchToProps = (dispatch: ReduxDispatch, props: SharedRouteProps) => {
+const mapDispatchToProps = (dispatch: ReduxDispatch, _props: SharedRouteProps) => {
const history = bindActionCreators({ push, goBack }, dispatch);
return {
onQuit: () => remote.app.quit(),
@@ -27,7 +27,6 @@ const mapDispatchToProps = (dispatch: ReduxDispatch, props: SharedRouteProps) =>
onViewPreferences: () => history.push('/settings/preferences'),
onViewAdvancedSettings: () => history.push('/settings/advanced'),
onExternalLink: (type) => shell.openExternal(links[type]),
- updateAccountExpiry: () => props.app.updateAccountExpiry(),
};
};
diff --git a/gui/packages/desktop/src/renderer/lib/window-state-observer.js b/gui/packages/desktop/src/renderer/lib/window-state-observer.js
deleted file mode 100644
index 67252d8f6a..0000000000
--- a/gui/packages/desktop/src/renderer/lib/window-state-observer.js
+++ /dev/null
@@ -1,64 +0,0 @@
-// @flow
-
-import { remote } from 'electron';
-
-type EventListener = () => void;
-
-// Tiny helper for detecting the window state.
-export default class WindowStateObserver {
- _onShow: ?EventListener;
- _onHide: ?EventListener;
-
- get onShow() {
- return this._onShow;
- }
-
- set onShow(listener: ?EventListener) {
- const currentWindow = remote.getCurrentWindow();
- const oldListener = this._onShow;
- if (oldListener) {
- currentWindow.removeListener('show', oldListener);
- }
-
- if (listener) {
- currentWindow.addListener('show', listener);
- }
-
- this._onShow = listener;
- }
-
- get onHide() {
- return this._onHide;
- }
-
- set onHide(listener: ?EventListener) {
- const currentWindow = remote.getCurrentWindow();
- const oldListener = this._onHide;
- if (oldListener) {
- currentWindow.removeListener('hide', oldListener);
- }
-
- if (listener) {
- currentWindow.addListener('hide', listener);
- }
-
- this._onHide = listener;
- }
-
- constructor() {
- // Because BrowserWindow persists between page reloads,
- // it's important to release event handlers when that happens.
- window.addEventListener('beforeunload', this._onBeforeUnload);
- }
-
- _onBeforeUnload = () => {
- this.dispose();
- };
-
- dispose() {
- this.onShow = null;
- this.onHide = null;
-
- window.removeEventListener('beforeunload', this._onBeforeUnload);
- }
-}