feat: rename onboarding stages for clarity

also comment on what changes need to be made within the different stages
pull/3056/head
William Grant 2 years ago
parent a9fcb51021
commit 090ddc07a9

@ -11,12 +11,13 @@ import { TaskTimedOutError } from '../../session/utils/Promise';
import { fromHex } from '../../session/utils/String'; import { fromHex } from '../../session/utils/String';
import { trigger } from '../../shims/events'; import { trigger } from '../../shims/events';
import { import {
Onboarding,
setGeneratedRecoveryPhrase, setGeneratedRecoveryPhrase,
setHexGeneratedPubKey, setHexGeneratedPubKey,
} from '../../state/onboarding/ducks/registration'; } from '../../state/onboarding/ducks/registration';
import { import {
useRegGeneratedRecoveryPhrase, useOnboardGeneratedRecoveryPhrase,
useRegRegistrationPhase, useOnboardStep,
} from '../../state/onboarding/selectors/registration'; } from '../../state/onboarding/selectors/registration';
import { import {
generateMnemonic, generateMnemonic,
@ -171,15 +172,9 @@ export async function signInWithLinking(signInDetails: { userRecoveryPhrase: str
} }
} }
export enum RegistrationPhase {
Start,
SignIn,
SignUp,
}
export const RegistrationStages = () => { export const RegistrationStages = () => {
const generatedRecoveryPhrase = useRegGeneratedRecoveryPhrase(); const generatedRecoveryPhrase = useOnboardGeneratedRecoveryPhrase();
const registrationPhase = useRegRegistrationPhase(); const step = useOnboardStep();
const dispatch = useDispatch(); const dispatch = useDispatch();
@ -212,10 +207,8 @@ export const RegistrationStages = () => {
<> <>
<ModalContainer /> <ModalContainer />
<StyledRegistrationContainer container={true} flexDirection="column"> <StyledRegistrationContainer container={true} flexDirection="column">
{(registrationPhase === RegistrationPhase.Start || {(step === Onboarding.Start || step === Onboarding.CreateAccount) && <SignUpTab />}
registrationPhase === RegistrationPhase.SignUp) && <SignUpTab />} {(step === Onboarding.Start || step === Onboarding.RestoreAccount) && <SignInTab />}
{(registrationPhase === RegistrationPhase.Start ||
registrationPhase === RegistrationPhase.SignIn) && <SignInTab />}
</StyledRegistrationContainer> </StyledRegistrationContainer>
</> </>
); );

@ -1,12 +1,13 @@
import { useDispatch } from 'react-redux'; import { useDispatch } from 'react-redux';
import { import {
setRegistrationPhase, AccountCreation,
setSignInMode, AccountRestoration,
setSignUpMode, Onboarding,
setAccountCreationStep,
setAccountRestorationStep,
setOnboardingStep,
} from '../../../state/onboarding/ducks/registration'; } from '../../../state/onboarding/ducks/registration';
import { SessionIconButton } from '../../icon'; import { SessionIconButton } from '../../icon';
import { RegistrationPhase } from '../RegistrationStages';
import { SignInMode, SignUpMode } from '../stages';
export const BackButton = () => { export const BackButton = () => {
const dispatch = useDispatch(); const dispatch = useDispatch();
@ -17,9 +18,9 @@ export const BackButton = () => {
iconType="arrow" iconType="arrow"
iconPadding="5px" iconPadding="5px"
onClick={() => { onClick={() => {
dispatch(setRegistrationPhase(RegistrationPhase.Start)); dispatch(setOnboardingStep(Onboarding.Start));
dispatch(setSignInMode(SignInMode.Default)); dispatch(setAccountRestorationStep(AccountRestoration.Start));
dispatch(setSignUpMode(SignUpMode.Default)); dispatch(setAccountCreationStep(AccountCreation.Start));
}} }}
/> />
); );

@ -2,23 +2,22 @@ import { useState } from 'react';
import { useDispatch } from 'react-redux'; import { useDispatch } from 'react-redux';
import { ToastUtils } from '../../../session/utils'; import { ToastUtils } from '../../../session/utils';
import { sanitizeSessionUsername } from '../../../session/utils/String'; import { sanitizeSessionUsername } from '../../../session/utils/String';
import { setRegistrationPhase, setSignInMode } from '../../../state/onboarding/ducks/registration'; import {
import { useRegSignInMode } from '../../../state/onboarding/selectors/registration'; AccountRestoration,
Onboarding,
setAccountRestorationStep,
setOnboardingStep,
} from '../../../state/onboarding/ducks/registration';
import { useOnboardAccountRestorationStep } from '../../../state/onboarding/selectors/registration';
import { Flex } from '../../basic/Flex'; import { Flex } from '../../basic/Flex';
import { SessionButton } from '../../basic/SessionButton'; import { SessionButton } from '../../basic/SessionButton';
import { SpacerLG } from '../../basic/Text'; import { SpacerLG } from '../../basic/Text';
import { SessionSpinner } from '../../loading'; import { SessionSpinner } from '../../loading';
import { RegistrationPhase, signInWithLinking, signInWithRecovery } from '../RegistrationStages'; import { signInWithLinking, signInWithRecovery } from '../RegistrationStages';
import { RegistrationUserDetails } from '../RegistrationUserDetails'; import { RegistrationUserDetails } from '../RegistrationUserDetails';
import { TermsAndConditions } from '../TermsAndConditions'; import { TermsAndConditions } from '../TermsAndConditions';
import { BackButton } from '../components'; import { BackButton } from '../components';
export enum SignInMode {
Default,
UsingRecoveryPhrase,
LinkDevice,
}
const LinkDeviceButton = (props: { onLinkDeviceButtonClicked: () => any }) => { const LinkDeviceButton = (props: { onLinkDeviceButtonClicked: () => any }) => {
return ( return (
<SessionButton <SessionButton
@ -54,11 +53,11 @@ const ContinueYourSessionButton = (props: {
}; };
const SignInContinueButton = (props: { const SignInContinueButton = (props: {
signInMode: SignInMode; accountRestorationStep: AccountRestoration;
disabled: boolean; disabled: boolean;
handleContinueYourSessionClick: () => any; handleContinueYourSessionClick: () => any;
}) => { }) => {
if (props.signInMode === SignInMode.Default) { if (props.accountRestorationStep === AccountRestoration.Start) {
return null; return null;
} }
return ( return (
@ -70,11 +69,11 @@ const SignInContinueButton = (props: {
}; };
const SignInButtons = (props: { const SignInButtons = (props: {
signInMode: SignInMode; accountRestorationStep: AccountRestoration;
onRecoveryButtonClicked: () => any; onRecoveryButtonClicked: () => any;
onLinkDeviceButtonClicked: () => any; onLinkDeviceButtonClicked: () => any;
}) => { }) => {
if (props.signInMode !== SignInMode.Default) { if (props.accountRestorationStep !== AccountRestoration.Start) {
return null; return null;
} }
return ( return (
@ -104,7 +103,7 @@ export function sanitizeDisplayNameOrToast(
} }
export const SignInTab = () => { export const SignInTab = () => {
const signInMode = useRegSignInMode(); const step = useOnboardAccountRestorationStep();
const dispatch = useDispatch(); const dispatch = useDispatch();
@ -114,9 +113,9 @@ export const SignInTab = () => {
const [displayNameError, setDisplayNameError] = useState<string | undefined>(''); const [displayNameError, setDisplayNameError] = useState<string | undefined>('');
const [loading, setIsLoading] = useState(false); const [loading, setIsLoading] = useState(false);
const isRecovery = signInMode === SignInMode.UsingRecoveryPhrase; const isRecovery = step === AccountRestoration.RecoveryPassword;
const isLinking = signInMode === SignInMode.LinkDevice; const isLinking = step === AccountRestoration.LinkDevice;
const showTermsAndConditions = signInMode !== SignInMode.Default; const showTermsAndConditions = step !== AccountRestoration.Start;
// show display name input only if we are trying to recover from seed. // 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 // We don't need a display name when we link a device, as the display name
@ -148,7 +147,7 @@ export const SignInTab = () => {
return ( return (
<div className="session-registration__content"> <div className="session-registration__content">
{signInMode !== SignInMode.Default && ( {step !== AccountRestoration.Start && (
<> <>
<BackButton /> <BackButton />
<SpacerLG /> <SpacerLG />
@ -171,24 +170,24 @@ export const SignInTab = () => {
)} )}
<SignInButtons <SignInButtons
signInMode={signInMode} accountRestorationStep={step}
onRecoveryButtonClicked={() => { onRecoveryButtonClicked={() => {
dispatch(setRegistrationPhase(RegistrationPhase.SignIn)); dispatch(setOnboardingStep(Onboarding.RestoreAccount));
dispatch(setSignInMode(SignInMode.UsingRecoveryPhrase)); dispatch(setAccountRestorationStep(AccountRestoration.RecoveryPassword));
setRecoveryPhrase(''); setRecoveryPhrase('');
setDisplayName(''); setDisplayName('');
setIsLoading(false); setIsLoading(false);
}} }}
onLinkDeviceButtonClicked={() => { onLinkDeviceButtonClicked={() => {
dispatch(setRegistrationPhase(RegistrationPhase.SignIn)); dispatch(setOnboardingStep(Onboarding.RestoreAccount));
dispatch(setSignInMode(SignInMode.LinkDevice)); dispatch(setAccountRestorationStep(AccountRestoration.LinkDevice));
setRecoveryPhrase(''); setRecoveryPhrase('');
setDisplayName(''); setDisplayName('');
setIsLoading(false); setIsLoading(false);
}} }}
/> />
<SignInContinueButton <SignInContinueButton
signInMode={signInMode} accountRestorationStep={step}
handleContinueYourSessionClick={continueYourSession} handleContinueYourSessionClick={continueYourSession}
disabled={!activateContinueButton} disabled={!activateContinueButton}
/> />

@ -1,17 +1,22 @@
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import { useDispatch } from 'react-redux'; import { useDispatch } from 'react-redux';
import styled from 'styled-components'; import styled from 'styled-components';
import { setRegistrationPhase, setSignUpMode } from '../../../state/onboarding/ducks/registration';
import { import {
useRegGeneratedRecoveryPhrase, AccountCreation,
useRegHexGeneratedPubKey, Onboarding,
useRegSignUpMode, setAccountCreationStep,
setOnboardingStep,
} from '../../../state/onboarding/ducks/registration';
import {
useOnboardAccountCreationStep,
useOnboardGeneratedRecoveryPhrase,
useOnboardHexGeneratedPubKey,
} from '../../../state/onboarding/selectors/registration'; } from '../../../state/onboarding/selectors/registration';
import { Noop } from '../../../types/Util'; import { Noop } from '../../../types/Util';
import { Flex } from '../../basic/Flex'; import { Flex } from '../../basic/Flex';
import { SessionButton } from '../../basic/SessionButton'; import { SessionButton } from '../../basic/SessionButton';
import { SessionIdEditable } from '../../basic/SessionIdEditable'; import { SessionIdEditable } from '../../basic/SessionIdEditable';
import { RegistrationPhase, signUp } from '../RegistrationStages'; import { signUp } from '../RegistrationStages';
import { RegistrationUserDetails } from '../RegistrationUserDetails'; import { RegistrationUserDetails } from '../RegistrationUserDetails';
import { TermsAndConditions } from '../TermsAndConditions'; import { TermsAndConditions } from '../TermsAndConditions';
import { BackButton } from '../components'; import { BackButton } from '../components';
@ -22,12 +27,6 @@ const StyledContainer = styled.div`
padding-top: 20px; padding-top: 20px;
`; `;
export enum SignUpMode {
Default,
SessionIDShown,
EnterDetails,
}
const CreateSessionIdButton = ({ createSessionID }: { createSessionID: any }) => { const CreateSessionIdButton = ({ createSessionID }: { createSessionID: any }) => {
return <SessionButton onClick={createSessionID} text={window.i18n('createSessionID')} />; return <SessionButton onClick={createSessionID} text={window.i18n('createSessionID')} />;
}; };
@ -63,9 +62,9 @@ const SignUpSessionIDShown = (props: { continueSignUp: Noop }) => {
}; };
export const SignUpTab = () => { export const SignUpTab = () => {
const signUpMode = useRegSignUpMode(); const step = useOnboardAccountCreationStep();
const generatedRecoveryPhrase = useRegGeneratedRecoveryPhrase(); const generatedRecoveryPhrase = useOnboardGeneratedRecoveryPhrase();
const hexGeneratedPubKey = useRegHexGeneratedPubKey(); const hexGeneratedPubKey = useOnboardHexGeneratedPubKey();
const dispatch = useDispatch(); const dispatch = useDispatch();
@ -73,27 +72,27 @@ export const SignUpTab = () => {
const [displayNameError, setDisplayNameError] = useState<undefined | string>(''); const [displayNameError, setDisplayNameError] = useState<undefined | string>('');
useEffect(() => { useEffect(() => {
if (signUpMode === SignUpMode.SessionIDShown) { if (step === AccountCreation.SessionIDShown) {
window.Session.setNewSessionID(hexGeneratedPubKey); window.Session.setNewSessionID(hexGeneratedPubKey);
} }
}, [signUpMode, hexGeneratedPubKey]); }, [step, hexGeneratedPubKey]);
if (signUpMode === SignUpMode.Default) { if (step === AccountCreation.Start) {
return ( return (
<SignUpDefault <SignUpDefault
createSessionID={() => { createSessionID={() => {
dispatch(setSignUpMode(SignUpMode.SessionIDShown)); dispatch(setAccountCreationStep(AccountCreation.SessionIDShown));
dispatch(setRegistrationPhase(RegistrationPhase.SignUp)); dispatch(setOnboardingStep(Onboarding.CreateAccount));
}} }}
/> />
); );
} }
if (signUpMode === SignUpMode.SessionIDShown) { if (step === AccountCreation.SessionIDShown) {
return ( return (
<SignUpSessionIDShown <SignUpSessionIDShown
continueSignUp={() => { continueSignUp={() => {
dispatch(setSignUpMode(SignUpMode.EnterDetails)); dispatch(setAccountCreationStep(AccountCreation.DisplayName));
}} }}
/> />
); );

@ -1,4 +1,4 @@
import { SignInMode, SignInTab } from './SignInTab'; import { SignInTab } from './SignInTab';
import { SignUpMode, SignUpTab } from './SignUpTab'; import { SignUpTab } from './SignUpTab';
export { SignInMode, SignInTab, SignUpMode, SignUpTab }; export { SignInTab, SignUpTab };

@ -1,27 +1,54 @@
import { PayloadAction, createSlice } from '@reduxjs/toolkit'; import { PayloadAction, createSlice } from '@reduxjs/toolkit';
import { SignInMode } from '../../../components/registration/stages/SignInTab';
import { SignUpMode } from '../../../components/registration/stages/SignUpTab';
export enum RegistrationPhase { export enum Onboarding {
/* starting screen */
Start, Start,
SignIn, /* uses AccountCreation internally */
SignUp, CreateAccount,
/* uses AccountRestoration internally */
RestoreAccount,
} }
export type RegistrationState = { export enum AccountCreation {
/* TODO to be removed - current starting screen */
Start,
/* TODO to be removed */
SessionIDShown,
/* starting screen */
DisplayName,
/* show conversation screen */
Complete,
}
export enum AccountRestoration {
/* TODO to be removed - current starting screen */
Start,
/* starting screen */
RecoveryPassword,
/* fetching account details */
Loading,
/* we failed to fetch a display name in time so we choose a new one */
DisplayName,
/* show conversation screen */
Complete,
/* TODO to be removed */
LinkDevice,
}
export type OnboardingState = {
generatedRecoveryPhrase: string; generatedRecoveryPhrase: string;
hexGeneratedPubKey: string; hexGeneratedPubKey: string;
registrationPhase: RegistrationPhase; step: Onboarding;
signUpMode: SignUpMode; accountCreationStep: AccountCreation;
signInMode: SignInMode; accountRestorationStep: AccountRestoration;
}; };
const initialState: RegistrationState = { const initialState: OnboardingState = {
generatedRecoveryPhrase: '', generatedRecoveryPhrase: '',
hexGeneratedPubKey: '', hexGeneratedPubKey: '',
registrationPhase: RegistrationPhase.Start, step: Onboarding.Start,
signInMode: SignInMode.Default, accountRestorationStep: AccountRestoration.Start,
signUpMode: SignUpMode.Default, accountCreationStep: AccountCreation.Start,
}; };
export const registrationSlice = createSlice({ export const registrationSlice = createSlice({
@ -34,14 +61,14 @@ export const registrationSlice = createSlice({
setHexGeneratedPubKey(state, action: PayloadAction<string>) { setHexGeneratedPubKey(state, action: PayloadAction<string>) {
return { ...state, hexGeneratedPubKey: action.payload }; return { ...state, hexGeneratedPubKey: action.payload };
}, },
setRegistrationPhase(state, action: PayloadAction<RegistrationPhase>) { setOnboardingStep(state, action: PayloadAction<Onboarding>) {
return { ...state, registrationPhase: action.payload }; return { ...state, step: action.payload };
}, },
setSignUpMode(state, action: PayloadAction<SignUpMode>) { setAccountCreationStep(state, action: PayloadAction<AccountCreation>) {
return { ...state, signUpMode: action.payload }; return { ...state, accountCreationStep: action.payload };
}, },
setSignInMode(state, action: PayloadAction<SignInMode>) { setAccountRestorationStep(state, action: PayloadAction<AccountRestoration>) {
return { ...state, signInMode: action.payload }; return { ...state, accountRestorationStep: action.payload };
}, },
}, },
}); });
@ -49,8 +76,8 @@ export const registrationSlice = createSlice({
export const { export const {
setGeneratedRecoveryPhrase, setGeneratedRecoveryPhrase,
setHexGeneratedPubKey, setHexGeneratedPubKey,
setRegistrationPhase, setOnboardingStep,
setSignUpMode, setAccountCreationStep,
setSignInMode, setAccountRestorationStep,
} = registrationSlice.actions; } = registrationSlice.actions;
export default registrationSlice.reducer; export default registrationSlice.reducer;

@ -1,58 +1,62 @@
import { createSelector } from '@reduxjs/toolkit'; import { createSelector } from '@reduxjs/toolkit';
import { useSelector } from 'react-redux'; import { useSelector } from 'react-redux';
import { SignInMode, SignUpMode } from '../../../components/registration/stages'; import {
import { RegistrationPhase, RegistrationState } from '../ducks/registration'; AccountCreation,
AccountRestoration,
Onboarding,
OnboardingState,
} from '../ducks/registration';
import { OnboardingStoreState } from '../store'; import { OnboardingStoreState } from '../store';
// #region Getters // #region Getters
const getRegistration = (state: OnboardingStoreState): RegistrationState => { const getRegistration = (state: OnboardingStoreState): OnboardingState => {
return state.registration; return state.registration;
}; };
const getGeneratedRecoveryPhrase = createSelector( const getGeneratedRecoveryPhrase = createSelector(
getRegistration, getRegistration,
(state: RegistrationState): string => state.generatedRecoveryPhrase (state: OnboardingState): string => state.generatedRecoveryPhrase
); );
const getHexGeneratedPubKey = createSelector( const getHexGeneratedPubKey = createSelector(
getRegistration, getRegistration,
(state: RegistrationState): string => state.hexGeneratedPubKey (state: OnboardingState): string => state.hexGeneratedPubKey
); );
const getRegistrationPhase = createSelector( const getOnboardingStep = createSelector(
getRegistration, getRegistration,
(state: RegistrationState): RegistrationPhase => state.registrationPhase (state: OnboardingState): Onboarding => state.step
); );
const getSignUpMode = createSelector( const getAccountCreationStep = createSelector(
getRegistration, getRegistration,
(state: RegistrationState): SignUpMode => state.signUpMode (state: OnboardingState): AccountCreation => state.accountCreationStep
); );
const getSignInMode = createSelector( const getAccountRestorationStep = createSelector(
getRegistration, getRegistration,
(state: RegistrationState): SignInMode => state.signInMode (state: OnboardingState): AccountRestoration => state.accountRestorationStep
); );
// #endregion // #endregion
// #region Hooks // #region Hooks
export const useRegGeneratedRecoveryPhrase = () => { export const useOnboardGeneratedRecoveryPhrase = () => {
return useSelector(getGeneratedRecoveryPhrase); return useSelector(getGeneratedRecoveryPhrase);
}; };
export const useRegHexGeneratedPubKey = () => { export const useOnboardHexGeneratedPubKey = () => {
return useSelector(getHexGeneratedPubKey); return useSelector(getHexGeneratedPubKey);
}; };
export const useRegRegistrationPhase = () => { export const useOnboardStep = () => {
return useSelector(getRegistrationPhase); return useSelector(getOnboardingStep);
}; };
export const useRegSignUpMode = () => { export const useOnboardAccountCreationStep = () => {
return useSelector(getSignUpMode); return useSelector(getAccountCreationStep);
}; };
export const useRegSignInMode = () => { export const useOnboardAccountRestorationStep = () => {
return useSelector(getSignInMode); return useSelector(getAccountRestorationStep);
}; };
// #endregion // #endregion

Loading…
Cancel
Save