import React, { Component } from 'react'; import PropTypes from 'prop-types'; import SendRowWrapper from '../send-row-wrapper'; import Identicon from '../../../../components/ui/identicon/identicon.component'; import TokenBalance from '../../../../components/ui/token-balance'; import UserPreferencedCurrencyDisplay from '../../../../components/app/user-preferenced-currency-display'; import { ERC20, PRIMARY } from '../../../../helpers/constants/common'; import { ASSET_TYPES } from '../../../../ducks/send'; export default class SendAssetRow extends Component { static propTypes = { tokens: PropTypes.arrayOf( PropTypes.shape({ address: PropTypes.string, decimals: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), symbol: PropTypes.string, }), ).isRequired, accounts: PropTypes.object.isRequired, assetImages: PropTypes.object, selectedAddress: PropTypes.string.isRequired, sendAssetAddress: PropTypes.string, updateSendAsset: PropTypes.func.isRequired, nativeCurrency: PropTypes.string, nativeCurrencyImage: PropTypes.string, }; static contextTypes = { t: PropTypes.func, metricsEvent: PropTypes.func, }; state = { isShowingDropdown: false, sendableTokens: [], }; async componentDidMount() { const sendableTokens = this.props.tokens.filter((token) => !token.isERC721); this.setState({ sendableTokens }); } openDropdown = () => this.setState({ isShowingDropdown: true }); closeDropdown = () => this.setState({ isShowingDropdown: false }); selectToken = (type, token) => { this.setState( { isShowingDropdown: false, }, () => { this.context.metricsEvent({ eventOpts: { category: 'Transactions', action: 'Send Screen', name: 'User clicks "Assets" dropdown', }, customVariables: { assetSelected: token ? ERC20 : this.props.nativeCurrency, }, }); this.props.updateSendAsset({ type, details: type === ASSET_TYPES.NATIVE ? null : token, }); }, ); }; render() { const { t } = this.context; return (
{this.renderSendToken()} {this.state.sendableTokens.length > 0 ? this.renderAssetDropdown() : null}
); } renderSendToken() { const { sendAssetAddress } = this.props; const token = this.props.tokens.find( ({ address }) => address === sendAssetAddress, ); return (
{token ? this.renderAsset(token) : this.renderNativeCurrency()}
); } renderAssetDropdown() { return ( this.state.isShowingDropdown && (
{this.renderNativeCurrency(true)} {this.state.sendableTokens.map((token) => this.renderAsset(token, true), )}
) ); } renderNativeCurrency(insideDropdown = false) { const { t } = this.context; const { accounts, selectedAddress, nativeCurrency, nativeCurrencyImage, } = this.props; const balanceValue = accounts[selectedAddress] ? accounts[selectedAddress].balance : ''; return (
0 ? 'send-v2__asset-dropdown__asset' : 'send-v2__asset-dropdown__single-asset' } onClick={() => this.selectToken(ASSET_TYPES.NATIVE)} >
{nativeCurrency}
{`${t('balance')}:`}
{!insideDropdown && this.state.sendableTokens.length > 0 && ( )}
); } renderAsset(token, insideDropdown = false) { const { address, symbol } = token; const { t } = this.context; const { assetImages } = this.props; return (
this.selectToken(ASSET_TYPES.TOKEN, token)} >
{symbol}
{`${t('balance')}:`}
{!insideDropdown && ( )}
); } }