// const { inherits } = require('util')
// const PersistentForm = require('../lib/persistent-form')
// const h = require('react-hyperscript')
// const connect = require('react-redux').connect
// const Identicon = require('./components/identicon')
// const EnsInput = require('./components/ens-input')
// const GasTooltip = require('./components/send/gas-tooltip')
// const CurrencyToggle = require('./components/send/currency-toggle')
// const GasFeeDisplay = require('./components/send/gas-fee-display')
// const { getSelectedIdentity } = require('./selectors')

// const {
//   showAccountsPage,
//   backToAccountDetail,
//   displayWarning,
//   hideWarning,
//   addToAddressBook,
//   signTx,
//   estimateGas,
//   getGasPrice,
// } = require('./actions')
// const { stripHexPrefix, addHexPrefix } = require('ethereumjs-util')
// const { isHex, numericBalance, isValidAddress, allNull } = require('./util')
// const { conversionUtil, conversionGreaterThan } = require('./conversion-util')

// module.exports = connect(mapStateToProps)(SendTransactionScreen)

// function mapStateToProps (state) {
//   const {
//     selectedAddress: address,
//     accounts,
//     identities,
//     network,
//     addressBook,
//     conversionRate,
//     currentBlockGasLimit: blockGasLimit,
//   } = state.metamask
//   const { warning } = state.appState
//   const selectedIdentity = getSelectedIdentity(state)
//   const account = accounts[address]

//   return {
//     address,
//     accounts,
//     identities,
//     network,
//     addressBook,
//     conversionRate,
//     blockGasLimit,
//     warning,
//     selectedIdentity,
//     error: warning && warning.split('.')[0],
//     account,
//     identity: identities[address],
//     balance: account ? account.balance : null,
//   }
// }

// inherits(SendTransactionScreen, PersistentForm)
// function SendTransactionScreen () {
//   PersistentForm.call(this)

//   // [WIP] These are the bare minimum of tx props needed to sign a transaction
//   // We will need a few more for contract-related interactions
//   this.state = {
//     newTx: {
//       from: '',
//       to: '',
//       amountToSend: '0x0',
//       gasPrice: null,
//       gas: null,
//       amount: '0x0',
//       txData: null,
//       memo: '',
//     },
//     activeCurrency: 'USD',
//     tooltipIsOpen: false,
//     errors: {},
//     isValid: false,
//   }

//   this.back = this.back.bind(this)
//   this.closeTooltip = this.closeTooltip.bind(this)
//   this.onSubmit = this.onSubmit.bind(this)
//   this.setActiveCurrency = this.setActiveCurrency.bind(this)
//   this.toggleTooltip = this.toggleTooltip.bind(this)
//   this.validate = this.validate.bind(this)
//   this.getAmountToSend = this.getAmountToSend.bind(this)
//   this.setErrorsFor = this.setErrorsFor.bind(this)
//   this.clearErrorsFor = this.clearErrorsFor.bind(this)

//   this.renderFromInput = this.renderFromInput.bind(this)
//   this.renderToInput = this.renderToInput.bind(this)
//   this.renderAmountInput = this.renderAmountInput.bind(this)
//   this.renderGasInput = this.renderGasInput.bind(this)
//   this.renderMemoInput = this.renderMemoInput.bind(this)
//   this.renderErrorMessage = this.renderErrorMessage.bind(this)
// }

// SendTransactionScreen.prototype.componentWillMount = function () {
//   const { newTx } = this.state
//   const { address } = this.props

//   Promise.all([
//     this.props.dispatch(getGasPrice()),
//     this.props.dispatch(estimateGas({
//       from: address,
//       gas: '746a528800',
//     })),
//   ])
//   .then(([blockGasPrice, estimatedGas]) => {
//     console.log({ blockGasPrice, estimatedGas})
//     this.setState({
//       newTx: {
//         ...newTx,
//         gasPrice: blockGasPrice,
//         gas: estimatedGas,
//       },
//     })
//   })
// }

// SendTransactionScreen.prototype.renderErrorMessage = function(errorType, warning) {
//   const { errors } = this.state
//   const errorMessage = errors[errorType];

//   return errorMessage || warning
//     ? h('div.send-screen-input-wrapper__error-message', [ errorMessage || warning ])
//     : null
// }

// SendTransactionScreen.prototype.renderFromInput = function (from, identities) {
//   return h('div.send-screen-input-wrapper', [

//     h('div', 'From:'),

//     h('input.large-input.send-screen-input', {
//       list: 'accounts',
//       placeholder: 'Account',
//       value: from,
//       onChange: (event) => {
//         this.setState({
//           newTx: {
//             ...this.state.newTx,
//             from: event.target.value,
//           },
//         })
//       },
//       onBlur: () => this.setErrorsFor('from'),
//       onFocus: event => {
//         this.clearErrorsFor('from')
//         this.state.newTx.from && event.target.select()
//       },
//     }),

//     h('datalist#accounts', [
//       Object.entries(identities).map(([key, { address, name }]) => {
//         return h('option', {
//           value: address,
//           label: name,
//           key: address,
//         })
//       }),
//     ]),

