import React, { Component } from 'react' import PropTypes from 'prop-types' import Tooltip from '../../components/ui/tooltip-v2' import copyToClipboard from 'copy-to-clipboard' import classnames from 'classnames' import { ENVIRONMENT_TYPE_NOTIFICATION } from '../../../../app/scripts/lib/enums' import { getEnvironmentType } from '../../../../app/scripts/lib/util' import Identicon from '../../components/ui/identicon' import AccountListItem from '../send/account-list-item/account-list-item.component' import { conversionUtil } from '../../helpers/utils/conversion-util' import Button from '../../components/ui/button' import { DEFAULT_ROUTE } from '../../helpers/constants/routes' export default class ConfirmDecryptMessage extends Component { static contextTypes = { t: PropTypes.func.isRequired, metricsEvent: PropTypes.func.isRequired, } static propTypes = { balance: PropTypes.string, clearConfirmTransaction: PropTypes.func.isRequired, cancelDecryptMessage: PropTypes.func.isRequired, decryptMessage: PropTypes.func.isRequired, decryptMessageInline: PropTypes.func.isRequired, conversionRate: PropTypes.number, history: PropTypes.object.isRequired, requesterAddress: PropTypes.string, selectedAccount: PropTypes.object, txData: PropTypes.object, domainMetadata: PropTypes.object, } state = { selectedAccount: this.props.selectedAccount, hasCopied: false, copyToClipboardPressed: false, } componentDidMount = () => { if (getEnvironmentType(window.location.href) === ENVIRONMENT_TYPE_NOTIFICATION) { window.addEventListener('beforeunload', this._beforeUnload) } } componentWillUnmount = () => { this._removeBeforeUnload() } _beforeUnload = (event) => { const { clearConfirmTransaction, cancelDecryptMessage } = this.props const { metricsEvent } = this.context metricsEvent({ eventOpts: { category: 'Messages', action: 'Decrypt Message Request', name: 'Cancel Via Notification Close', }, }) clearConfirmTransaction() cancelDecryptMessage(event) } _removeBeforeUnload = () => { if (getEnvironmentType(window.location.href) === ENVIRONMENT_TYPE_NOTIFICATION) { window.removeEventListener('beforeunload', this._beforeUnload) } } copyMessage = () => { copyToClipboard(this.state.rawMessage) this.context.metricsEvent({ eventOpts: { category: 'Messages', action: 'Decrypt Message Copy', name: 'Copy', }, }) this.setState({ hasCopied: true }) setTimeout(() => this.setState({ hasCopied: false }), 3000) } renderHeader = () => { return (
{ this.context.t('decryptRequest') }
) } renderAccount = () => { const { selectedAccount } = this.state return (
{ `${this.context.t('account')}:` }
) } renderBalance = () => { const { balance, conversionRate } = this.props const balanceInEther = conversionUtil(balance, { fromNumericBase: 'hex', toNumericBase: 'dec', fromDenomination: 'WEI', numberOfDecimals: 6, conversionRate, }) return (
{ `${this.context.t('balance')}:` }
{ `${balanceInEther} ETH` }
) } renderRequestIcon = () => { const { requesterAddress } = this.props return (
) } renderAccountInfo = () => { return (
{ this.renderAccount() } { this.renderRequestIcon() } { this.renderBalance() }
) } renderBody = () => { const { txData } = this.props const origin = this.props.domainMetadata[txData.msgParams.origin] const notice = this.context.t('decryptMessageNotice', [origin.name]) const { hasCopied, hasDecrypted, hasError, rawMessage, errorMessage, copyToClipboardPressed, } = this.state return (
{ this.renderAccountInfo() }
{origin.icon ? ( ) : ( {origin.name.charAt(0).toUpperCase()} )}
{ notice }
{ !hasDecrypted && !hasError ? txData.msgParams.data : rawMessage } { !hasError ? '' : errorMessage }
{ this.props.decryptMessageInline(txData, event).then((result) => { if (!result.error) { this.setState({ hasDecrypted: true, rawMessage: result.rawData }) } else { this.setState({ hasError: true, errorMessage: this.context.t('decryptInlineError', [result.error]) }) } }) }} >
{this.context.t('decryptMetamask')}
{ hasDecrypted ? (
this.copyMessage()} onMouseDown={() => this.setState({ copyToClipboardPressed: true })} onMouseUp={() => this.setState({ copyToClipboardPressed: false })} >
{this.context.t('decryptCopy')}
) :
}
) } renderFooter = () => { const { txData } = this.props return (
) } render = () => { return (
{ this.renderHeader() } { this.renderBody() } { this.renderFooter() }
) } }