All files / client/src/views/group groupSlice.ts

94.11% Statements 16/17
50% Branches 1/2
100% Functions 8/8
94.11% Lines 16/17

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            363x                     363x               70x               3x             34x                       363x   363x                         363x 1077x   351x   48x 9x   9x     9x       9x   48x        
import { createSelector, createSlice, PayloadAction } from "@reduxjs/toolkit";
import { GroupState, RootState } from "client/types/reduxTypes";
import { selectProgramItems } from "client/views/all-program-items/allProgramItemsSlice";
import { LotterySignupWithProgramItem } from "client/views/my-program-items/myProgramItemsSlice";
import { GroupMember } from "shared/types/models/groups";
 
const initialState: GroupState = {
  groupCode: "0",
  isGroupCreator: false,
  groupMembers: [],
};
 
interface GroupCodeUpdate {
  groupCode: string;
  isGroupCreator: boolean;
}
 
const groupSlice = createSlice({
  name: "group",
  initialState,
  reducers: {
    submitUpdateGroupCodeAsync(
      state,
      action: PayloadAction<GroupCodeUpdate>,
    ): GroupState {
      return {
        ...state,
        groupCode: action.payload.groupCode,
        isGroupCreator: action.payload.isGroupCreator,
      };
    },
 
    submitLeaveGroupAsync(state, action: PayloadAction<string>): GroupState {
      return { ...state, groupCode: action.payload, groupMembers: [] };
    },
 
    submitUpdateGroupAsync(
      state,
      action: PayloadAction<readonly GroupMember[]>,
    ): GroupState {
      return {
        ...state,
        groupMembers: action.payload,
      };
    },
  },
});
 
export const {
  submitUpdateGroupCodeAsync,
  submitLeaveGroupAsync,
  submitUpdateGroupAsync,
} = groupSlice.actions;
 
export const groupReducer = groupSlice.reducer;
 
// SELECTORS
 
export type GroupMemberWithLotteryProgramItem = Omit<
  GroupMember,
  "lotterySignups"
> & {
  lotterySignups: LotterySignupWithProgramItem[];
};
 
export const selectGroupMembers: (
  state: RootState,
) => GroupMemberWithLotteryProgramItem[] = createSelector(
  [selectProgramItems, (state: RootState) => state.group.groupMembers],
  (programItems, groupMembers) => {
    return groupMembers.map((groupMember) => {
      const updatedSignups: LotterySignupWithProgramItem[] =
        groupMember.lotterySignups.flatMap((lotterySignup) => {
          const signedProgramItem = programItems.find(
            (programItem) =>
              programItem.programItemId === lotterySignup.programItemId,
          );
 
          Iif (!signedProgramItem) {
            return [];
          }
 
          return { ...lotterySignup, programItem: signedProgramItem };
        });
      return { ...groupMember, lotterySignups: updatedSignups };
    });
  },
);