diff options
author | Chi Kei Chan <chikeichan@gmail.com> | 2017-09-28 13:32:07 +0800 |
---|---|---|
committer | Chi Kei Chan <chikeichan@gmail.com> | 2017-09-28 13:32:07 +0800 |
commit | 5a1d50cd431819874f634679a1ea47fa64f9fbb4 (patch) | |
tree | fe76102102c875ee6eaaee8cb57829899936c519 /app/scripts/controllers/computed-balances.js | |
parent | deee689426f0b6236093128b47be81faf56d6b75 (diff) | |
parent | cdf41c28573822c7c4d50efe7dfa34a062825d7f (diff) | |
download | tangerine-wallet-browser-5a1d50cd431819874f634679a1ea47fa64f9fbb4.tar tangerine-wallet-browser-5a1d50cd431819874f634679a1ea47fa64f9fbb4.tar.gz tangerine-wallet-browser-5a1d50cd431819874f634679a1ea47fa64f9fbb4.tar.bz2 tangerine-wallet-browser-5a1d50cd431819874f634679a1ea47fa64f9fbb4.tar.lz tangerine-wallet-browser-5a1d50cd431819874f634679a1ea47fa64f9fbb4.tar.xz tangerine-wallet-browser-5a1d50cd431819874f634679a1ea47fa64f9fbb4.tar.zst tangerine-wallet-browser-5a1d50cd431819874f634679a1ea47fa64f9fbb4.zip |
Merge branch 'master' into mmn
Diffstat (limited to 'app/scripts/controllers/computed-balances.js')
-rw-r--r-- | app/scripts/controllers/computed-balances.js | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/app/scripts/controllers/computed-balances.js b/app/scripts/controllers/computed-balances.js new file mode 100644 index 000000000..2479e1b3a --- /dev/null +++ b/app/scripts/controllers/computed-balances.js @@ -0,0 +1,66 @@ +const ObservableStore = require('obs-store') +const extend = require('xtend') +const BalanceController = require('./balance') + +class ComputedbalancesController { + + constructor (opts = {}) { + const { accountTracker, txController, blockTracker } = opts + this.accountTracker = accountTracker + this.txController = txController + this.blockTracker = blockTracker + + const initState = extend({ + computedBalances: {}, + }, opts.initState) + this.store = new ObservableStore(initState) + this.balances = {} + + this._initBalanceUpdating() + } + + updateAllBalances () { + for (let address in this.accountTracker.store.getState().accounts) { + this.balances[address].updateBalance() + } + } + + _initBalanceUpdating () { + const store = this.accountTracker.store.getState() + this.addAnyAccountsFromStore(store) + this.accountTracker.store.subscribe(this.addAnyAccountsFromStore.bind(this)) + } + + addAnyAccountsFromStore(store) { + const balances = store.accounts + + for (let address in balances) { + this.trackAddressIfNotAlready(address) + } + } + + trackAddressIfNotAlready (address) { + const state = this.store.getState() + if (!(address in state.computedBalances)) { + this.trackAddress(address) + } + } + + trackAddress (address) { + let updater = new BalanceController({ + address, + accountTracker: this.accountTracker, + txController: this.txController, + blockTracker: this.blockTracker, + }) + updater.store.subscribe((accountBalance) => { + let newState = this.store.getState() + newState.computedBalances[address] = accountBalance + this.store.updateState(newState) + }) + this.balances[address] = updater + updater.updateBalance() + } +} + +module.exports = ComputedbalancesController |