import React, { PureComponent } from 'react' import PropTypes from 'prop-types' import classnames from 'classnames' import Button from '../../../../components/ui/button' import { INITIALIZE_END_OF_FLOW_ROUTE, INITIALIZE_SEED_PHRASE_ROUTE, } from '../../../../helpers/constants/routes' import { exportAsFile } from '../../../../helpers/utils/util' import DraggableSeed from './draggable-seed.component' const EMPTY_SEEDS = Array(12).fill(null) export default class ConfirmSeedPhrase extends PureComponent { static contextTypes = { metricsEvent: PropTypes.func, t: PropTypes.func, } static defaultProps = { seedPhrase: '', } static propTypes = { history: PropTypes.object, seedPhrase: PropTypes.string, initializeThreeBox: PropTypes.func, setSeedPhraseBackedUp: PropTypes.func, completeOnboarding: PropTypes.func, } state = { selectedSeedIndices: [], sortedSeedWords: [], pendingSeedIndices: [], draggingSeedIndex: -1, hoveringIndex: -1, } componentDidMount () { const { seedPhrase = '' } = this.props const sortedSeedWords = (seedPhrase.split(' ') || []).sort() this.setState({ sortedSeedWords }) } setDraggingSeedIndex = (draggingSeedIndex) => this.setState({ draggingSeedIndex }) setHoveringIndex = (hoveringIndex) => this.setState({ hoveringIndex }) onDrop = (targetIndex) => { const { selectedSeedIndices, draggingSeedIndex, } = this.state const indices = insert(selectedSeedIndices, draggingSeedIndex, targetIndex, true) this.setState({ selectedSeedIndices: indices, pendingSeedIndices: indices, draggingSeedIndex: -1, hoveringIndex: -1, }) } handleExport = () => { exportAsFile('', this.props.seedPhrase, 'text/plain') } setOnboardingCompleted = async () => { await this.props.completeOnboarding() } handleSubmit = async () => { const { history, setSeedPhraseBackedUp, initializeThreeBox, } = this.props if (!this.isValid()) { return } try { this.context.metricsEvent({ eventOpts: { category: 'Onboarding', action: 'Seed Phrase Setup', name: 'Verify Complete', }, }) setSeedPhraseBackedUp(true).then(async () => { initializeThreeBox() this.setOnboardingCompleted() history.push(INITIALIZE_END_OF_FLOW_ROUTE) }) } catch (error) { console.error(error.message) } } handleSelectSeedWord = (index) => { this.setState({ selectedSeedIndices: [...this.state.selectedSeedIndices, index], pendingSeedIndices: [...this.state.pendingSeedIndices, index], }) } handleDeselectSeedWord = (index) => { this.setState({ selectedSeedIndices: this.state.selectedSeedIndices.filter((i) => index !== i), pendingSeedIndices: this.state.pendingSeedIndices.filter((i) => index !== i), }) } isValid () { const { seedPhrase } = this.props const { selectedSeedIndices, sortedSeedWords } = this.state const selectedSeedWords = selectedSeedIndices.map((i) => sortedSeedWords[i]) return seedPhrase === selectedSeedWords.join(' ') } render () { const { t } = this.context const { history } = this.props const { selectedSeedIndices, sortedSeedWords, draggingSeedIndex, } = this.state return (