import { useMutation, useQuery } from '@apollo/react-hooks' import { makeStyles } from '@material-ui/core/styles' import gql from 'graphql-tag' import QRCode from 'qrcode.react' import React, { useState } from 'react' import { ActionButton, Button } from 'src/components/buttons' import { CodeInput } from 'src/components/inputs/base' import { Label2, P } from 'src/components/typography' import { primaryColor } from 'src/styling/variables' import styles from './Login.styles' const SETUP_2FA = gql` mutation setup2FA( $username: String! $password: String! $secret: String! $codeConfirmation: String! ) { setup2FA( username: $username password: $password secret: $secret codeConfirmation: $codeConfirmation ) } ` const GET_2FA_SECRET = gql` query get2FASecret($username: String!, $password: String!) { get2FASecret(username: $username, password: $password) { secret otpauth } } ` const useStyles = makeStyles(styles) const Setup2FAState = ({ clientField, passwordField, STATES, handleLoginState }) => { const classes = useStyles() const [secret, setSecret] = useState(null) const [otpauth, setOtpauth] = useState(null) const [isShowing, setShowing] = useState(false) const [invalidToken, setInvalidToken] = useState(false) const [twoFAConfirmation, setTwoFAConfirmation] = useState('') const handle2FAChange = value => { setTwoFAConfirmation(value) setInvalidToken(false) } const { error: queryError } = useQuery(GET_2FA_SECRET, { variables: { username: clientField, password: passwordField }, onCompleted: ({ get2FASecret }) => { setSecret(get2FASecret.secret) setOtpauth(get2FASecret.otpauth) } }) const [setup2FA, { error: mutationError }] = useMutation(SETUP_2FA, { onCompleted: ({ setup2FA: success }) => { success ? handleLoginState(STATES.LOGIN) : setInvalidToken(true) } }) const getErrorMsg = () => { if (mutationError || queryError) return 'Internal server error' if (twoFAConfirmation.length !== 6 && invalidToken) return 'The code should have 6 characters!' if (invalidToken) return 'Code is invalid. Please try again.' return null } return ( <> {secret && otpauth ? ( <>
{getErrorMsg()}
)}