2017-01-25 18:51:41 +01:00
|
|
|
// Copyright 2015-2017 Parity Technologies (UK) Ltd.
|
2016-11-18 22:26:52 +01:00
|
|
|
// This file is part of Parity.
|
|
|
|
|
|
|
|
// Parity is free software: you can redistribute it and/or modify
|
|
|
|
// it under the terms of the GNU General Public License as published by
|
|
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
|
|
// (at your option) any later version.
|
|
|
|
|
|
|
|
// Parity is distributed in the hope that it will be useful,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
// GNU General Public License for more details.
|
|
|
|
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
|
|
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
2016-11-29 13:50:09 +01:00
|
|
|
import { isEqual } from 'lodash';
|
2016-11-18 22:26:52 +01:00
|
|
|
import { action, observable } from 'mobx';
|
|
|
|
|
|
|
|
export default class Store {
|
|
|
|
@observable balances = {};
|
2016-11-29 13:50:09 +01:00
|
|
|
@observable localHashes = [];
|
2016-11-18 22:26:52 +01:00
|
|
|
|
2016-11-29 13:50:09 +01:00
|
|
|
constructor (api, withLocalTransactions = false) {
|
2016-11-18 22:26:52 +01:00
|
|
|
this._api = api;
|
2016-11-29 13:50:09 +01:00
|
|
|
this._timeoutId = 0;
|
|
|
|
|
|
|
|
if (withLocalTransactions) {
|
|
|
|
this.fetchLocalTransactions();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-11-18 22:26:52 +01:00
|
|
|
@action setBalance = (address, balance) => {
|
2016-11-23 12:32:50 +01:00
|
|
|
this.setBalances({ [address]: balance });
|
|
|
|
}
|
|
|
|
|
|
|
|
@action setBalances = (balances) => {
|
|
|
|
this.balances = Object.assign({}, this.balances, balances);
|
2016-11-18 22:26:52 +01:00
|
|
|
}
|
|
|
|
|
2016-11-29 13:50:09 +01:00
|
|
|
@action setLocalHashes = (localHashes) => {
|
|
|
|
if (!isEqual(localHashes, this.localHashes)) {
|
|
|
|
this.localHashes = localHashes;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-12-10 22:21:32 +01:00
|
|
|
@action unsubscribe () {
|
|
|
|
if (this._timeoutId) {
|
|
|
|
clearTimeout(this._timeoutId);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-11-18 22:26:52 +01:00
|
|
|
fetchBalance (address) {
|
|
|
|
this._api.eth
|
|
|
|
.getBalance(address)
|
|
|
|
.then((balance) => {
|
|
|
|
this.setBalance(address, balance);
|
|
|
|
})
|
|
|
|
.catch((error) => {
|
|
|
|
console.warn('Store:fetchBalance', error);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2016-11-23 12:32:50 +01:00
|
|
|
fetchBalances (_addresses) {
|
|
|
|
const addresses = _addresses.filter((address) => address) || [];
|
|
|
|
|
|
|
|
if (!addresses.length) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
Promise
|
|
|
|
.all(addresses.map((address) => this._api.eth.getBalance(address)))
|
|
|
|
.then((_balances) => {
|
|
|
|
this.setBalances(
|
|
|
|
addresses.reduce((balances, address, index) => {
|
|
|
|
balances[address] = _balances[index];
|
|
|
|
return balances;
|
|
|
|
}, {})
|
|
|
|
);
|
|
|
|
})
|
|
|
|
.catch((error) => {
|
|
|
|
console.warn('Store:fetchBalances', error);
|
|
|
|
});
|
2016-11-18 22:26:52 +01:00
|
|
|
}
|
2016-11-29 13:50:09 +01:00
|
|
|
|
|
|
|
fetchLocalTransactions = () => {
|
|
|
|
const nextTimeout = () => {
|
|
|
|
this._timeoutId = setTimeout(this.fetchLocalTransactions, 1500);
|
|
|
|
};
|
|
|
|
|
|
|
|
this._api.parity
|
|
|
|
.localTransactions()
|
|
|
|
.then((localTransactions) => {
|
|
|
|
this.setLocalHashes(Object.keys(localTransactions));
|
|
|
|
})
|
|
|
|
.then(nextTimeout)
|
|
|
|
.catch(nextTimeout);
|
|
|
|
}
|
2016-11-18 22:26:52 +01:00
|
|
|
}
|