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                              532x                     532x       5217x 55x   55x 55x     55x 55x     55x       55x     55x     5162x     532x             532x     5217x 1024x     4193x             5217x                                         343x                   5217x       532x                   532x      
import { Action, configureStore } from "@reduxjs/toolkit";
import { createReduxEnhancer } from "@sentry/react";
import { combineReducers } from "redux";
import { config } from "shared/config";
import { loadingReducer } from "client/state/loading/loadingSlice";
import { testSettingsReducer } from "client/test/test-settings/testSettingsSlice";
import { SUBMIT_LOGOUT } from "client/types/logoutActionsTypes";
import { RootState } from "client/types/reduxTypes";
import { adminReducer } from "client/views/admin/adminSlice";
// Reducers
import { allProgramItemsReducer } from "client/views/all-program-items/allProgramItemsSlice";
import { groupReducer } from "client/views/group/groupSlice";
import { loginReducer } from "client/views/login/loginSlice";
import { myProgramItemsReducer } from "client/views/my-program-items/myProgramItemsSlice";
 
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
  "admin/updateServerAppBuildTime", // Dispatched on every poll, would crowd out useful breadcrumbs
]);
 
// 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 sign-up messages - helper user only
        signupMessages: `Signup messages count: ${state?.admin?.signupMessages?.length}`,
      },
      myProgramItems: {
        ...state?.myProgramItems,
        directSignups: state?.myProgramItems?.directSignups?.map(
          (directSignup) => ({
            ...directSignup,
            // Remove sign-up 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);
  },
});