aboutsummaryrefslogtreecommitdiffstats
path: root/app/scripts/controllers/computed-balances.js
blob: 5767461643b0a2e4e71aa6ed3681a439d7dbf313 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
const ObservableStore = require('obs-store')
const extend = require('xtend')
const BalanceController = require('./balance')

class ComputedbalancesController {

  constructor (opts = {}) {
    const { accountTracker, txController } = opts
    this.accountTracker = accountTracker
    this.txController = txController

    const initState = extend({
      computedBalances: {},
    }, opts.initState)
    this.store = new ObservableStore(initState)
    this.balances = {}

    this._initBalanceUpdating()
  }

  updateAllBalances () {
    for (let address in this.balances) {
      this.balances[address].updateBalance()
    }
  }

  _initBalanceUpdating () {
    const store = this.accountTracker.getState()
    this.addAnyAccountsFromStore(store)
    this.accountTracker.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,
    })
    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