aboutsummaryrefslogblamecommitdiffstats
path: root/ui/app/conf-tx.js
blob: 983070013e4d2d97f9fac0631976b9024beb18d7 (plain) (tree)











































































































































                                                                                       
const inherits = require('util').inherits
const Component = require('react').Component
const ReactCSSTransitionGroup = require('react-addons-css-transition-group')
const h = require('react-hyperscript')
const connect = require('react-redux').connect
const copyToClipboard = require('copy-to-clipboard')
const actions = require('./actions')
const AccountPanel = require('./components/account-panel')
const valuesFor = require('./util').valuesFor
const addressSummary = require('./util').addressSummary
const readableDate = require('./util').readableDate
const formatBalance = require('./util').formatBalance
const dataSize = require('./util').dataSize

module.exports = connect(mapStateToProps)(ConfirmTxScreen)

function mapStateToProps(state) {
  return {
    identities: state.metamask.identities,
    accounts: state.metamask.accounts,
    selectedAddress: state.metamask.selectedAddress,
    unconfTxs: state.metamask.unconfTxs,
    index: state.appState.currentView.context,
  }
}

inherits(ConfirmTxScreen, Component)
function ConfirmTxScreen() {
  Component.call(this)
}


ConfirmTxScreen.prototype.render = function() {
  var state = this.props
  var unconfTxList = valuesFor(state.unconfTxs).sort(tx => tx.time)
  var txData = unconfTxList[state.index] || {}
  var txParams = txData.txParams || {}
  var address =  txParams.from || state.selectedAddress
  var identity = state.identities[address] || { address: address }
  var account = state.accounts[address] || { address: address }

  return (

    h('.unconftx-section.flex-column.flex-grow', [

      // subtitle and nav
      h('.section-title.flex-row.flex-center', [
        h('i.fa.fa-arrow-left.fa-lg.cursor-pointer', {
          onClick: this.navigateToAccounts.bind(this),
        }),
        h('h2.page-subtitle', 'Confirm Transaction'),
      ]),

      h('h3', {
        style: {
          alignSelf: 'center',
          display: unconfTxList.length > 1 ? 'block' : 'none',
        },
      }, [
        h('i.fa.fa-arrow-left.fa-lg.cursor-pointer', {
          style: {
            display: state.index === 0 ? 'none' : 'inline-block',
          },
          onClick: () => state.dispatch(actions.previousTx()),
        }),
        ` Transaction ${state.index + 1} of ${unconfTxList.length} `,
        h('i.fa.fa-arrow-right.fa-lg.cursor-pointer', {
          style: {
            display: state.index + 1 === unconfTxList.length ? 'none' : 'inline-block',
          },
          onClick: () => state.dispatch(actions.nextTx()),
        }),
      ]),

      h(ReactCSSTransitionGroup, {
        transitionName: "main",
        transitionEnterTimeout: 300,
        transitionLeaveTimeout: 300,
      }, [

        h('.transaction', {
          key: txData.id,
        }, [

          // account that will sign
          h(AccountPanel, {
            showFullAddress: true,
            identity: identity,
            account: account,
          }),

          // tx data
          h('.tx-data.flex-column.flex-justify-center.flex-grow.select-none', [

            h('.flex-row.flex-space-between', [
              h('label.font-small', 'TO ADDRESS'),
              h('span.font-small', addressSummary(txParams.to)),
            ]),

            h('.flex-row.flex-space-between', [
              h('label.font-small', 'DATE'),
              h('span.font-small', readableDate(txData.time)),
            ]),

            h('.flex-row.flex-space-between', [
              h('label.font-small', 'AMOUNT'),
              h('span.font-small', formatBalance(txParams.value)),
            ]),

          ]),

          // send + cancel
          h('.flex-row.flex-space-around', [
            h('button', {
              onClick: this.cancelTransaction.bind(this, txData),
            }, 'Cancel'),
            h('button', {
              onClick: this.sendTransaction.bind(this, txData),
            }, 'Send'),
          ]),
        ]),
      ]),
    ]) // No comma or semicolon can go here
  )
}

ConfirmTxScreen.prototype.sendTransaction = function(txData, event){
  event.stopPropagation()
  this.props.dispatch(actions.sendTx(txData))
}

ConfirmTxScreen.prototype.cancelTransaction = function(txData, event){
  event.stopPropagation()
  this.props.dispatch(actions.cancelTx(txData))
}

ConfirmTxScreen.prototype.navigateToAccounts = function(event){
  event.stopPropagation()
  this.props.dispatch(actions.showAccountsPage())
}