summaryrefslogtreecommitdiffhomepage
path: root/app
diff options
context:
space:
mode:
authorAndrej Mihajlov <and@mullvad.net>2018-08-07 13:00:02 +0200
committerAndrej Mihajlov <and@mullvad.net>2018-08-08 16:25:34 +0200
commit3e63b2509962201cd25861dc752b2a404f1b614d (patch)
tree0b0e7ca4b54a94a54c9f4750ada7dde95daff064 /app
parent3e6a4de0a1682bbe51300f4bee4f84f2679a8c25 (diff)
downloadmullvadvpn-3e63b2509962201cd25861dc752b2a404f1b614d.tar.xz
mullvadvpn-3e63b2509962201cd25861dc752b2a404f1b614d.zip
Add WindowStateObserver
Diffstat (limited to 'app')
-rw-r--r--app/components/Account.js9
-rw-r--r--app/components/Connect.js9
-rw-r--r--app/components/Settings.js11
-rw-r--r--app/lib/window-state-observer.js64
4 files changed, 91 insertions, 2 deletions
diff --git a/app/components/Account.js b/app/components/Account.js
index e7a39b68ed..700f33af2b 100644
--- a/app/components/Account.js
+++ b/app/components/Account.js
@@ -9,6 +9,7 @@ import SettingsHeader, { HeaderTitle } from './SettingsHeader';
import styles from './AccountStyles';
import Img from './Img';
import { formatAccount } from '../lib/formatters';
+import WindowStateObserver from '../lib/window-state-observer';
import type { AccountToken } from '../lib/daemon-rpc';
@@ -35,12 +36,16 @@ export default class Account extends Component<Props, State> {
};
_isMounted = false;
-
_copyTimer: ?TimeoutID;
+ _windowStateObserver = new WindowStateObserver();
componentDidMount() {
this._isMounted = true;
this._refreshAccountExpiry();
+
+ this._windowStateObserver.onShow = () => {
+ this._refreshAccountExpiry();
+ };
}
componentWillUnmount() {
@@ -49,6 +54,8 @@ export default class Account extends Component<Props, State> {
if (this._copyTimer) {
clearTimeout(this._copyTimer);
}
+
+ this._windowStateObserver.dispose();
}
onAccountTokenClick() {
diff --git a/app/components/Connect.js b/app/components/Connect.js
index 1a6e21599a..71ddb365f4 100644
--- a/app/components/Connect.js
+++ b/app/components/Connect.js
@@ -9,9 +9,9 @@ import * as AppButton from './AppButton';
import Img from './Img';
import Accordion from './Accordion';
import styles from './ConnectStyles';
-
import { NoCreditError, NoInternetError } from '../errors';
import Map from './Map';
+import WindowStateObserver from '../lib/window-state-observer';
import type { HeaderBarStyle } from './HeaderBar';
import type { ConnectionReduxState } from '../redux/connection/reducers';
@@ -41,6 +41,7 @@ export default class Connect extends Component<Props, State> {
};
_copyTimer: ?TimeoutID;
+ _windowStateObserver = new WindowStateObserver();
shouldComponentUpdate(nextProps: Props, nextState: State) {
const { connection: prevConnection, ...otherPrevProps } = this.props;
@@ -60,12 +61,18 @@ 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();
}
render() {
diff --git a/app/components/Settings.js b/app/components/Settings.js
index c447940338..0ed45c7685 100644
--- a/app/components/Settings.js
+++ b/app/components/Settings.js
@@ -10,6 +10,7 @@ import SettingsHeader, { HeaderTitle } from './SettingsHeader';
import CustomScrollbars from './CustomScrollbars';
import styles from './SettingsStyles';
import Img from './Img';
+import WindowStateObserver from '../lib/window-state-observer';
import type { LoginState } from '../redux/account/reducers';
@@ -28,8 +29,18 @@ type Props = {
};
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() {
diff --git a/app/lib/window-state-observer.js b/app/lib/window-state-observer.js
new file mode 100644
index 0000000000..67252d8f6a
--- /dev/null
+++ b/app/lib/window-state-observer.js
@@ -0,0 +1,64 @@
+// @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);
+ }
+}