aboutsummaryrefslogblamecommitdiffstats
path: root/ui/app/components/pages/keychains/reveal-seed.js
blob: 247f3c8e2aa51f3c7df951b86184bab698ffdf1f (plain) (tree)
1
2
3
4
5
6
7
8
9
10









                                                                           



                                                               
























































































































                                                                                                                                      
                                                         


























































                                                                             
const { Component } = require('react')
const { connect } = require('react-redux')
const PropTypes = require('prop-types')
const h = require('react-hyperscript')
const { exportAsFile } = require('../../../util')
const { requestRevealSeed, confirmSeedWords } = require('../../../actions')
const { DEFAULT_ROUTE } = require('../../../routes')

class RevealSeedPage extends Component {
  componentDidMount () {
    const passwordBox = document.getElementById('password-box')
    if (passwordBox) {
      passwordBox.focus()
    }
  }

  checkConfirmation (event) {
    if (event.key === 'Enter') {
      event.preventDefault()
      this.revealSeedWords()
    }
  }

  revealSeedWords () {
    const password = document.getElementById('password-box').value
    this.props.requestRevealSeed(password)
  }

  renderSeed () {
    const { seedWords, confirmSeedWords, history } = this.props

    return (
      h('.initialize-screen.flex-column.flex-center.flex-grow', [

        h('h3.flex-center.text-transform-uppercase', {
          style: {
            background: '#EBEBEB',
            color: '#AEAEAE',
            marginTop: 36,
            marginBottom: 8,
            width: '100%',
            fontSize: '20px',
            padding: 6,
          },
        }, [
          'Vault Created',
        ]),

        h('div', {
          style: {
            fontSize: '1em',
            marginTop: '10px',
            textAlign: 'center',
          },
        }, [
          h('span.error', 'These 12 words are the only way to restore your MetaMask accounts.\nSave them somewhere safe and secret.'),
        ]),

        h('textarea.twelve-word-phrase', {
          readOnly: true,
          value: seedWords,
        }),

        h('button.primary', {
          onClick: () => confirmSeedWords().then(() => history.push(DEFAULT_ROUTE)),
          style: {
            margin: '24px',
            fontSize: '0.9em',
            marginBottom: '10px',
          },
        }, 'I\'ve copied it somewhere safe'),

        h('button.primary', {
          onClick: () => exportAsFile(`MetaMask Seed Words`, seedWords),
          style: {
            margin: '10px',
            fontSize: '0.9em',
          },
        }, 'Save Seed Words As File'),
      ])
    )
  }

  renderConfirmation () {
    const { history, warning, inProgress } = this.props

    return (
      h('.initialize-screen.flex-column.flex-center.flex-grow', {
        style: { maxWidth: '420px' },
      }, [

        h('h3.flex-center.text-transform-uppercase', {
          style: {
            background: '#EBEBEB',
            color: '#AEAEAE',
            marginBottom: 24,
            width: '100%',
            fontSize: '20px',
            padding: 6,
          },
        }, [
          'Reveal Seed Words',
        ]),

        h('.div', {
          style: {
            display: 'flex',
            flexDirection: 'column',
            padding: '20px',
            justifyContent: 'center',
          },
        }, [

          h('h4', 'Do not recover your seed words in a public place! These words can be used to steal all your accounts.'),

          // confirmation
          h('input.large-input.letter-spacey', {
            type: 'password',
            id: 'password-box',
            placeholder: 'Enter your password to confirm',
            onKeyPress: this.checkConfirmation.bind(this),
            style: {
              width: 260,
              marginTop: '12px',
            },
          }),

          h('.flex-row.flex-start', {
            style: {
              marginTop: 30,
              width: '50%',
            },
          }, [
            // cancel
            h('button.primary', {
              onClick: () => history.push(DEFAULT_ROUTE),
            }, 'CANCEL'),

            // submit
            h('button.primary', {
              style: { marginLeft: '10px' },
              onClick: this.revealSeedWords.bind(this),
            }, 'OK'),

          ]),

          warning && (
            h('span.error', {
              style: {
                margin: '20px',
              },
            }, warning.split('-'))
          ),

          inProgress && (
            h('span.in-progress-notification', 'Generating Seed...')
          ),
        ]),
      ])
    )
  }

  render () {
    return this.props.seedWords
      ? this.renderSeed()
      : this.renderConfirmation()
  }
}

RevealSeedPage.propTypes = {
  requestRevealSeed: PropTypes.func,
  confirmSeedWords: PropTypes.func,
  seedWords: PropTypes.string,
  inProgress: PropTypes.bool,
  history: PropTypes.object,
  warning: PropTypes.string,
}

const mapStateToProps = state => {
  const { appState: { warning }, metamask: { seedWords } } = state

  return {
    warning,
    seedWords,
  }
}

const mapDispatchToProps = dispatch => {
  return {
    requestRevealSeed: password => dispatch(requestRevealSeed(password)),
    confirmSeedWords: () => dispatch(confirmSeedWords()),
  }
}

module.exports = connect(mapStateToProps, mapDispatchToProps)(RevealSeedPage)