All files / client/src/utils store.ts

100% Statements 22/22
71.42% Branches 10/14
100% Functions 5/5
100% Lines 22/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 121 122 123 124                                363x                     363x       2612x 41x   41x 41x     41x 41x     41x       41x     41x     2571x     363x           363x     2612x 279x     2333x             2612x                                         146x                   2612x       363x                   363x      
import { combineReducers } from "redux";
import { Action, configureStore } from "@reduxjs/toolkit";
import { createReduxEnhancer } from "@sentry/react";
import { config } from "shared/config";
import { RootState } from "client/types/reduxTypes";
import { SUBMIT_LOGOUT } from "client/types/logoutActionsTypes";
 
// Reducers
import { allProgramItemsReducer } from "client/views/all-program-items/allProgramItemsSlice";
import { loginReducer } from "client/views/login/loginSlice";
import { myProgramItemsReducer } from "client/views/my-program-items/myProgramItemsSlice";
import { adminReducer } from "client/views/admin/adminSlice";
import { testSettingsReducer } from "client/test/test-settings/testSettingsSlice";
import { groupReducer } from "client/views/group/groupSlice";
import { loadingReducer } from "client/state/loading/loadingSlice";
 
export const combinedReducer = combineReducers({
  allProgramItems: allProgramItemsReducer,
  login: loginReducer,
  myProgramItems: myProgramItemsReducer,
  admin: adminReducer,
  testSettings: testSettingsReducer,
  group: groupReducer,
  loading: loadingReducer,
});
 
// Reducer to reset state
const rootReducer = (
  state: RootState | undefined,
  action: Action,
): RootState => {
  if (action.type === SUBMIT_LOGOUT) {
    const newState = combinedReducer(undefined, action);
 
    Eif (state?.admin) {
      newState.admin = state.admin;
    }
 
    Eif (state?.allProgramItems) {
      newState.allProgramItems = state.allProgramItems;
    }
 
    Eif (
      config.client().loadedSettings !== "production" &&
      state?.testSettings
    ) {
      newState.testSettings = state.testSettings;
    }
 
    return newState;
  }
 
  return combinedReducer(state, action);
};
 
const ignoredActions = new Set([
  "allProgramItems/submitGetProgramItemsAsync", // Program items is huge
  "admin/submitGetSignupMessagesAsync", // Private
]);
 
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
const sentryReduxEnhancer = createReduxEnhancer({
  actionTransformer: (action) => {
    // Don't send large payloads or private data to sentry
    if (ignoredActions.has(action.type as string)) {
      return null;
    }
 
    return action;
  },
 
  stateTransformer: (state: RootState) => {
    // Reduce state that is too large, private or unnecessary to send
 
    /* eslint-disable @typescript-eslint/no-unnecessary-condition -- No idea what state the app state is in */
    const transformedState = {
      ...state,
      allProgramItems: {
        ...state?.allProgramItems,
        // Whole program items, too large to send
        programItems: `Program items count: ${state?.allProgramItems?.programItems?.length}`,
        // Whole program items, too large to send
        directSignups: `Direct signups count: ${state?.allProgramItems?.directSignups?.length}`,
      },
      admin: {
        ...state?.admin,
        // Config data - not interesting
        hiddenProgramItemIds: `Hidden program items count: ${state?.admin?.hiddenProgramItemIds?.length}`,
        // Config data - not interesting
        signupQuestions: `Signup questions count: ${state?.admin?.signupQuestions?.length}`,
        // Contains user signup messages - helper user only
        signupMessages: `Signup messages count: ${state?.admin?.signupMessages?.length}`,
      },
      myProgramItems: {
        ...state?.myProgramItems,
        directSignups: state?.myProgramItems?.directSignups?.map(
          (directSignup) => ({
            ...directSignup,
            // Remove signup question answers
            message: "<Message hidden>",
          }),
        ),
      },
    };
    /* eslint-enable @typescript-eslint/no-unnecessary-condition */
 
    return transformedState;
  },
});
 
export const store = configureStore({
  reducer: rootReducer,
  devTools:
    process.env.SETTINGS === "production"
      ? false
      : {
          trace: config.client().enableReduxTrace,
          traceLimit: 25,
        },
  enhancers: (getDefaultEnhancers) => {
    return getDefaultEnhancers().concat(sentryReduxEnhancer);
  },
});