diff options
| author | Andrej Mihajlov <and@mullvad.net> | 2018-08-07 13:00:02 +0200 |
|---|---|---|
| committer | Andrej Mihajlov <and@mullvad.net> | 2018-08-08 16:25:34 +0200 |
| commit | 3e63b2509962201cd25861dc752b2a404f1b614d (patch) | |
| tree | 0b0e7ca4b54a94a54c9f4750ada7dde95daff064 /app | |
| parent | 3e6a4de0a1682bbe51300f4bee4f84f2679a8c25 (diff) | |
| download | mullvadvpn-3e63b2509962201cd25861dc752b2a404f1b614d.tar.xz mullvadvpn-3e63b2509962201cd25861dc752b2a404f1b614d.zip | |
Add WindowStateObserver
Diffstat (limited to 'app')
| -rw-r--r-- | app/components/Account.js | 9 | ||||
| -rw-r--r-- | app/components/Connect.js | 9 | ||||
| -rw-r--r-- | app/components/Settings.js | 11 | ||||
| -rw-r--r-- | app/lib/window-state-observer.js | 64 |
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); + } +} |
