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                              634x                     634x       6105x 57x   57x 57x     57x 57x     57x       57x     57x     6048x     634x             634x     6105x 1192x     4913x             6105x                                         441x                   6105x       634x                   634x      
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);
  },
});