diff --git a/renderer/components/Activity/ActivityModal/ActivityModal.js b/renderer/components/Activity/ActivityModal/ActivityModal.js index 70053a2c68d..da3aab3bfe9 100644 --- a/renderer/components/Activity/ActivityModal/ActivityModal.js +++ b/renderer/components/Activity/ActivityModal/ActivityModal.js @@ -12,11 +12,12 @@ export default class ActivityModal extends React.PureComponent { id: PropTypes.string, name: PropTypes.string, }), + saveInvoice: PropTypes.func.isRequired, showNotification: PropTypes.func.isRequired, } render() { - const { item, networkInfo, showNotification, ...rest } = this.props + const { item, networkInfo, showNotification, saveInvoice, ...rest } = this.props if (!item) { return null @@ -25,7 +26,7 @@ export default class ActivityModal extends React.PureComponent { const MODAL_COMPONENTS = { transaction: { component: TransactionModal, - props: { item, networkInfo, showNotification }, + props: { item, networkInfo, showNotification, saveInvoice }, }, payment: { component: PaymentModal, diff --git a/renderer/components/Activity/TransactionModal/TransactionModal.js b/renderer/components/Activity/TransactionModal/TransactionModal.js index cd2b5d636fe..b27bf24d53a 100644 --- a/renderer/components/Activity/TransactionModal/TransactionModal.js +++ b/renderer/components/Activity/TransactionModal/TransactionModal.js @@ -11,11 +11,12 @@ import { import { Flex } from 'rebass' import { intlShape } from '@zap/i18n' import blockExplorer from '@zap/utils/blockExplorer' -import { Bar, DataRow, Header, Link, Panel, Span, Text } from 'components/UI' +import { Bar, DataRow, Header, Link, Panel, Span, Text, Button } from 'components/UI' import { CopyButton, CryptoSelector, CryptoValue, FiatSelector, FiatValue } from 'containers/UI' import { Truncate } from 'components/Util' import Onchain from 'components/Icon/Onchain' import Padlock from 'components/Icon/Padlock' +import ArrowDown from 'components/Icon/ArrowDown' import messages from './messages' class TransactionModal extends React.PureComponent { @@ -26,9 +27,40 @@ class TransactionModal extends React.PureComponent { id: PropTypes.string, name: PropTypes.string, }), + saveInvoice: PropTypes.func.isRequired, showNotification: PropTypes.func.isRequired, } + saveInvoice = () => { + const { saveInvoice, item, intl } = this.props + const destAddress = get(item, 'dest_addresses[0]') + const amount = item.amount || item.limboAmount || 0 + const isIncoming = item.received || item.limboAmount > 0 + const { tx_hash, time_stamp, num_confirmations } = item + saveInvoice({ + defaultFilename: tx_hash && `zap-tx-${tx_hash.substring(0, 7)}`, + title: intl.formatMessage(messages[isIncoming ? 'receipt' : 'outgoing_payment_notification']), + subtitle: intl.formatMessage(messages.receipt_subtitle), + invoiceData: [ + num_confirmations + ? [ + intl.formatMessage({ ...messages.date_confirmed }), + `${intl.formatDate(time_stamp * 1000)} ${intl.formatTime(time_stamp * 1000)}`, + ] + : [ + intl.formatMessage({ ...messages.date_confirmed }), + intl.formatMessage({ ...messages.unconfirmed }), + ], + [intl.formatMessage({ ...messages.address }), destAddress, {}, { fontSize: 10 }], + tx_hash && [intl.formatMessage({ ...messages.tx_hash }), tx_hash, {}, { fontSize: 10 }], + [ + intl.formatMessage({ ...messages.amount }), + `${intl.formatNumber(Math.abs(amount))} satoshis`, + ], + ].filter(Boolean), + }) + } + showBlock = hash => { const { networkInfo } = this.props return networkInfo && blockExplorer.showBlock(networkInfo, hash) @@ -53,6 +85,18 @@ class TransactionModal extends React.PureComponent { return ( +
} subtitle={} diff --git a/renderer/containers/Activity/ActivityModal.js b/renderer/containers/Activity/ActivityModal.js index 0ede3c8ce4d..78b9939f5ff 100644 --- a/renderer/containers/Activity/ActivityModal.js +++ b/renderer/containers/Activity/ActivityModal.js @@ -1,5 +1,5 @@ import { connect } from 'react-redux' -import { hideActivityModal, activitySelectors } from 'reducers/activity' +import { hideActivityModal, activitySelectors, saveInvoice } from 'reducers/activity' import { infoSelectors } from 'reducers/info' import { showNotification } from 'reducers/notification' import { ActivityModal } from 'components/Activity/ActivityModal' @@ -13,6 +13,7 @@ const mapStateToProps = state => ({ const mapDispatchToProps = { hideActivityModal, showNotification, + saveInvoice, } export default connect(