From d9ea2df6c2a2cabedead09f90c3c9bb7b4c37dd1 Mon Sep 17 00:00:00 2001 From: Alexander Tseung Date: Mon, 4 Dec 2017 14:29:52 -0500 Subject: [PATCH] Add route for Mascara confirm seed --- .../src/app/first-time/confirm-seed-screen.js | 133 ++++++++++++++++++ ...backup-phrase-screen.js => seed-screen.js} | 123 +--------------- ui/app/app.js | 11 +- ui/app/routes.js | 4 +- 4 files changed, 151 insertions(+), 120 deletions(-) create mode 100644 mascara/src/app/first-time/confirm-seed-screen.js rename mascara/src/app/first-time/{backup-phrase-screen.js => seed-screen.js} (56%) diff --git a/mascara/src/app/first-time/confirm-seed-screen.js b/mascara/src/app/first-time/confirm-seed-screen.js new file mode 100644 index 000000000..6b730a2f8 --- /dev/null +++ b/mascara/src/app/first-time/confirm-seed-screen.js @@ -0,0 +1,133 @@ +import React, { Component } from 'react' +import PropTypes from 'prop-types' +import { connect } from 'react-redux' +import classnames from 'classnames' +import shuffle from 'lodash.shuffle' +import { compose, onlyUpdateForPropTypes } from 'recompose' +import Identicon from '../../../../ui/app/components/identicon' +import { confirmSeedWords } from '../../../../ui/app/actions' +import Breadcrumbs from './breadcrumbs' +import LoadingScreen from './loading-screen' +import { DEFAULT_ROUTE } from '../../../../ui/app/routes' + +class ConfirmSeedScreen extends Component { + static propTypes = { + isLoading: PropTypes.bool.isRequired, + address: PropTypes.string.isRequired, + seedWords: PropTypes.string, + confirmSeedWords: PropTypes.func.isRequired, + history: PropTypes.object, + }; + + static defaultProps = { + seedWords: '', + } + + constructor (props) { + super(props) + const { seedWords } = props + this.state = { + selectedSeeds: [], + shuffledSeeds: seedWords && shuffle(seedWords.split(' ')), + } + } + + componentWillMount () { + const { seedWords, history } = this.props + if (!seedWords) { + history.push(DEFAULT_ROUTE) + } + } + + render () { + const { seedWords, confirmSeedWords, history } = this.props + const { selectedSeeds, shuffledSeeds } = this.state + const isValid = seedWords === selectedSeeds.map(([_, seed]) => seed).join(' ') + + return ( +
+ { + this.props.isLoading + ? + : ( +
+ +
+
+
+ Confirm your Secret Backup Phrase +
+
+ Please select each phrase in order to make sure it is correct. +
+
+ {selectedSeeds.map(([_, word], i) => ( + + ))} +
+
+ {shuffledSeeds.map((word, i) => { + const isSelected = selectedSeeds + .filter(([index, seed]) => seed === word && index === i) + .length + + return ( + + ) + })} +
+ +
+
+ +
+ ) + } +
+ ) + } +} + +export default compose( + onlyUpdateForPropTypes, + connect( + ({ metamask: { selectedAddress, seedWords }, appState: { isLoading } }) => ({ + seedWords, + isLoading, + address: selectedAddress, + }), + dispatch => ({ + confirmSeedWords: () => dispatch(confirmSeedWords()), + }) + ) +)(ConfirmSeedScreen) diff --git a/mascara/src/app/first-time/backup-phrase-screen.js b/mascara/src/app/first-time/seed-screen.js similarity index 56% rename from mascara/src/app/first-time/backup-phrase-screen.js rename to mascara/src/app/first-time/seed-screen.js index 266a82cdb..dc1da851c 100644 --- a/mascara/src/app/first-time/backup-phrase-screen.js +++ b/mascara/src/app/first-time/seed-screen.js @@ -1,14 +1,12 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' -import {connect} from 'react-redux' +import { connect } from 'react-redux' import classnames from 'classnames' -import shuffle from 'lodash.shuffle' -import {compose, onlyUpdateForPropTypes} from 'recompose' +import { compose, onlyUpdateForPropTypes } from 'recompose' import Identicon from '../../../../ui/app/components/identicon' -import {confirmSeedWords} from '../../../../ui/app/actions' import Breadcrumbs from './breadcrumbs' import LoadingScreen from './loading-screen' -import { DEFAULT_ROUTE } from '../../../../ui/app/routes' +import { DEFAULT_ROUTE, CONFIRM_SEED_ROUTE } from '../../../../ui/app/routes' const LockIcon = props => ( @@ -116,10 +105,7 @@ class BackupPhraseScreen extends Component { {this.renderSecretWordsContainer()}
-
-
Confirm your Secret Backup Phrase
-
- Please select each phrase in order to make sure it is correct. -
-
- {selectedSeeds.map(([_, word], i) => ( - - ))} -
-
- {shuffledSeeds.map((word, i) => { - const isSelected = selectedSeeds - .filter(([index, seed]) => seed === word && index === i) - .length - - return ( - - ) - })} -
- -
-
- ) - } - - renderBack () { - return this.state.page === BackupPhraseScreen.PAGE.CONFIRM - ? ( - { - e.preventDefault() - this.setState({ - page: BackupPhraseScreen.PAGE.SECRET, - }) - }} - href="#" - > - {`< Back`} - - ) - : null - } - - renderContent () { - switch (this.state.page) { - case BackupPhraseScreen.PAGE.CONFIRM: - return this.renderConfirmationScreen() - case BackupPhraseScreen.PAGE.SECRET: - default: - return this.renderSecretScreen() - } - } - render () { return (
@@ -243,9 +136,8 @@ class BackupPhraseScreen extends Component { ? : (
- {this.renderBack()} - {this.renderContent()} + {this.renderSecretScreen()}
) } @@ -261,9 +153,6 @@ export default compose( seedWords, isLoading, address: selectedAddress, - }), - dispatch => ({ - confirmSeedWords: () => dispatch(confirmSeedWords()), }) ) )(BackupPhraseScreen) diff --git a/ui/app/app.js b/ui/app/app.js index 3f6795386..8c3cfee2f 100644 --- a/ui/app/app.js +++ b/ui/app/app.js @@ -9,7 +9,8 @@ const actions = require('./actions') const MascaraCreatePassword = require('../../mascara/src/app/first-time/create-password-screen').default const MascaraBuyEtherScreen = require('../../mascara/src/app/first-time/buy-ether-screen').default const MascaraNoticeScreen = require('../../mascara/src/app/first-time/notice-screen').default -const MascaraBackupPhraseScreen = require('../../mascara/src/app/first-time/backup-phrase-screen').default +const MascaraSeedScreen = require('../../mascara/src/app/first-time/seed-screen').default +const MascaraConfirmSeedScreen = require('../../mascara/src/app/first-time/confirm-seed-screen').default // init const InitializeMenuScreen = require('./first-time/init-menu') const NewKeyChainScreen = require('./new-keychain') @@ -51,6 +52,7 @@ const { UNLOCK_ROUTE, SETTINGS_ROUTE, REVEAL_SEED_ROUTE, + CONFIRM_SEED_ROUTE, RESTORE_VAULT_ROUTE, ADD_TOKEN_ROUTE, IMPORT_ACCOUNT_ROUTE, @@ -90,7 +92,12 @@ class App extends Component { path: REVEAL_SEED_ROUTE, exact, component: RevealSeedPage, - mascaraComponent: MascaraBackupPhraseScreen, + mascaraComponent: MascaraSeedScreen, + }), + h(MetamaskRoute, { + path: CONFIRM_SEED_ROUTE, + exact, + mascaraComponent: MascaraConfirmSeedScreen, }), h(Unauthenticated, { path: UNLOCK_ROUTE, exact, component: UnlockPage }), h(Unauthenticated, { path: SETTINGS_ROUTE, component: Settings }), diff --git a/ui/app/routes.js b/ui/app/routes.js index 72be616a7..de96eb3f5 100644 --- a/ui/app/routes.js +++ b/ui/app/routes.js @@ -2,7 +2,8 @@ const DEFAULT_ROUTE = '/' const UNLOCK_ROUTE = '/unlock' const SETTINGS_ROUTE = '/settings' const INFO_ROUTE = '/settings/info' -const REVEAL_SEED_ROUTE = '/reveal-seed-confirm' +const REVEAL_SEED_ROUTE = '/seed' +const CONFIRM_SEED_ROUTE = '/confirm-seed' const RESTORE_VAULT_ROUTE = '/restore-vault' const ADD_TOKEN_ROUTE = '/add-token' const IMPORT_ACCOUNT_ROUTE = '/import-account' @@ -17,6 +18,7 @@ module.exports = { SETTINGS_ROUTE, INFO_ROUTE, REVEAL_SEED_ROUTE, + CONFIRM_SEED_ROUTE, RESTORE_VAULT_ROUTE, ADD_TOKEN_ROUTE, IMPORT_ACCOUNT_ROUTE,