import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { connect } from 'react-redux'; import { createNewVaultAndRestore, unMarkPasswordForgotten, initializeThreeBox, } from '../../store/actions'; import { DEFAULT_ROUTE } from '../../helpers/constants/routes'; import TextField from '../../components/ui/text-field'; import Button from '../../components/ui/button'; class RestoreVaultPage extends Component { static contextTypes = { t: PropTypes.func, metricsEvent: PropTypes.func, }; static propTypes = { createNewVaultAndRestore: PropTypes.func.isRequired, leaveImportSeedScreenState: PropTypes.func, history: PropTypes.object, isLoading: PropTypes.bool, initializeThreeBox: PropTypes.func, }; state = { seedPhrase: '', showSeedPhrase: false, password: '', confirmPassword: '', seedPhraseError: null, passwordError: null, confirmPasswordError: null, }; parseSeedPhrase = (seedPhrase) => (seedPhrase || '').trim().toLowerCase().match(/\w+/gu)?.join(' ') || ''; handleSeedPhraseChange(seedPhrase) { let seedPhraseError = null; const wordCount = this.parseSeedPhrase(seedPhrase).split(/\s/u).length; if ( seedPhrase && (wordCount % 3 !== 0 || wordCount < 12 || wordCount > 24) ) { seedPhraseError = this.context.t('seedPhraseReq'); } this.setState({ seedPhrase, seedPhraseError }); } handlePasswordChange(password) { const { confirmPassword } = this.state; let confirmPasswordError = null; let passwordError = null; if (password && password.length < 8) { passwordError = this.context.t('passwordNotLongEnough'); } if (confirmPassword && password !== confirmPassword) { confirmPasswordError = this.context.t('passwordsDontMatch'); } this.setState({ password, passwordError, confirmPasswordError }); } handleConfirmPasswordChange(confirmPassword) { const { password } = this.state; let confirmPasswordError = null; if (password !== confirmPassword) { confirmPasswordError = this.context.t('passwordsDontMatch'); } this.setState({ confirmPassword, confirmPasswordError }); } onClick = () => { const { password, seedPhrase } = this.state; const { // eslint-disable-next-line no-shadow createNewVaultAndRestore, leaveImportSeedScreenState, history, // eslint-disable-next-line no-shadow initializeThreeBox, } = this.props; leaveImportSeedScreenState(); createNewVaultAndRestore(password, this.parseSeedPhrase(seedPhrase)).then( () => { this.context.metricsEvent({ eventOpts: { category: 'Retention', action: 'userEntersSeedPhrase', name: 'onboardingRestoredVault', }, }); initializeThreeBox(); history.push(DEFAULT_ROUTE); }, ); }; hasError() { const { passwordError, confirmPasswordError, seedPhraseError } = this.state; return passwordError || confirmPasswordError || seedPhraseError; } toggleShowSeedPhrase = () => { this.setState(({ showSeedPhrase }) => ({ showSeedPhrase: !showSeedPhrase, })); }; render() { const { seedPhrase, showSeedPhrase, password, confirmPassword, seedPhraseError, passwordError, confirmPasswordError, } = this.state; const { t } = this.context; const { isLoading } = this.props; const disabled = !seedPhrase || !password || !confirmPassword || isLoading || this.hasError(); return (
{ e.preventDefault(); this.props.leaveImportSeedScreenState(); this.props.history.goBack(); }} href="#" > {`< Back`}
{this.context.t('restoreAccountWithSeed')}
{this.context.t('secretPhrase')}
{showSeedPhrase ? (