import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { EDIT_GAS_MODES } from '../../../../shared/constants/gas'; import { GasFeeContextProvider } from '../../../contexts/gasFee'; import { TRANSACTION_TYPES } from '../../../../shared/constants/transaction'; import { NETWORK_TO_NAME_MAP, MAINNET_CHAIN_ID, } from '../../../../shared/constants/network'; import { PageContainerFooter } from '../../ui/page-container'; import Dialog from '../../ui/dialog'; import Button from '../../ui/button'; import ActionableMessage from '../../ui/actionable-message/actionable-message'; import SenderToRecipient from '../../ui/sender-to-recipient'; import NicknamePopovers from '../modals/nickname-popovers'; import AdvancedGasFeePopover from '../advanced-gas-fee-popover'; import EditGasFeePopover from '../edit-gas-fee-popover/edit-gas-fee-popover'; import EditGasPopover from '../edit-gas-popover'; import ErrorMessage from '../../ui/error-message'; import { INSUFFICIENT_FUNDS_ERROR_KEY } from '../../../helpers/constants/error-keys'; import Typography from '../../ui/typography'; import { TYPOGRAPHY } from '../../../helpers/constants/design-system'; import EnableEIP1559V2Notice from './enableEIP1559V2-notice'; import { ConfirmPageContainerHeader, ConfirmPageContainerContent, ConfirmPageContainerNavigation, } from '.'; export default class ConfirmPageContainer extends Component { state = { showNicknamePopovers: false, }; static contextTypes = { t: PropTypes.func, }; static propTypes = { // Header action: PropTypes.string, hideSubtitle: PropTypes.bool, onEdit: PropTypes.func, showEdit: PropTypes.bool, subtitleComponent: PropTypes.node, title: PropTypes.string, image: PropTypes.string, titleComponent: PropTypes.node, hideSenderToRecipient: PropTypes.bool, showAccountInHeader: PropTypes.bool, // Sender to Recipient fromAddress: PropTypes.string, fromName: PropTypes.string, toAddress: PropTypes.string, toName: PropTypes.string, toEns: PropTypes.string, toNickname: PropTypes.string, // Content contentComponent: PropTypes.node, errorKey: PropTypes.string, errorMessage: PropTypes.string, dataComponent: PropTypes.node, dataHexComponent: PropTypes.node, detailsComponent: PropTypes.node, identiconAddress: PropTypes.string, nonce: PropTypes.string, warning: PropTypes.string, unapprovedTxCount: PropTypes.number, origin: PropTypes.string.isRequired, ethGasPriceWarning: PropTypes.string, // Navigation totalTx: PropTypes.number, positionOfCurrentTx: PropTypes.number, nextTxId: PropTypes.string, prevTxId: PropTypes.string, showNavigation: PropTypes.bool, onNextTx: PropTypes.func, firstTx: PropTypes.string, lastTx: PropTypes.string, ofText: PropTypes.string, requestsWaitingText: PropTypes.string, // Footer onCancelAll: PropTypes.func, onCancel: PropTypes.func, onSubmit: PropTypes.func, disabled: PropTypes.bool, editingGas: PropTypes.bool, handleCloseEditGas: PropTypes.func, // Gas Popover currentTransaction: PropTypes.object.isRequired, contact: PropTypes.object, isOwnedAccount: PropTypes.bool, supportsEIP1559V2: PropTypes.bool, nativeCurrency: PropTypes.string, showBuyModal: PropTypes.func, }; render() { const { showEdit, onEdit, fromName, fromAddress, toName, toEns, toNickname, toAddress, disabled, errorKey, errorMessage, contentComponent, action, title, image, titleComponent, subtitleComponent, hideSubtitle, detailsComponent, dataComponent, dataHexComponent, onCancelAll, onCancel, onSubmit, identiconAddress, nonce, unapprovedTxCount, warning, totalTx, positionOfCurrentTx, nextTxId, prevTxId, showNavigation, onNextTx, firstTx, lastTx, ofText, requestsWaitingText, hideSenderToRecipient, showAccountInHeader, origin, ethGasPriceWarning, editingGas, handleCloseEditGas, currentTransaction, contact = {}, isOwnedAccount, supportsEIP1559V2, nativeCurrency, showBuyModal, } = this.props; const showAddToAddressDialog = !contact.name && toAddress && !isOwnedAccount && !hideSenderToRecipient; const shouldDisplayWarning = contentComponent && disabled && (errorKey || errorMessage); const hideTitle = (currentTransaction.type === TRANSACTION_TYPES.CONTRACT_INTERACTION || currentTransaction.type === TRANSACTION_TYPES.DEPLOY_CONTRACT) && currentTransaction.txParams?.value === '0x0'; const networkName = NETWORK_TO_NAME_MAP[currentTransaction.chainId]; const { t } = this.context; return (
onNextTx(txId)} firstTx={firstTx} lastTx={lastTx} ofText={ofText} requestsWaitingText={requestsWaitingText} /> onEdit()} showAccountInHeader={showAccountInHeader} accountAddress={fromAddress} > {hideSenderToRecipient ? null : ( )}
{showAddToAddressDialog && ( <> this.setState({ showNicknamePopovers: true })} > {t('newAccountDetectedDialogMessage')} {this.state.showNicknamePopovers ? ( this.setState({ showNicknamePopovers: false }) } address={toAddress} /> ) : null} )}
{contentComponent || ( )} {shouldDisplayWarning && errorKey === INSUFFICIENT_FUNDS_ERROR_KEY && (
{currentTransaction.chainId === MAINNET_CHAIN_ID ? ( {t('insufficientCurrency', [nativeCurrency, networkName])} {t('orDeposit')} } useIcon iconFillColor="#d73a49" type="danger" /> ) : ( {t('insufficientCurrency', [nativeCurrency, networkName])} {t('buyOther', [nativeCurrency])} } useIcon iconFillColor="#d73a49" type="danger" /> )}
)} {shouldDisplayWarning && errorKey !== INSUFFICIENT_FUNDS_ERROR_KEY && (
)} {contentComponent && ( {unapprovedTxCount > 1 && ( {t('rejectTxsN', [unapprovedTxCount])} )} )} {editingGas && !supportsEIP1559V2 && ( )} {supportsEIP1559V2 && ( <> )}
); } }