import React, { PureComponent } from 'react' import PropTypes from 'prop-types' import classnames from 'classnames' import Identicon from '../identicon' import TransactionStatus from '../transaction-status' import TransactionAction from '../transaction-action' import UserPreferencedCurrencyDisplay from '../user-preferenced-currency-display' import TokenCurrencyDisplay from '../token-currency-display' import TransactionListItemDetails from '../transaction-list-item-details' import { CONFIRM_TRANSACTION_ROUTE } from '../../routes' import { UNAPPROVED_STATUS, TOKEN_METHOD_TRANSFER } from '../../constants/transactions' import { PRIMARY, SECONDARY } from '../../constants/common' import { getStatusKey } from '../../helpers/transactions.util' export default class TransactionListItem extends PureComponent { static propTypes = { assetImages: PropTypes.object, history: PropTypes.object, methodData: PropTypes.object, nonceAndDate: PropTypes.string, primaryTransaction: PropTypes.object, retryTransaction: PropTypes.func, setSelectedToken: PropTypes.func, showCancelModal: PropTypes.func, showCancel: PropTypes.bool, showRetry: PropTypes.bool, token: PropTypes.object, tokenData: PropTypes.object, transaction: PropTypes.object, transactionGroup: PropTypes.object, value: PropTypes.string, fetchBasicGasAndTimeEstimates: PropTypes.func, fetchGasEstimates: PropTypes.func, } state = { showTransactionDetails: false, } handleClick = () => { const { transaction, history, } = this.props const { id, status } = transaction const { showTransactionDetails } = this.state if (status === UNAPPROVED_STATUS) { history.push(`${CONFIRM_TRANSACTION_ROUTE}/${id}`) return } this.setState({ showTransactionDetails: !showTransactionDetails }) } handleCancel = id => { const { primaryTransaction: { txParams: { gasPrice } } = {}, transaction: { id: initialTransactionId }, showCancelModal, } = this.props const cancelId = id || initialTransactionId showCancelModal(cancelId, gasPrice) } /** * @name handleRetry * @description Resubmits a transaction. Retrying a transaction within a list of transactions with * the same nonce requires keeping the original value while increasing the gas price of the latest * transaction. * @param {number} id - Transaction id */ handleRetry = id => { const { primaryTransaction: { txParams: { gasPrice } } = {}, transaction: { txParams: { to } = {}, id: initialTransactionId }, methodData: { name } = {}, setSelectedToken, retryTransaction, fetchBasicGasAndTimeEstimates, fetchGasEstimates, } = this.props if (name === TOKEN_METHOD_TRANSFER) { setSelectedToken(to) } const retryId = id || initialTransactionId return fetchBasicGasAndTimeEstimates() .then(basicEstimates => fetchGasEstimates(basicEstimates.blockTime)) .then(retryTransaction(retryId, gasPrice)) } renderPrimaryCurrency () { const { token, primaryTransaction: { txParams: { data } = {} } = {}, value } = this.props return token ? ( ) : ( ) } renderSecondaryCurrency () { const { token, value } = this.props return token ? null : ( ) } render () { const { assetImages, transaction, methodData, nonceAndDate, primaryTransaction, showCancel, showRetry, tokenData, transactionGroup, } = this.props const { txParams = {} } = transaction const { showTransactionDetails } = this.state const toAddress = tokenData ? tokenData.params && tokenData.params[0] && tokenData.params[0].value || txParams.to : txParams.to return (
{ nonceAndDate }
{ this.renderPrimaryCurrency() } { this.renderSecondaryCurrency() }
{ showTransactionDetails && (
) }
) } }