Merge pull request #666 from 0xProject/bug/website/fix-missing-prices
Move price fetching from wallet into portal
This commit is contained in:
@@ -34,6 +34,7 @@ import { Dispatcher } from 'ts/redux/dispatcher';
|
||||
import {
|
||||
BlockchainErrs,
|
||||
HashData,
|
||||
ItemByAddress,
|
||||
Order,
|
||||
ProviderType,
|
||||
ScreenWidths,
|
||||
@@ -43,6 +44,7 @@ import {
|
||||
TokenVisibility,
|
||||
WebsitePaths,
|
||||
} from 'ts/types';
|
||||
import { backendClient } from 'ts/utils/backend_client';
|
||||
import { configs } from 'ts/utils/configs';
|
||||
import { constants } from 'ts/utils/constants';
|
||||
import { orderParser } from 'ts/utils/order_parser';
|
||||
@@ -587,6 +589,7 @@ export class Portal extends React.Component<PortalProps, PortalState> {
|
||||
return this._blockchain.getTokenBalanceAndAllowanceAsync(userAddressIfExists, tokenAddress);
|
||||
}),
|
||||
);
|
||||
const priceByAddress = await this._getPriceByAddressAsync(tokenAddresses);
|
||||
for (let i = 0; i < tokenAddresses.length; i++) {
|
||||
// Order is preserved in Promise.all
|
||||
const [balance, allowance] = balancesAndAllowances[i];
|
||||
@@ -595,6 +598,7 @@ export class Portal extends React.Component<PortalProps, PortalState> {
|
||||
balance,
|
||||
allowance,
|
||||
isLoaded: true,
|
||||
price: priceByAddress[tokenAddress],
|
||||
};
|
||||
}
|
||||
this.setState({
|
||||
@@ -602,6 +606,34 @@ export class Portal extends React.Component<PortalProps, PortalState> {
|
||||
});
|
||||
}
|
||||
|
||||
private async _getPriceByAddressAsync(tokenAddresses: string[]): Promise<ItemByAddress<BigNumber>> {
|
||||
if (_.isEmpty(tokenAddresses)) {
|
||||
return {};
|
||||
}
|
||||
// for each input token address, search for the corresponding symbol in this.props.tokenByAddress, if it exists
|
||||
// create a mapping from existing symbols -> address
|
||||
const tokenAddressBySymbol: { [symbol: string]: string } = {};
|
||||
_.each(tokenAddresses, address => {
|
||||
const tokenIfExists = _.get(this.props.tokenByAddress, address);
|
||||
if (!_.isUndefined(tokenIfExists)) {
|
||||
const symbol = tokenIfExists.symbol;
|
||||
tokenAddressBySymbol[symbol] = address;
|
||||
}
|
||||
});
|
||||
const tokenSymbols = _.keys(tokenAddressBySymbol);
|
||||
try {
|
||||
const priceBySymbol = await backendClient.getPriceInfoAsync(tokenSymbols);
|
||||
const priceByAddress = _.mapKeys(priceBySymbol, (value, symbol) => _.get(tokenAddressBySymbol, symbol));
|
||||
const result = _.mapValues(priceByAddress, price => {
|
||||
const priceBigNumber = new BigNumber(price);
|
||||
return priceBigNumber;
|
||||
});
|
||||
return result;
|
||||
} catch (err) {
|
||||
return {};
|
||||
}
|
||||
}
|
||||
|
||||
private async _refetchTokenStateAsync(tokenAddress: string): Promise<void> {
|
||||
await this._fetchBalancesAndAllowancesAsync([tokenAddress]);
|
||||
}
|
||||
|
@@ -37,7 +37,6 @@ import { zIndex } from 'ts/style/z_index';
|
||||
import {
|
||||
BalanceErrs,
|
||||
BlockchainErrs,
|
||||
ItemByAddress,
|
||||
ProviderType,
|
||||
ScreenWidths,
|
||||
Side,
|
||||
@@ -47,7 +46,6 @@ import {
|
||||
TokenStateByAddress,
|
||||
WebsitePaths,
|
||||
} from 'ts/types';
|
||||
import { backendClient } from 'ts/utils/backend_client';
|
||||
import { constants } from 'ts/utils/constants';
|
||||
import { utils } from 'ts/utils/utils';
|
||||
import { styles as walletItemStyles } from 'ts/utils/wallet_item_styles';
|
||||
@@ -523,34 +521,6 @@ export class Wallet extends React.Component<WalletProps, WalletState> {
|
||||
});
|
||||
return trackedTokenStateByAddress;
|
||||
}
|
||||
|
||||
private async _getPriceByAddressAsync(tokenAddresses: string[]): Promise<ItemByAddress<BigNumber>> {
|
||||
if (_.isEmpty(tokenAddresses)) {
|
||||
return {};
|
||||
}
|
||||
// for each input token address, search for the corresponding symbol in this.props.tokenByAddress, if it exists
|
||||
// create a mapping from existing symbols -> address
|
||||
const tokenAddressBySymbol: { [symbol: string]: string } = {};
|
||||
_.each(tokenAddresses, address => {
|
||||
const tokenIfExists = _.get(this.props.tokenByAddress, address);
|
||||
if (!_.isUndefined(tokenIfExists)) {
|
||||
const symbol = tokenIfExists.symbol;
|
||||
tokenAddressBySymbol[symbol] = address;
|
||||
}
|
||||
});
|
||||
const tokenSymbols = _.keys(tokenAddressBySymbol);
|
||||
try {
|
||||
const priceBySymbol = await backendClient.getPriceInfoAsync(tokenSymbols);
|
||||
const priceByAddress = _.mapKeys(priceBySymbol, (value, symbol) => _.get(tokenAddressBySymbol, symbol));
|
||||
const result = _.mapValues(priceByAddress, price => {
|
||||
const priceBigNumber = new BigNumber(price);
|
||||
return priceBigNumber;
|
||||
});
|
||||
return result;
|
||||
} catch (err) {
|
||||
return {};
|
||||
}
|
||||
}
|
||||
private _openWrappedEtherActionRow(wrappedEtherDirection: Side): void {
|
||||
this.setState({
|
||||
wrappedEtherDirection,
|
||||
|
Reference in New Issue
Block a user