From 264340a45d1f29e67c2b5e51caf060854e3ab16a Mon Sep 17 00:00:00 2001 From: William Grant Date: Thu, 22 Feb 2024 16:47:41 +1100 Subject: [PATCH] feat: setup registration slice --- ts/state/onboarding/ducks/registration.ts | 56 ++++++++++++++++++ ts/state/onboarding/selectors/registration.ts | 58 +++++++++++++++++++ ts/state/onboarding/store.ts | 3 +- 3 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 ts/state/onboarding/ducks/registration.ts create mode 100644 ts/state/onboarding/selectors/registration.ts diff --git a/ts/state/onboarding/ducks/registration.ts b/ts/state/onboarding/ducks/registration.ts new file mode 100644 index 000000000..eb3b7da4e --- /dev/null +++ b/ts/state/onboarding/ducks/registration.ts @@ -0,0 +1,56 @@ +import { PayloadAction, createSlice } from '@reduxjs/toolkit'; +import { SignInMode } from '../../../components/registration/stages/SignInTab'; +import { SignUpMode } from '../../../components/registration/stages/SignUpTab'; + +export enum RegistrationPhase { + Start, + SignIn, + SignUp, +} + +export type RegistrationState = { + generatedRecoveryPhrase: string; + hexGeneratedPubKey: string; + registrationPhase: RegistrationPhase; + signUpMode: SignUpMode; + signInMode: SignInMode; +}; + +const initialState: RegistrationState = { + generatedRecoveryPhrase: '', + hexGeneratedPubKey: '', + registrationPhase: RegistrationPhase.Start, + signInMode: SignInMode.Default, + signUpMode: SignUpMode.Default, +}; + +export const registrationSlice = createSlice({ + name: 'registration', + initialState, + reducers: { + setGeneratedRecoveryPhrase(state, action: PayloadAction) { + return { ...state, generatedRecoveryPhrase: action.payload }; + }, + setHexGeneratedPubKey(state, action: PayloadAction) { + return { ...state, hexGeneratedPubKey: action.payload }; + }, + setRegistrationPhase(state, action: PayloadAction) { + return { ...state, registrationPhase: action.payload }; + }, + setSignUpMode(state, action: PayloadAction) { + return { ...state, signUpMode: action.payload }; + }, + setSignInMode(state, action: PayloadAction) { + return { ...state, signInMode: action.payload }; + }, + }, +}); + +export const { + setGeneratedRecoveryPhrase, + setHexGeneratedPubKey, + setRegistrationPhase, + setSignUpMode, + setSignInMode, +} = registrationSlice.actions; +export default registrationSlice.reducer; diff --git a/ts/state/onboarding/selectors/registration.ts b/ts/state/onboarding/selectors/registration.ts new file mode 100644 index 000000000..08611fe19 --- /dev/null +++ b/ts/state/onboarding/selectors/registration.ts @@ -0,0 +1,58 @@ +import { createSelector } from '@reduxjs/toolkit'; +import { useSelector } from 'react-redux'; +import { SignInMode, SignUpMode } from '../../../components/registration/stages'; +import { RegistrationPhase, RegistrationState } from '../ducks/registration'; +import { OnboardingStoreState } from '../store'; + +// #region Getters +const getRegistration = (state: OnboardingStoreState): RegistrationState => { + return state.registration; +}; + +const getGeneratedRecoveryPhrase = createSelector( + getRegistration, + (state: RegistrationState): string => state.generatedRecoveryPhrase +); + +const getHexGeneratedPubKey = createSelector( + getRegistration, + (state: RegistrationState): string => state.hexGeneratedPubKey +); + +const getRegistrationPhase = createSelector( + getRegistration, + (state: RegistrationState): RegistrationPhase => state.registrationPhase +); + +const getSignUpMode = createSelector( + getRegistration, + (state: RegistrationState): SignUpMode => state.signUpMode +); + +const getSignInMode = createSelector( + getRegistration, + (state: RegistrationState): SignInMode => state.signInMode +); +// #endregion + +// #region Hooks +export const useRegGeneratedRecoveryPhrase = () => { + return useSelector(getGeneratedRecoveryPhrase); +}; + +export const useRegHexGeneratedPubKey = () => { + return useSelector(getHexGeneratedPubKey); +}; + +export const useRegRegistrationPhase = () => { + return useSelector(getRegistrationPhase); +}; + +export const useRegSignUpMode = () => { + return useSelector(getSignUpMode); +}; + +export const useRegSignInMode = () => { + return useSelector(getSignInMode); +}; +// #endregion diff --git a/ts/state/onboarding/store.ts b/ts/state/onboarding/store.ts index f3cc4b4b4..06fa8dd5b 100644 --- a/ts/state/onboarding/store.ts +++ b/ts/state/onboarding/store.ts @@ -1,8 +1,9 @@ import { configureStore } from '@reduxjs/toolkit'; import modalsReducer from './ducks/modals'; +import registrationReducer from './ducks/registration'; export const onboardingStore = configureStore({ - reducer: { modals: modalsReducer }, + reducer: { modals: modalsReducer, registration: registrationReducer }, }); export type OnboardingStoreState = ReturnType;