//     this.renderErrorMessage('from'),

//   ])
// }

// SendTransactionScreen.prototype.renderToInput = function (to, identities, addressBook) {
//   return h('div.send-screen-input-wrapper', [

//     h('div', 'To:'),

//     h('input.large-input.send-screen-input', {
//       name: 'address',
//       list: 'addresses',
//       placeholder: 'Address',
//       value: to,
//       onChange: (event) => {
//         this.setState({
//           newTx: {
//             ...this.state.newTx,
//             to: event.target.value,
//           },
//         })
//       },
//       onBlur: () => {
//         this.setErrorsFor('to')
//       },
//       onFocus: event => {
//         this.clearErrorsFor('to')
//         this.state.newTx.to && event.target.select()
//       },
//     }),

//     h('datalist#addresses', [
//       // Corresponds to the addresses owned.
//       ...Object.entries(identities).map(([key, { address, name }]) => {
//         return h('option', {
//           value: address,
//           label: name,
//           key: address,
//         })
//       }),
//       // Corresponds to previously sent-to addresses.
//       ...addressBook.map(({ address, name }) => {
//         return h('option', {
//           value: address,
//           label: name,
//           key: address,
//         })
//       }),
//     ]),

//     this.renderErrorMessage('to'),

//   ])
// }

// SendTransactionScreen.prototype.renderAmountInput = function (activeCurrency) {
//   return h('div.send-screen-input-wrapper', [

//     h('div.send-screen-amount-labels', [
//       h('span', 'Amount'),
//       h(CurrencyToggle, {
//         activeCurrency,
//         onClick: (newCurrency) => this.setActiveCurrency(newCurrency),
//       }), // holding on icon from design
//     ]),

//     h('input.large-input.send-screen-input', {
//       placeholder: `0 ${activeCurrency}`,
//       type: 'number',
//       onChange: (event) => {
//         const amountToSend = event.target.value
//           ? this.getAmountToSend(event.target.value)
//           : '0x0'

//         this.setState({
//           newTx: Object.assign(
//             this.state.newTx,
//             {
//               amount: event.target.value,
//               amountToSend: amountToSend,
//             }
//           ),
//         })
//       },
//       onBlur: () => {
//         this.setErrorsFor('amount')
//       },
//       onFocus: () => this.clearErrorsFor('amount'),
//     }),

//     this.renderErrorMessage('amount'),

//   ])
// }

// SendTransactionScreen.prototype.renderGasInput = function (gasPrice, gas, activeCurrency, conversionRate, blockGasLimit) {
//   return h('div.send-screen-input-wrapper', [
//     this.state.tooltipIsOpen && h(GasTooltip, {
//       className: 'send-tooltip',
//       gasPrice,
//       gasLimit: gas,
//       onClose: this.closeTooltip,
//       onFeeChange: ({gasLimit, gasPrice}) => {
//         this.setState({
//           newTx: {
//             ...this.state.newTx,
//             gas: gasLimit,
//             gasPrice,
//           },
//         })
//       },
//     }),

//     h('div.send-screen-gas-labels', [
//       h('span', [
//         h('i.fa.fa-bolt'),
//         'Gas fee:',
//       ]),
//       h('span', 'What\'s this?'),
//     ]),

//     // TODO: handle loading time when switching to USD
//     h('div.large-input.send-screen-gas-input', {}, [
//       h(GasFeeDisplay, {
//         activeCurrency,
//         conversionRate,
//         gas,
//         gasPrice,
//         blockGasLimit,
//       }),
//       h('div.send-screen-gas-input-customize', {
//         onClick: this.toggleTooltip,
//       }, [
//         'Customize',
//       ]),
//     ]),

//   ])
// }

// SendTransactionScreen.prototype.renderMemoInput = function () {
//   return h('div.send-screen-input-wrapper', [
//     h('div', 'Transaction memo (optional)'),
//     h('input.large-input.send-screen-input', {
//       onChange: () => {
//         this.setState({
//           newTx: Object.assign(
//             this.state.newTx,
//             {
//               memo: event.target.value,
//             }
//           ),
//         })
//       },
//     }),
//   ])
// }

// SendTransactionScreen.prototype.render = function () {
//   this.persistentFormParentId = 'send-tx-form'

//   const props = this.props
//   const {
//     warning,
//     identities,
//     addressBook,
//     conversionRate,
//   } = props

//   const {
//     blockGasLimit,
//     newTx,
//     activeCurrency,
//     isValid,
//   } = this.state
//   const { gas, gasPrice } = newTx

//   return (

//     h('div.send-screen-wrapper', [
//       // Main Send token Card
//       h('div.send-screen-card', [

//         h('img.send-eth-icon', { src: '../images/eth_logo.svg' }),

//         h('div.send-screen__title', 'Send'),

//         h('div.send-screen__subtitle', 'Send Ethereum to anyone with an Ethereum account'),

//         this.renderFromInput(this.state.newTx.from, identities),

//         this.renderToInput(this.state.newTx.to, identities, addressBook),

