import React, { useState, useMemo } from 'react'; import PropTypes from 'prop-types'; import { useHistory } from 'react-router-dom'; import zxcvbn from 'zxcvbn'; import { useSelector } from 'react-redux'; import { useNewMetricEvent } from '../../../hooks/useMetricEvent'; import { useI18nContext } from '../../../hooks/useI18nContext'; import Button from '../../../components/ui/button'; import Typography from '../../../components/ui/typography'; import { TEXT_ALIGN, TYPOGRAPHY, JUSTIFY_CONTENT, FONT_WEIGHT, ALIGN_ITEMS, } from '../../../helpers/constants/design-system'; import { ONBOARDING_COMPLETION_ROUTE, ONBOARDING_SECURE_YOUR_WALLET_ROUTE, } from '../../../helpers/constants/routes'; import FormField from '../../../components/ui/form-field'; import Box from '../../../components/ui/box'; import CheckBox from '../../../components/ui/check-box'; import { ThreeStepProgressBar, threeStepStages, TwoStepProgressBar, twoStepStages, } from '../../../components/app/step-progress-bar'; import ZENDESK_URLS from '../../../helpers/constants/zendesk-url'; import { getFirstTimeFlowType } from '../../../selectors'; import { FIRST_TIME_FLOW_TYPES } from '../../../helpers/constants/onboarding'; export default function CreatePassword({ createNewAccount, importWithRecoveryPhrase, secretRecoveryPhrase, }) { const t = useI18nContext(); const [confirmPassword, setConfirmPassword] = useState(''); const [password, setPassword] = useState(''); const [passwordError, setPasswordError] = useState(''); const [passwordStrength, setPasswordStrength] = useState(''); const [passwordStrengthText, setPasswordStrengthText] = useState(''); const [confirmPasswordError, setConfirmPasswordError] = useState(''); const [termsChecked, setTermsChecked] = useState(false); const [showPassword, setShowPassword] = useState(false); const history = useHistory(); const firstTimeFlowType = useSelector(getFirstTimeFlowType); const submitPasswordEvent = useNewMetricEvent({ event: 'Submit Password', category: 'Onboarding', }); const isValid = useMemo(() => { if (!password || !confirmPassword || password !== confirmPassword) { return false; } if (password.length < 8) { return false; } return !passwordError && !confirmPasswordError; }, [password, confirmPassword, passwordError, confirmPasswordError]); const getPasswordStrengthLabel = (score, translation) => { if (score >= 4) { return { className: 'create-password__strong', text: translation('strong'), description: '', }; } else if (score === 3) { return { className: 'create-password__average', text: translation('average'), description: t('passwordStrengthDescription'), }; } return { className: 'create-password__weak', text: translation('weak'), description: t('passwordStrengthDescription'), }; }; const handlePasswordChange = (passwordInput) => { let confirmError = ''; const passwordEvaluation = zxcvbn(passwordInput); const passwordStrengthLabel = getPasswordStrengthLabel( passwordEvaluation.score, t, ); const passwordStrengthDescription = passwordStrengthLabel.description; const passwordStrengthInput = t('passwordStrength', [ {passwordStrengthLabel.text} , ]); if (confirmPassword && passwordInput !== confirmPassword) { confirmError = t('passwordsDontMatch'); } setPassword(passwordInput); setPasswordStrength(passwordStrengthInput); setPasswordStrengthText(passwordStrengthDescription); setConfirmPasswordError(confirmError); }; const handleConfirmPasswordChange = (confirmPasswordInput) => { let error = ''; if (password !== confirmPasswordInput) { error = t('passwordsDontMatch'); } setConfirmPassword(confirmPasswordInput); setConfirmPasswordError(error); }; const handleCreate = async (event) => { event.preventDefault(); if (!isValid) { return; } // If secretRecoveryPhrase is defined we are in import wallet flow if ( secretRecoveryPhrase && firstTimeFlowType === FIRST_TIME_FLOW_TYPES.IMPORT ) { await importWithRecoveryPhrase(password, secretRecoveryPhrase); history.push(ONBOARDING_COMPLETION_ROUTE); } else { // Otherwise we are in create new wallet flow try { if (createNewAccount) { await createNewAccount(password); } submitPasswordEvent(); history.push(ONBOARDING_SECURE_YOUR_WALLET_ROUTE); } catch (error) { setPasswordError(error.message); } } }; return (
{secretRecoveryPhrase && firstTimeFlowType === FIRST_TIME_FLOW_TYPES.IMPORT ? ( ) : ( )} {t('createPassword')} {t('passwordSetupDetails')}
{ e.preventDefault(); setShowPassword(!showPassword); }} > {showPassword ? t('hide') : t('show')} } />
) } /> setTermsChecked(!termsChecked)} checked={termsChecked} /> {t('passwordTermsWarning', [ e.stopPropagation()} key="create-password__link-text" href={ZENDESK_URLS.PASSWORD_ARTICLE} target="_blank" rel="noopener noreferrer" > {t('learnMoreUpperCase')} , ])} ); } CreatePassword.propTypes = { createNewAccount: PropTypes.func, importWithRecoveryPhrase: PropTypes.func, secretRecoveryPhrase: PropTypes.string, };