All files / src/redux/slices/onboardingWizard index.ts

62.5% Statements 15/24
100% Branches 2/2
52.63% Functions 10/19
59.09% Lines 13/22

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120          540x                                       540x         54x                 43x 5x 8x       38x           43x       9x                               512x       4x       8x                                                                         540x      
import { IStep } from "@features/GiveOnboarding/types";
import { WizardFormData } from "@features/GiveOnboarding/types/form";
import { createSlice, PayloadAction } from "@reduxjs/toolkit";
import { OnboardingWizardState } from "./types";
 
const initialState: OnboardingWizardState = {
  currentSubstep: "" as IStep,
  hiddenStepKeys: new Set<IStep>([]),
  formData: {},
  dirtySteps: {
    identity_details: false,
    identity_id_document: false,
    identity_photo_with_id: false,
    business_profile: false,
    business_address: false,
    business_owners: false,
    business_details: false,
    business_bank_connect: false,
    business_bank_statement: false,
    business_bank_confirm: false,
    agreement_review: false,
    agreement_sign: false,
  },
};
 
const onboardingWizardSlice = createSlice({
  name: "onboardingWizard",
  initialState,
  reducers: {
    setCurrentSubstep(state, action: PayloadAction<IStep>) {
      state.currentSubstep = action.payload;
    },
    updateFormData(
      state,
      action: PayloadAction<
        | { key: keyof WizardFormData; data: any }
        | { key: keyof WizardFormData; data: any }[]
      >,
    ) {
      if (Array.isArray(action.payload)) {
        action.payload.forEach(({ key, data }) => {
          (state.formData as Partial<Record<keyof WizardFormData, any>>)[key] =
            data;
        });
      } else {
        (state.formData as Partial<Record<keyof WizardFormData, any>>)[
          action.payload.key
        ] = action.payload.data;
      }
    },
    resetFormData(state) {
      state.formData = {};
    },
    // Sets the hidden steps to exactly what's in the payload array
    setHiddenStepKeys(state, action: PayloadAction<IStep[]>) {
      action.payload.forEach((step) => state.hiddenStepKeys.add(step));
    },
    // Adds a single step to the set of hidden steps
    addHiddenStepKey(state, action: PayloadAction<IStep>) {
      state.hiddenStepKeys.add(action.payload);
    },
    // Removes a single step from the set of hidden steps
    removeHiddenStepKey(state, action: PayloadAction<IStep>) {
      state.hiddenStepKeys.delete(action.payload);
    },
    // Clears all hidden steps
    clearHiddenStepKeys(state) {
      state.hiddenStepKeys.clear();
    },
    // Removes a selection of steps from the set of hidden steps
    removeHiddenStepKeys(state, action: PayloadAction<IStep[]>) {
      action.payload.forEach((step) => state.hiddenStepKeys.delete(step));
    },
    // Sets a step as dirty (has unsaved changes)
    setStepDirty(state, action: PayloadAction<IStep>) {
      state.dirtySteps[action.payload] = true;
    },
    // Sets a step as clean (no unsaved changes or data was saved)
    setStepClean(state, action: PayloadAction<IStep>) {
      state.dirtySteps[action.payload] = false;
    },
    // Sets multiple steps as dirty
    setStepsDirty(state, action: PayloadAction<IStep[]>) {
      action.payload.forEach((step) => {
        state.dirtySteps[step] = true;
      });
    },
    // Sets multiple steps as clean
    setStepsClean(state, action: PayloadAction<IStep[]>) {
      action.payload.forEach((step) => {
        state.dirtySteps[step] = false;
      });
    },
    // Clears all dirty states (sets all to false)
    clearAllDirtyStates(state) {
      Object.keys(state.dirtySteps).forEach((step) => {
        state.dirtySteps[step as IStep] = false;
      });
    },
  },
});
 
export const {
  setCurrentSubstep,
  setHiddenStepKeys,
  addHiddenStepKey,
  removeHiddenStepKey,
  clearHiddenStepKeys,
  removeHiddenStepKeys,
  updateFormData,
  resetFormData,
  setStepDirty,
  setStepClean,
  setStepsDirty,
  setStepsClean,
  clearAllDirtyStates,
} = onboardingWizardSlice.actions;
 
export default onboardingWizardSlice.reducer;