diff options
author | Whymarrh Whitby <whymarrh.whitby@gmail.com> | 2019-05-14 00:16:09 +0800 |
---|---|---|
committer | Dan J Miller <danjm.com@gmail.com> | 2019-05-14 00:16:09 +0800 |
commit | 28c4001f5269eb170f14bd2829698ee402b2cfbf (patch) | |
tree | a9cb1fbf6fbbb2304c0d3224c1856e70a1fc69e5 /app | |
parent | 08e8fb21dc142ab21184c1125f55b9f3e0ce6412 (diff) | |
download | tangerine-wallet-browser-28c4001f5269eb170f14bd2829698ee402b2cfbf.tar tangerine-wallet-browser-28c4001f5269eb170f14bd2829698ee402b2cfbf.tar.gz tangerine-wallet-browser-28c4001f5269eb170f14bd2829698ee402b2cfbf.tar.bz2 tangerine-wallet-browser-28c4001f5269eb170f14bd2829698ee402b2cfbf.tar.lz tangerine-wallet-browser-28c4001f5269eb170f14bd2829698ee402b2cfbf.tar.xz tangerine-wallet-browser-28c4001f5269eb170f14bd2829698ee402b2cfbf.tar.zst tangerine-wallet-browser-28c4001f5269eb170f14bd2829698ee402b2cfbf.zip |
Update auto-logout to recognize idle time in background (#6593)
* Fix wording of autoLogoutTimeLimitDescription
* AppStateController and update auto-logout functionality
Diffstat (limited to 'app')
-rw-r--r-- | app/_locales/en/messages.json | 2 | ||||
-rw-r--r-- | app/scripts/controllers/app-state.js | 73 | ||||
-rw-r--r-- | app/scripts/metamask-controller.js | 12 |
3 files changed, 86 insertions, 1 deletions
diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index 254bfdfb9..bef278f79 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -161,7 +161,7 @@ "message": "Auto-Logout Timer (minutes)" }, "autoLogoutTimeLimitDescription": { - "message": "Set the number of idle time in minutes before Metamask automatically log out" + "message": "Set the idle time in minutes before MetaMask will automatically log out" }, "available": { "message": "Available" diff --git a/app/scripts/controllers/app-state.js b/app/scripts/controllers/app-state.js new file mode 100644 index 000000000..9533fd458 --- /dev/null +++ b/app/scripts/controllers/app-state.js @@ -0,0 +1,73 @@ +const ObservableStore = require('obs-store') +const extend = require('xtend') + +class AppStateController { + /** + * @constructor + * @param opts + */ + constructor (opts = {}) { + const {initState, onInactiveTimeout, preferencesStore} = opts + const {preferences} = preferencesStore.getState() + + this.onInactiveTimeout = onInactiveTimeout || (() => {}) + this.store = new ObservableStore(extend({ + timeoutMinutes: 0, + }, initState)) + this.timer = null + + preferencesStore.subscribe(state => { + this._setInactiveTimeout(state.preferences.autoLogoutTimeLimit) + }) + + this._setInactiveTimeout(preferences.autoLogoutTimeLimit) + } + + /** + * Sets the last active time to the current time + * @return {void} + */ + setLastActiveTime () { + this._resetTimer() + } + + /** + * Sets the inactive timeout for the app + * @param {number} timeoutMinutes the inactive timeout in minutes + * @return {void} + * @private + */ + _setInactiveTimeout (timeoutMinutes) { + this.store.putState({ + timeoutMinutes, + }) + + this._resetTimer() + } + + /** + * Resets the internal inactive timer + * + * If the {@code timeoutMinutes} state is falsy (i.e., zero) then a new + * timer will not be created. + * + * @return {void} + * @private + */ + _resetTimer () { + const {timeoutMinutes} = this.store.getState() + + if (this.timer) { + clearTimeout(this.timer) + } + + if (!timeoutMinutes) { + return + } + + this.timer = setTimeout(() => this.onInactiveTimeout(), timeoutMinutes * 60 * 1000) + } +} + +module.exports = AppStateController + diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index bdfff9827..07054f84b 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -25,6 +25,7 @@ const {setupMultiplex} = require('./lib/stream-utils.js') const KeyringController = require('eth-keyring-controller') const NetworkController = require('./controllers/network') const PreferencesController = require('./controllers/preferences') +const AppStateController = require('./controllers/app-state') const CurrencyController = require('./controllers/currency') const ShapeShiftController = require('./controllers/shapeshift') const InfuraController = require('./controllers/infura') @@ -101,6 +102,12 @@ module.exports = class MetamaskController extends EventEmitter { network: this.networkController, }) + // app-state controller + this.appStateController = new AppStateController({ + preferencesStore: this.preferencesController.store, + onInactiveTimeout: () => this.setLocked(), + }) + // currency controller this.currencyController = new CurrencyController({ initState: initState.CurrencyController, @@ -252,6 +259,7 @@ module.exports = class MetamaskController extends EventEmitter { }) this.store.updateStructure({ + AppStateController: this.appStateController.store, TransactionController: this.txController.store, KeyringController: this.keyringController.store, PreferencesController: this.preferencesController.store, @@ -264,6 +272,7 @@ module.exports = class MetamaskController extends EventEmitter { }) this.memStore = new ComposableObservableStore(null, { + AppStateController: this.appStateController.store, NetworkController: this.networkController.store, AccountTracker: this.accountTracker.store, TxController: this.txController.memStore, @@ -462,6 +471,9 @@ module.exports = class MetamaskController extends EventEmitter { // AddressController setAddressBook: this.addressBookController.set.bind(this.addressBookController), + // AppStateController + setLastActiveTime: nodeify(this.appStateController.setLastActiveTime, this.appStateController), + // KeyringController setLocked: nodeify(this.setLocked, this), createNewVaultAndKeychain: nodeify(this.createNewVaultAndKeychain, this), |