From d32e3355895b83c2a6abe655d10ecd011a7aa2c7 Mon Sep 17 00:00:00 2001 From: Guillaume Marquilly Date: Tue, 19 Jun 2018 16:20:53 +0100 Subject: [PATCH] fix - balances were computing too often --- .../src/data/components/priceTicker/sagas.js | 22 ++++-- .../MenuTop/Balance/BchBalance/selectors.js | 16 +--- .../Balance/BchWatchOnlyBalance/selectors.js | 21 ++--- .../BchWatchOnlyBalance/template.success.js | 6 +- .../MenuTop/Balance/BtcBalance/selectors.js | 16 +--- .../Balance/BtcWatchOnlyBalance/selectors.js | 21 ++--- .../BtcWatchOnlyBalance/template.success.js | 6 +- .../MenuTop/Balance/EthBalance/selectors.js | 4 +- .../MenuTop/Balance/TotalBalance/selectors.js | 29 +------ .../layouts/Wallet/MenuTop/Balance/index.js | 16 ++-- .../Wallet/MenuTop/Balance/selectors.js | 36 ++++++--- .../Wallet/MenuTop/Balance/template.js | 78 +++++++++---------- .../Home/ActivityList/ListItem/index.js | 58 +++++++------- .../src/scenes/Home/ActivityList/selectors.js | 2 + .../Home/ActivityList/template.success.js | 2 +- .../src/redux/data/bch/sagaRegister.js | 1 + .../src/redux/data/bitcoin/sagas.js | 2 +- .../src/redux/data/ethereum/sagas.js | 2 +- 18 files changed, 157 insertions(+), 181 deletions(-) diff --git a/packages/blockchain-wallet-v4-frontend/src/data/components/priceTicker/sagas.js b/packages/blockchain-wallet-v4-frontend/src/data/components/priceTicker/sagas.js index ccb45e859f3..20afacdc022 100644 --- a/packages/blockchain-wallet-v4-frontend/src/data/components/priceTicker/sagas.js +++ b/packages/blockchain-wallet-v4-frontend/src/data/components/priceTicker/sagas.js @@ -1,15 +1,21 @@ -import { put } from 'redux-saga/effects' +import { put, select } from 'redux-saga/effects' import * as actions from '../../actions' +import * as selectors from '../../selectors' +import { Remote } from 'blockchain-wallet-v4/src' +import { equals } from 'ramda' export default ({ coreSagas }) => { const initialized = function * (action) { - const { coin } = action.payload - - switch (coin) { - case 'BCH': return yield put(actions.core.data.bch.fetchRates()) - case 'BTC': return yield put(actions.core.data.bitcoin.fetchRates()) - case 'ETH': return yield put(actions.core.data.ethereum.fetchRates()) - default: yield put(actions.logs.logErrorMessage('components/priceTicker/sagas', 'coinClicked', 'Price index series chart could not be initialized.')) + try { + const { coin } = action.payload + const bchRates = yield select(selectors.core.data.bitcoin.getRates) + const btcRates = yield select(selectors.core.data.bch.getRates) + const ethRates = yield select(selectors.core.data.ethereum.getRates) + if (equals(coin, 'BCH') && Remote.NotAsked.is(bchRates)) { return yield put(actions.core.data.bch.fetchRates()) } + if (equals(coin, 'BTC') && Remote.NotAsked.is(btcRates)) { return yield put(actions.core.data.bitcoin.fetchRates()) } + if (equals(coin, 'ETH') && Remote.NotAsked.is(ethRates)) { return yield put(actions.core.data.ethereum.fetchRates()) } + } catch (e) { + yield put(actions.logs.logErrorMessage('components/priceTicker/sagas', 'coinClicked', 'Price index series chart could not be initialized.')) } } diff --git a/packages/blockchain-wallet-v4-frontend/src/layouts/Wallet/MenuTop/Balance/BchBalance/selectors.js b/packages/blockchain-wallet-v4-frontend/src/layouts/Wallet/MenuTop/Balance/BchBalance/selectors.js index 12dc8a0e2da..c8ef5d32461 100644 --- a/packages/blockchain-wallet-v4-frontend/src/layouts/Wallet/MenuTop/Balance/BchBalance/selectors.js +++ b/packages/blockchain-wallet-v4-frontend/src/layouts/Wallet/MenuTop/Balance/BchBalance/selectors.js @@ -1,15 +1,3 @@ -import { selectors } from 'data' -import { createDeepEqualSelector } from 'services/ReselectHelper' -import { add, traverse, reduce } from 'ramda' -import { Remote } from 'blockchain-wallet-v4/src' +import { getBchBalance } from '../selectors' -export const getData = state => createDeepEqualSelector( - [ - selectors.core.kvStore.bch.getSpendableContext - ], - (context) => { - const getBalance = address => selectors.core.data.bch.getFinalBalance(address, state) - const balancesR = traverse(Remote.of, getBalance, context) - return balancesR.map(xs => reduce(add, 0, xs)) - } -)(state) +export const getData = getBchBalance diff --git a/packages/blockchain-wallet-v4-frontend/src/layouts/Wallet/MenuTop/Balance/BchWatchOnlyBalance/selectors.js b/packages/blockchain-wallet-v4-frontend/src/layouts/Wallet/MenuTop/Balance/BchWatchOnlyBalance/selectors.js index 62d84b8019a..3da7f4b354c 100644 --- a/packages/blockchain-wallet-v4-frontend/src/layouts/Wallet/MenuTop/Balance/BchWatchOnlyBalance/selectors.js +++ b/packages/blockchain-wallet-v4-frontend/src/layouts/Wallet/MenuTop/Balance/BchWatchOnlyBalance/selectors.js @@ -1,15 +1,18 @@ import { selectors } from 'data' import { createDeepEqualSelector } from 'services/ReselectHelper' -import { add, traverse, reduce } from 'ramda' -import { Remote } from 'blockchain-wallet-v4/src' +import { add, contains, filter, reduce, prop, values } from 'ramda' -export const getData = state => createDeepEqualSelector( +export const getData = createDeepEqualSelector( [ - selectors.core.kvStore.bch.getUnspendableContext + selectors.core.kvStore.bch.getUnspendableContext, + selectors.core.data.bch.getAddresses ], - (context) => { - const getBalance = address => selectors.core.data.bch.getFinalBalance(address, state) - const balancesR = traverse(Remote.of, getBalance, context) - return balancesR.map(xs => reduce(add, 0, xs)) + (context, addressesR) => { + const transform = addresses => { + const filteredAddresses = filter(x => contains(prop('address', x), context), values(addresses)) + const filteredBalances = filteredAddresses.map(prop('final_balance')) + return reduce(add, 0, filteredBalances) + } + return addressesR.map(transform) } -)(state) +) diff --git a/packages/blockchain-wallet-v4-frontend/src/layouts/Wallet/MenuTop/Balance/BchWatchOnlyBalance/template.success.js b/packages/blockchain-wallet-v4-frontend/src/layouts/Wallet/MenuTop/Balance/BchWatchOnlyBalance/template.success.js index e1e42299a0e..5a09b6a5e17 100644 --- a/packages/blockchain-wallet-v4-frontend/src/layouts/Wallet/MenuTop/Balance/BchWatchOnlyBalance/template.success.js +++ b/packages/blockchain-wallet-v4-frontend/src/layouts/Wallet/MenuTop/Balance/BchWatchOnlyBalance/template.success.js @@ -22,14 +22,12 @@ const Wrapper = styled.div` ` const Success = props => { - const { balance } = props - - return ( + return props.balance === 0 ? < div /> : ( BCH - {balance} + {props.balance}   diff --git a/packages/blockchain-wallet-v4-frontend/src/layouts/Wallet/MenuTop/Balance/BtcBalance/selectors.js b/packages/blockchain-wallet-v4-frontend/src/layouts/Wallet/MenuTop/Balance/BtcBalance/selectors.js index b2b5aa83489..d05205fe37a 100644 --- a/packages/blockchain-wallet-v4-frontend/src/layouts/Wallet/MenuTop/Balance/BtcBalance/selectors.js +++ b/packages/blockchain-wallet-v4-frontend/src/layouts/Wallet/MenuTop/Balance/BtcBalance/selectors.js @@ -1,15 +1,3 @@ -import { selectors } from 'data' -import { createDeepEqualSelector } from 'services/ReselectHelper' -import { add, traverse, reduce } from 'ramda' -import { Remote } from 'blockchain-wallet-v4/src' +import { getBtcBalance } from '../selectors' -export const getData = state => createDeepEqualSelector( - [ - selectors.core.wallet.getSpendableContext - ], - (context) => { - const getBalance = address => selectors.core.data.bitcoin.getFinalBalance(address, state) - const balancesR = traverse(Remote.of, getBalance, context) - return balancesR.map(xs => reduce(add, 0, xs)) - } -)(state) +export const getData = getBtcBalance diff --git a/packages/blockchain-wallet-v4-frontend/src/layouts/Wallet/MenuTop/Balance/BtcWatchOnlyBalance/selectors.js b/packages/blockchain-wallet-v4-frontend/src/layouts/Wallet/MenuTop/Balance/BtcWatchOnlyBalance/selectors.js index 293d7f0c68a..193987a2fcb 100644 --- a/packages/blockchain-wallet-v4-frontend/src/layouts/Wallet/MenuTop/Balance/BtcWatchOnlyBalance/selectors.js +++ b/packages/blockchain-wallet-v4-frontend/src/layouts/Wallet/MenuTop/Balance/BtcWatchOnlyBalance/selectors.js @@ -1,15 +1,18 @@ import { selectors } from 'data' import { createDeepEqualSelector } from 'services/ReselectHelper' -import { add, traverse, reduce } from 'ramda' -import { Remote } from 'blockchain-wallet-v4/src' +import { add, contains, filter, reduce, prop, values } from 'ramda' -export const getData = state => createDeepEqualSelector( +export const getData = createDeepEqualSelector( [ - selectors.core.wallet.getUnspendableContext + selectors.core.wallet.getUnspendableContext, + selectors.core.data.bitcoin.getAddresses ], - (context) => { - const getBalance = address => selectors.core.data.bitcoin.getFinalBalance(address, state) - const balancesR = traverse(Remote.of, getBalance, context) - return balancesR.map(xs => reduce(add, 0, xs)) + (context, addressesR) => { + const transform = addresses => { + const filteredAddresses = filter(x => contains(prop('address', x), context), values(addresses)) + const filteredBalances = filteredAddresses.map(prop('final_balance')) + return reduce(add, 0, filteredBalances) + } + return addressesR.map(transform) } -)(state) +) diff --git a/packages/blockchain-wallet-v4-frontend/src/layouts/Wallet/MenuTop/Balance/BtcWatchOnlyBalance/template.success.js b/packages/blockchain-wallet-v4-frontend/src/layouts/Wallet/MenuTop/Balance/BtcWatchOnlyBalance/template.success.js index d90f3f863b4..dc225280a5a 100644 --- a/packages/blockchain-wallet-v4-frontend/src/layouts/Wallet/MenuTop/Balance/BtcWatchOnlyBalance/template.success.js +++ b/packages/blockchain-wallet-v4-frontend/src/layouts/Wallet/MenuTop/Balance/BtcWatchOnlyBalance/template.success.js @@ -22,14 +22,12 @@ const Wrapper = styled.div` ` const Success = props => { - const { balance } = props - - return ( + return props.balance === 0 ? < div /> : ( BTC - {balance} + {props.balance}   diff --git a/packages/blockchain-wallet-v4-frontend/src/layouts/Wallet/MenuTop/Balance/EthBalance/selectors.js b/packages/blockchain-wallet-v4-frontend/src/layouts/Wallet/MenuTop/Balance/EthBalance/selectors.js index 28aa2105dc1..0204f2048d4 100644 --- a/packages/blockchain-wallet-v4-frontend/src/layouts/Wallet/MenuTop/Balance/EthBalance/selectors.js +++ b/packages/blockchain-wallet-v4-frontend/src/layouts/Wallet/MenuTop/Balance/EthBalance/selectors.js @@ -1,3 +1,3 @@ -import { selectors } from 'data' +import { getEthBalance } from '../selectors' -export const getData = selectors.core.data.ethereum.getBalance +export const getData = getEthBalance diff --git a/packages/blockchain-wallet-v4-frontend/src/layouts/Wallet/MenuTop/Balance/TotalBalance/selectors.js b/packages/blockchain-wallet-v4-frontend/src/layouts/Wallet/MenuTop/Balance/TotalBalance/selectors.js index cd6a65ab92d..78c71786b8e 100644 --- a/packages/blockchain-wallet-v4-frontend/src/layouts/Wallet/MenuTop/Balance/TotalBalance/selectors.js +++ b/packages/blockchain-wallet-v4-frontend/src/layouts/Wallet/MenuTop/Balance/TotalBalance/selectors.js @@ -1,32 +1,9 @@ -import { add, lift, reduce, traverse } from 'ramda' +import { lift } from 'ramda' import { selectors } from 'data' -import { Exchange, Remote } from 'blockchain-wallet-v4/src' +import { Exchange } from 'blockchain-wallet-v4/src' import * as Currency from 'blockchain-wallet-v4/src/exchange/currency' import { createDeepEqualSelector } from 'services/ReselectHelper' - -export const getBtcBalance = state => createDeepEqualSelector( - [ - selectors.core.wallet.getSpendableContext - ], - (context) => { - const getBalance = address => selectors.core.data.bitcoin.getFinalBalance(address, state) - const balancesR = traverse(Remote.of, getBalance, context) - return balancesR.map(xs => reduce(add, 0, xs)) - } -)(state) - -export const getBchBalance = state => createDeepEqualSelector( - [ - selectors.core.kvStore.bch.getSpendableContext - ], - (context) => { - const getBalance = address => selectors.core.data.bch.getFinalBalance(address, state) - const balancesR = traverse(Remote.of, getBalance, context) - return balancesR.map(xs => reduce(add, 0, xs)) - } -)(state) - -export const getEthBalance = selectors.core.data.ethereum.getBalance +import { getBchBalance, getBtcBalance, getEthBalance } from '../selectors' export const getBtcBalanceInfo = createDeepEqualSelector( [ diff --git a/packages/blockchain-wallet-v4-frontend/src/layouts/Wallet/MenuTop/Balance/index.js b/packages/blockchain-wallet-v4-frontend/src/layouts/Wallet/MenuTop/Balance/index.js index 03b7d4ca474..99efd41fc6b 100644 --- a/packages/blockchain-wallet-v4-frontend/src/layouts/Wallet/MenuTop/Balance/index.js +++ b/packages/blockchain-wallet-v4-frontend/src/layouts/Wallet/MenuTop/Balance/index.js @@ -2,24 +2,24 @@ import React from 'react' import { connect } from 'react-redux' import { bindActionCreators } from 'redux' -import { actions } from 'data' -import { getData } from './selectors' +import { actions, selectors } from 'data' import Template from './template' class Balance extends React.PureComponent { + componentDidMount () { + this.props.actions.initialized() + } render () { - const { data } = this.props - return