import React, { PureComponent } from 'react'; import PropTypes from 'prop-types'; import copyToClipboard from 'copy-to-clipboard'; import { getBlockExplorerLink } from '@metamask/etherscan-link'; import SenderToRecipient from '../../ui/sender-to-recipient'; import { DEFAULT_VARIANT } from '../../ui/sender-to-recipient/sender-to-recipient.constants'; import Disclosure from '../../ui/disclosure'; import TransactionActivityLog from '../transaction-activity-log'; import TransactionBreakdown from '../transaction-breakdown'; import Button from '../../ui/button'; import Tooltip from '../../ui/tooltip'; import CancelButton from '../cancel-button'; import Popover from '../../ui/popover'; import { SECOND } from '../../../../shared/constants/time'; import { MetaMetricsEventCategory } from '../../../../shared/constants/metametrics'; import { TransactionType } from '../../../../shared/constants/transaction'; import { getURLHostName } from '../../../helpers/utils/util'; import TransactionDecoding from '../transaction-decoding'; import { NETWORKS_ROUTE } from '../../../helpers/constants/routes'; export default class TransactionListItemDetails extends PureComponent { static contextTypes = { t: PropTypes.func, trackEvent: PropTypes.func, }; static defaultProps = { recipientEns: null, }; static propTypes = { onCancel: PropTypes.func, onRetry: PropTypes.func, showCancel: PropTypes.bool, showSpeedUp: PropTypes.bool, showRetry: PropTypes.bool, isEarliestNonce: PropTypes.bool, primaryCurrency: PropTypes.string, transactionGroup: PropTypes.object, title: PropTypes.string.isRequired, onClose: PropTypes.func.isRequired, recipientEns: PropTypes.string, recipientAddress: PropTypes.string, recipientName: PropTypes.string, recipientMetadataName: PropTypes.string, rpcPrefs: PropTypes.object, senderAddress: PropTypes.string.isRequired, tryReverseResolveAddress: PropTypes.func.isRequired, senderNickname: PropTypes.string.isRequired, recipientNickname: PropTypes.string, transactionStatus: PropTypes.func, isCustomNetwork: PropTypes.bool, history: PropTypes.object, blockExplorerLinkText: PropTypes.object, }; state = { justCopied: false, }; handleBlockExplorerClick = () => { const { transactionGroup: { primaryTransaction }, rpcPrefs, isCustomNetwork, history, onClose, } = this.props; const blockExplorerLink = getBlockExplorerLink( primaryTransaction, rpcPrefs, ); if (!rpcPrefs.blockExplorerUrl && isCustomNetwork) { onClose(); history.push(`${NETWORKS_ROUTE}#blockExplorerUrl`); } else { this.context.trackEvent({ category: MetaMetricsEventCategory.Transactions, event: 'Clicked Block Explorer Link', properties: { link_type: 'Transaction Block Explorer', action: 'Transaction Details', block_explorer_domain: getURLHostName(blockExplorerLink), }, }); global.platform.openTab({ url: blockExplorerLink, }); } }; handleCancel = (event) => { const { onCancel, onClose } = this.props; onCancel(event); onClose(); }; handleRetry = (event) => { const { onClose, onRetry } = this.props; onRetry(event); onClose(); }; handleCopyTxId = () => { const { transactionGroup } = this.props; const { primaryTransaction: transaction } = transactionGroup; const { hash } = transaction; this.context.trackEvent({ category: MetaMetricsEventCategory.Navigation, event: 'Copied Transaction ID', properties: { action: 'Activity Log', legacy_event: true, }, }); this.setState({ justCopied: true }, () => { copyToClipboard(hash); setTimeout(() => this.setState({ justCopied: false }), SECOND); }); }; componentDidMount() { const { recipientAddress, tryReverseResolveAddress } = this.props; if (recipientAddress) { tryReverseResolveAddress(recipientAddress); } } render() { const { t } = this.context; const { justCopied } = this.state; const { transactionGroup, primaryCurrency, showSpeedUp, showRetry, recipientEns, recipientAddress, recipientName, recipientMetadataName, senderAddress, isEarliestNonce, senderNickname, title, onClose, recipientNickname, showCancel, transactionStatus: TransactionStatus, blockExplorerLinkText, } = this.props; const { primaryTransaction: transaction, initialTransaction: { type }, } = transactionGroup; const { hash } = transaction; return (
{showSpeedUp && ( )} {showCancel && ( )} {showRetry && ( )}
{t('status')}
{t('from')}
{t('to')}
{ this.context.trackEvent({ category: MetaMetricsEventCategory.Navigation, event: 'Copied "To" Address', properties: { action: 'Activity Log', legacy_event: true, }, }); }} onSenderClick={() => { this.context.trackEvent({ category: MetaMetricsEventCategory.Navigation, event: 'Copied "From" Address', properties: { action: 'Activity Log', legacy_event: true, }, }); }} />
{transactionGroup.initialTransaction.type !== TransactionType.incoming && ( )} {transactionGroup.initialTransaction?.txParams?.data ? ( ) : null}
); } }