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
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 && (
<>
{
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 && }
);
};