import React, { Component } from 'react' import PropTypes from 'prop-types' import { DEFAULT_ROUTE } from '../../helpers/constants/routes' import Button from '../../components/ui/button' import Identicon from '../../components/ui/identicon' import TokenBalance from '../../components/ui/token-balance' export default class ConfirmAddSuggestedToken extends Component { static contextTypes = { t: PropTypes.func, } static propTypes = { history: PropTypes.object, addToken: PropTypes.func, pendingTokens: PropTypes.object, removeSuggestedTokens: PropTypes.func, tokens: PropTypes.array, } componentDidMount () { const { pendingTokens = {}, history } = this.props if (Object.keys(pendingTokens).length === 0) { history.push(DEFAULT_ROUTE) } } getTokenName (name, symbol) { return typeof name === 'undefined' ? symbol : `${name} (${symbol})` } render () { const { addToken, pendingTokens, tokens, removeSuggestedTokens, history } = this.props const pendingTokenKey = Object.keys(pendingTokens)[0] const pendingToken = pendingTokens[pendingTokenKey] const hasTokenDuplicates = this.checkTokenDuplicates(pendingTokens, tokens) const reusesName = this.checkNameReuse(pendingTokens, tokens) return (
{ this.context.t('addSuggestedTokens') }
{ this.context.t('likeToAddTokens') }
{ hasTokenDuplicates ? (
{ this.context.t('knownTokenWarning') }
) : null } { reusesName ? (
{ this.context.t('reusedTokenNameWarning') }
) : null }
{ this.context.t('token') }
{ this.context.t('balance') }
{ Object.entries(pendingTokens) .map(([ address, token ]) => { const { name, symbol, image } = token return (
{ this.getTokenName(name, symbol) }
) }) }
) } checkTokenDuplicates (pendingTokens, tokens) { const pending = Object.keys(pendingTokens) const existing = tokens.map(token => token.address) const dupes = pending.filter((proposed) => { return existing.includes(proposed) }) return dupes.length > 0 } /** * Returns true if any pendingTokens both: * - Share a symbol with an existing `tokens` member. * - Does not share an address with that same `tokens` member. * This should be flagged as possibly deceptive or confusing. */ checkNameReuse (pendingTokens, tokens) { const duplicates = Object.keys(pendingTokens) .map((addr) => pendingTokens[addr]) .filter((token) => { const dupes = tokens.filter(old => old.symbol === token.symbol) .filter(old => old.address !== token.address) return dupes.length > 0 }) return duplicates.length > 0 } }