import React, { useContext, useState } from 'react'; import { Flex } from '../../basic/Flex'; import { SpacerLG } from '../../basic/Text'; import { SessionButton, SessionButtonColor, SessionButtonType } from '../SessionButton'; import { SessionSpinner } from '../SessionSpinner'; import { RegistrationContext, RegistrationPhase, signInWithLinking, signInWithRecovery, } from './RegistrationStages'; import { RegistrationUserDetails } from './RegistrationUserDetails'; import { GoBackMainMenuButton } from './SignUpTab'; import { TermsAndConditions } from './TermsAndConditions'; export enum SignInMode { Default, UsingRecoveryPhrase, LinkDevice, } // tslint:disable: use-simple-attributes // tslint:disable: react-unused-props-and-state const LinkDeviceButton = (props: { onLinkDeviceButtonClicked: () => any }) => { return ( ); }; const RestoreUsingRecoveryPhraseButton = (props: { onRecoveryButtonClicked: () => any }) => { return ( ); }; const ContinueYourSessionButton = (props: { handleContinueYourSessionClick: () => any; disabled: boolean; }) => { return ( ); }; const SignInContinueButton = (props: { signInMode: SignInMode; disabled: boolean; handleContinueYourSessionClick: () => any; }) => { if (props.signInMode === SignInMode.Default) { return null; } return ( ); }; const SignInButtons = (props: { signInMode: SignInMode; onRecoveryButtonClicked: () => any; onLinkDeviceButtonClicked: () => any; }) => { if (props.signInMode !== SignInMode.Default) { return null; } return (
); }; export const SignInTab = () => { const { setRegistrationPhase, signInMode, setSignInMode } = useContext(RegistrationContext); const [recoveryPhrase, setRecoveryPhrase] = useState(''); const [recoveryPhraseError, setRecoveryPhraseError] = useState(undefined as string | undefined); const [displayName, setDisplayName] = useState(''); const [displayNameError, setDisplayNameError] = useState(''); const [loading, setIsLoading] = useState(false); const isRecovery = signInMode === SignInMode.UsingRecoveryPhrase; const isLinking = signInMode === SignInMode.LinkDevice; const showTermsAndConditions = signInMode !== SignInMode.Default; // show display name input only if we are trying to recover from seed. // We don't need a display name when we link a device, as the display name // from the configuration message will be used. const showDisplayNameField = isRecovery; // Display name is required only on isRecoveryMode const displayNameOK = (isRecovery && !displayNameError && !!displayName) || isLinking; // Seed is mandatory no matter which mode const seedOK = recoveryPhrase && !recoveryPhraseError; const activateContinueButton = seedOK && displayNameOK && !loading; const continueYourSession = async () => { if (isRecovery) { await signInWithRecovery({ displayName, userRecoveryPhrase: recoveryPhrase, }); } else if (isLinking) { setIsLoading(true); await signInWithLinking({ userRecoveryPhrase: recoveryPhrase, }); setIsLoading(false); } }; return (
{signInMode !== SignInMode.Default && ( <> { const sanitizedName = name.replace(window.displayNameRegex, ''); const trimName = sanitizedName.trim(); setDisplayName(sanitizedName); setDisplayNameError(!trimName ? window.i18n('displayNameEmpty') : undefined); }} onSeedChanged={(seed: string) => { setRecoveryPhrase(seed); setRecoveryPhraseError(!seed ? window.i18n('recoveryPhraseEmpty') : undefined); }} recoveryPhrase={recoveryPhrase} stealAutoFocus={true} /> )} { setRegistrationPhase(RegistrationPhase.SignIn); setSignInMode(SignInMode.UsingRecoveryPhrase); setRecoveryPhrase(''); setDisplayName(''); setIsLoading(false); }} onLinkDeviceButtonClicked={() => { setRegistrationPhase(RegistrationPhase.SignIn); setSignInMode(SignInMode.LinkDevice); setRecoveryPhrase(''); setDisplayName(''); setIsLoading(false); }} /> {loading && ( )} {showTermsAndConditions && }
); };