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 (