//         this.renderAmountInput(activeCurrency),

//         this.renderGasInput(
//           gasPrice || '0x0',
//           gas || '0x0',
//           activeCurrency,
//           conversionRate,
//           blockGasLimit
//         ),

//         this.renderMemoInput(),

//         this.renderErrorMessage(null, warning),

//       ]),

//       // Buttons underneath card
//       h('section.flex-column.flex-center', [
//         h('button.btn-secondary.send-screen__send-button', {
//           className: !isValid && 'send-screen__send-button__disabled',
//           onClick: (event) => isValid && this.onSubmit(event),
//         }, 'Next'),
//         h('button.btn-tertiary.send-screen__cancel-button', {
//           onClick: this.back,
//         }, 'Cancel'),
//       ]),
//     ])

//   )
// }

// SendTransactionScreen.prototype.toggleTooltip = function () {
//   this.setState({ tooltipIsOpen: !this.state.tooltipIsOpen })
// }

// SendTransactionScreen.prototype.closeTooltip = function () {
//   this.setState({ tooltipIsOpen: false })
// }

// SendTransactionScreen.prototype.setActiveCurrency = function (newCurrency) {
//   this.setState({ activeCurrency: newCurrency })
// }

// SendTransactionScreen.prototype.back = function () {
//   var address = this.props.address
//   this.props.dispatch(backToAccountDetail(address))
// }

// SendTransactionScreen.prototype.validate = function (balance, amountToSend, { to, from }) {
//   const sufficientBalance = conversionGreaterThan(
//     {
//       value: balance,
//       fromNumericBase: 'hex',
//     },
//     {
//       value: amountToSend,
//       fromNumericBase: 'hex',
//     },
//   )

//   const amountLessThanZero = conversionGreaterThan(
//     {
//       value: 0,
//       fromNumericBase: 'dec',
//     },
//     {
//       value: amountToSend,
//       fromNumericBase: 'hex',
//     },
//   )

//   const errors = {}

//   if (!sufficientBalance) {
//     errors.amount = 'Insufficient funds.'
//   }

//   if (amountLessThanZero) {
//     errors.amount = 'Can not send negative amounts of ETH.'
//   }

//   if (!from) {
//     errors.from = 'Required'
//   }

//   if (from && !isValidAddress(from)) {
//     errors.from = 'Sender address is invalid.'
//   }

//   if (!to) {
//     errors.to = 'Required'
//   }

//   if (to && !isValidAddress(to)) {
//     errors.to = 'Recipient address is invalid.'
//   }

//   // if (txData && !isHex(stripHexPrefix(txData))) {
//   //   message = 'Transaction data must be hex string.'
//   //   return this.props.dispatch(displayWarning(message))
//   // }

//   return {
//     isValid: allNull(errors),
//     errors,
//   }
// }

// SendTransactionScreen.prototype.getAmountToSend = function (amount) {
//   const { activeCurrency } = this.state
//   const { conversionRate } = this.props

//   return conversionUtil(amount, {
//     fromNumericBase: 'dec',
//     toNumericBase: 'hex',
//     fromCurrency: activeCurrency,
//     toCurrency: 'ETH',
//     toDenomination: 'WEI',
//     conversionRate,
//     invertConversionRate: activeCurrency !== 'ETH',
//   })
// }

// SendTransactionScreen.prototype.setErrorsFor = function (field) {
//   const { balance } = this.props
//   const { newTx, errors: previousErrors } = this.state
//   const { amountToSend } = newTx

//   const {
//     isValid,
//     errors: newErrors
//   } = this.validate(balance, amountToSend, newTx)

//   const nextErrors = Object.assign({}, previousErrors, {
//     [field]: newErrors[field] || null
//   })

//   if (!isValid) {
//     this.setState({
//       errors: nextErrors,
//       isValid,
//     })
//   }
// }

// SendTransactionScreen.prototype.clearErrorsFor = function (field) {
//   const { errors: previousErrors } = this.state
//   const nextErrors = Object.assign({}, previousErrors, {
//     [field]: null
//   })

//   this.setState({
//     errors: nextErrors,
//     isValid: allNull(nextErrors),
//   })
// }

// SendTransactionScreen.prototype.onSubmit = function (event) {
//   event.preventDefault()
//   const { warning, balance } = this.props
//   const state = this.state || {}

//   const recipient = state.newTx.to
//   const sender = state.newTx.from
//   const nickname = state.nickname || ' '

//   // TODO: convert this to hex when created and include it in send
//   const txData = state.newTx.memo

//   this.props.dispatch(hideWarning())

//   this.props.dispatch(addToAddressBook(recipient, nickname))

//   var txParams = {
//     from: this.state.newTx.from,
//     to: this.state.newTx.to,

//     value: this.state.newTx.amountToSend,

//     gas: this.state.newTx.gas,
//     gasPrice: this.state.newTx.gasPrice,
//   }

//   if (recipient) txParams.to = addHexPrefix(recipient)
//   if (txData) txParams.data = txData

//   this.props.dispatch(signTx(txParams))
// }