|
|
|
@ -1,16 +1,29 @@ |
|
|
|
|
import React, { Component } from 'react' |
|
|
|
|
import React, { PureComponent } from 'react' |
|
|
|
|
import PropTypes from 'prop-types' |
|
|
|
|
import classnames from 'classnames' |
|
|
|
|
import Identicon from '../identicon' |
|
|
|
|
import Tooltip from '../tooltip-v2' |
|
|
|
|
import copyToClipboard from 'copy-to-clipboard' |
|
|
|
|
import { DEFAULT_VARIANT, CARDS_VARIANT } from './sender-to-recipient.constants' |
|
|
|
|
|
|
|
|
|
export default class SenderToRecipient extends Component { |
|
|
|
|
const variantHash = { |
|
|
|
|
[DEFAULT_VARIANT]: 'sender-to-recipient--default', |
|
|
|
|
[CARDS_VARIANT]: 'sender-to-recipient--cards', |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
export default class SenderToRecipient extends PureComponent { |
|
|
|
|
static propTypes = { |
|
|
|
|
senderName: PropTypes.string, |
|
|
|
|
senderAddress: PropTypes.string, |
|
|
|
|
recipientName: PropTypes.string, |
|
|
|
|
recipientAddress: PropTypes.string, |
|
|
|
|
t: PropTypes.func, |
|
|
|
|
variant: PropTypes.oneOf([DEFAULT_VARIANT, CARDS_VARIANT]), |
|
|
|
|
addressOnly: PropTypes.bool, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static defaultProps = { |
|
|
|
|
variant: DEFAULT_VARIANT, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static contextTypes = { |
|
|
|
@ -22,81 +35,102 @@ export default class SenderToRecipient extends Component { |
|
|
|
|
recipientAddressCopied: false, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
renderRecipientWithAddress () { |
|
|
|
|
const { t } = this.context |
|
|
|
|
const { recipientName, recipientAddress } = this.props |
|
|
|
|
|
|
|
|
|
return ( |
|
|
|
|
<div |
|
|
|
|
className="sender-to-recipient__recipient sender-to-recipient__recipient--with-address" |
|
|
|
|
onClick={() => { |
|
|
|
|
this.setState({ recipientAddressCopied: true }) |
|
|
|
|
copyToClipboard(recipientAddress) |
|
|
|
|
}} |
|
|
|
|
> |
|
|
|
|
renderSenderIdenticon () { |
|
|
|
|
return !this.props.addressOnly && ( |
|
|
|
|
<div className="sender-to-recipient__sender-icon"> |
|
|
|
|
<Identicon |
|
|
|
|
address={recipientAddress} |
|
|
|
|
address={this.props.senderAddress} |
|
|
|
|
diameter={24} |
|
|
|
|
/> |
|
|
|
|
</div> |
|
|
|
|
) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
renderSenderAddress () { |
|
|
|
|
const { t } = this.context |
|
|
|
|
const { senderName, senderAddress, addressOnly } = this.props |
|
|
|
|
|
|
|
|
|
return ( |
|
|
|
|
<Tooltip |
|
|
|
|
position="bottom" |
|
|
|
|
title={this.state.recipientAddressCopied ? t('copiedExclamation') : t('copyAddress')} |
|
|
|
|
title={this.state.senderAddressCopied ? t('copiedExclamation') : t('copyAddress')} |
|
|
|
|
wrapperClassName="sender-to-recipient__tooltip-wrapper" |
|
|
|
|
containerClassName="sender-to-recipient__tooltip-container" |
|
|
|
|
onHidden={() => this.setState({ recipientAddressCopied: false })} |
|
|
|
|
onHidden={() => this.setState({ senderAddressCopied: false })} |
|
|
|
|
> |
|
|
|
|
<div className="sender-to-recipient__name sender-to-recipient__recipient-name"> |
|
|
|
|
{ recipientName || this.context.t('newContract') } |
|
|
|
|
<div className="sender-to-recipient__name"> |
|
|
|
|
{ addressOnly ? `${t('from')}: ${senderAddress}` : senderName } |
|
|
|
|
</div> |
|
|
|
|
</Tooltip> |
|
|
|
|
</div> |
|
|
|
|
) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
renderRecipientWithoutAddress () { |
|
|
|
|
return ( |
|
|
|
|
<div className="sender-to-recipient__recipient"> |
|
|
|
|
<i className="fa fa-file-text-o" /> |
|
|
|
|
<div className="sender-to-recipient__name sender-to-recipient__recipient-name"> |
|
|
|
|
{ this.context.t('newContract') } |
|
|
|
|
</div> |
|
|
|
|
renderRecipientIdenticon () { |
|
|
|
|
const { recipientAddress } = this.props |
|
|
|
|
|
|
|
|
|
return !this.props.addressOnly && ( |
|
|
|
|
<div className="sender-to-recipient__sender-icon"> |
|
|
|
|
<Identicon |
|
|
|
|
address={recipientAddress} |
|
|
|
|
diameter={24} |
|
|
|
|
/> |
|
|
|
|
</div> |
|
|
|
|
) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
render () { |
|
|
|
|
renderRecipientWithAddress () { |
|
|
|
|
const { t } = this.context |
|
|
|
|
const { senderName, senderAddress, recipientAddress } = this.props |
|
|
|
|
const { recipientName, recipientAddress, addressOnly } = this.props |
|
|
|
|
|
|
|
|
|
return ( |
|
|
|
|
<div className="sender-to-recipient__container"> |
|
|
|
|
<div |
|
|
|
|
className="sender-to-recipient__sender" |
|
|
|
|
className="sender-to-recipient__party sender-to-recipient__party--recipient sender-to-recipient__party--recipient-with-address" |
|
|
|
|
onClick={() => { |
|
|
|
|
this.setState({ senderAddressCopied: true }) |
|
|
|
|
copyToClipboard(senderAddress) |
|
|
|
|
this.setState({ recipientAddressCopied: true }) |
|
|
|
|
copyToClipboard(recipientAddress) |
|
|
|
|
}} |
|
|
|
|
> |
|
|
|
|
<div className="sender-to-recipient__sender-icon"> |
|
|
|
|
<Identicon |
|
|
|
|
address={senderAddress} |
|
|
|
|
diameter={24} |
|
|
|
|
/> |
|
|
|
|
</div> |
|
|
|
|
{ this.renderRecipientIdenticon() } |
|
|
|
|
<Tooltip |
|
|
|
|
position="bottom" |
|
|
|
|
title={this.state.senderAddressCopied ? t('copiedExclamation') : t('copyAddress')} |
|
|
|
|
title={this.state.recipientAddressCopied ? t('copiedExclamation') : t('copyAddress')} |
|
|
|
|
wrapperClassName="sender-to-recipient__tooltip-wrapper" |
|
|
|
|
containerClassName="sender-to-recipient__tooltip-container" |
|
|
|
|
onHidden={() => this.setState({ senderAddressCopied: false })} |
|
|
|
|
onHidden={() => this.setState({ recipientAddressCopied: false })} |
|
|
|
|
> |
|
|
|
|
<div className="sender-to-recipient__name sender-to-recipient__sender-name"> |
|
|
|
|
{ senderName } |
|
|
|
|
<div className="sender-to-recipient__name"> |
|
|
|
|
{ |
|
|
|
|
addressOnly |
|
|
|
|
? `${t('to')}: ${recipientAddress}` |
|
|
|
|
: (recipientName || this.context.t('newContract')) |
|
|
|
|
} |
|
|
|
|
</div> |
|
|
|
|
</Tooltip> |
|
|
|
|
</div> |
|
|
|
|
) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
renderRecipientWithoutAddress () { |
|
|
|
|
return ( |
|
|
|
|
<div className="sender-to-recipient__party sender-to-recipient__party--recipient"> |
|
|
|
|
<i className="fa fa-file-text-o" /> |
|
|
|
|
<div className="sender-to-recipient__name"> |
|
|
|
|
{ this.context.t('newContract') } |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
renderArrow () { |
|
|
|
|
return this.props.variant === CARDS_VARIANT |
|
|
|
|
? ( |
|
|
|
|
<div className="sender-to-recipient__arrow-container"> |
|
|
|
|
<img |
|
|
|
|
height={20} |
|
|
|
|
src="./images/caret-right.svg" |
|
|
|
|
/> |
|
|
|
|
</div> |
|
|
|
|
) : ( |
|
|
|
|
<div className="sender-to-recipient__arrow-container"> |
|
|
|
|
<div className="sender-to-recipient__arrow-circle"> |
|
|
|
|
<img |
|
|
|
@ -106,6 +140,25 @@ export default class SenderToRecipient extends Component { |
|
|
|
|
/> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
render () { |
|
|
|
|
const { senderAddress, recipientAddress, variant } = this.props |
|
|
|
|
|
|
|
|
|
return ( |
|
|
|
|
<div className={classnames(variantHash[variant])}> |
|
|
|
|
<div |
|
|
|
|
className={classnames('sender-to-recipient__party sender-to-recipient__party--sender')} |
|
|
|
|
onClick={() => { |
|
|
|
|
this.setState({ senderAddressCopied: true }) |
|
|
|
|
copyToClipboard(senderAddress) |
|
|
|
|
}} |
|
|
|
|
> |
|
|
|
|
{ this.renderSenderIdenticon() } |
|
|
|
|
{ this.renderSenderAddress() } |
|
|
|
|
</div> |
|
|
|
|
{ this.renderArrow() } |
|
|
|
|
{ |
|
|
|
|
recipientAddress |
|
|
|
|
? this.renderRecipientWithAddress() |
|
|
|
|