import React, { useContext, useState } from 'react'; import { ToastUtils } from '../../session/utils'; import { sanitizeSessionUsername } from '../../session/utils/String'; import { Flex } from '../basic/Flex'; import { SessionButton } from '../basic/SessionButton'; import { SessionSpinner } from '../basic/SessionSpinner'; import { SpacerLG } from '../basic/Text'; 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, } 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 function sanitizeDisplayNameOrToast( displayName: string, setDisplayName: (sanitized: string) => void, setDisplayNameError: (error: string | undefined) => void ) { try { const sanitizedName = sanitizeSessionUsername(displayName); const trimName = sanitizedName.trim(); setDisplayName(sanitizedName); setDisplayNameError(!trimName ? window.i18n('displayNameEmpty') : undefined); } catch (e) { setDisplayName(displayName); setDisplayNameError(window.i18n('displayNameTooLong')); ToastUtils.pushToastError('toolong', window.i18n('displayNameTooLong')); } } 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 or if linking a device fails 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, }, setSignInMode ); setIsLoading(false); } }; return (
{signInMode !== SignInMode.Default && ( <> { sanitizeDisplayNameOrToast(name, setDisplayName, setDisplayNameError); }} 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 && }
); };