import React, { useState } from 'react'; import Form from 'react-bootstrap/Form'; import FormControl from 'react-bootstrap/FormControl'; import constants from 'utils/strings/constants'; import { Formik, FormikHelpers } from 'formik'; import * as Yup from 'yup'; import { getOtt } from 'services/userService'; import Card from 'react-bootstrap/Card'; import { setData, LS_KEYS } from 'utils/storage/localStorage'; import { useRouter } from 'next/router'; import SubmitButton from 'components/SubmitButton'; import { Button } from 'react-bootstrap'; import { generateAndSaveIntermediateKeyAttributes, generateKeyAttributes, setSessionKeys, } from 'utils/crypto'; import { setJustSignedUp } from 'utils/storage'; import LogoImg from './LogoImg'; import { logError } from 'utils/sentry'; interface FormValues { email: string; passphrase: string; confirm: string; } interface SignUpProps { login: () => void; } export default function SignUp(props: SignUpProps) { const router = useRouter(); const [acceptTerms, setAcceptTerms] = useState(false); const [loading, setLoading] = useState(false); const registerUser = async ( { email, passphrase, confirm }: FormValues, { setFieldError }: FormikHelpers, ) => { setLoading(true); try { setData(LS_KEYS.USER, { email }); await getOtt(email); } catch (e) { setFieldError('email', `${constants.UNKNOWN_ERROR} ${e.message}`); } try { if (passphrase === confirm) { const { keyAttributes, masterKey } = await generateKeyAttributes(passphrase); setData(LS_KEYS.ORIGINAL_KEY_ATTRIBUTES, keyAttributes); await generateAndSaveIntermediateKeyAttributes( passphrase, keyAttributes, masterKey, ); await setSessionKeys(masterKey); setJustSignedUp(true); router.push('/verify'); } else { setFieldError('confirm', constants.PASSPHRASE_MATCH_ERROR); } } catch (e) { logError(e); setFieldError('passphrase', constants.PASSWORD_GENERATION_FAILED); } setLoading(false); }; return (<> {constants.SIGN_UP} initialValues={{ email: '', passphrase: '', confirm: '', }} validationSchema={Yup.object().shape({ email: Yup.string() .email(constants.EMAIL_ERROR) .required(constants.REQUIRED), passphrase: Yup.string().required( constants.REQUIRED, ), confirm: Yup.string().required(constants.REQUIRED), })} validateOnChange={false} validateOnBlur={false} onSubmit={registerUser} > {({ values, errors, touched, handleChange, handleSubmit, }): JSX.Element => (
{errors.email} {errors.passphrase} {errors.confirm} setAcceptTerms(e.target.checked)} type="checkbox" label={constants.TERMS_AND_CONDITIONS()} />

)} ); }