All files / client/src/utils getUpcomingProgramItems.ts

100% Statements 37/37
100% Branches 18/18
100% Functions 12/12
100% Lines 36/36

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 125 126 127                    522x       994x 5843x 5843x     994x       522x 1763x 1763x           522x       360x   360x 40x       40x         360x     522x     26x 26x 1x   25x                       522x                 902x 876x           26x 26x 1x     25x         522x       364x 47x     364x     522x       364x   364x   6x       6x           364x    
import dayjs, { Dayjs } from "dayjs";
import { config } from "shared/config";
import { ProgramItem } from "shared/types/models/programItem";
import { getDirectSignupEndTime } from "shared/utils/signupTimes";
import { GroupMemberWithLotteryProgramItem } from "client/views/group/groupSlice";
import {
  DirectSignupWithProgramItem,
  LotterySignupWithProgramItem,
} from "client/views/my-program-items/myProgramItemsSlice";
 
export const getUpcomingProgramItems = (
  programItems: readonly ProgramItem[],
  timeNow: Dayjs,
): readonly ProgramItem[] => {
  const upcomingProgramItems = programItems.filter((programItem) => {
    const directSignupEndTime = getDirectSignupEndTime(programItem);
    return directSignupEndTime.isSameOrAfter(timeNow);
  });
 
  return upcomingProgramItems;
};
 
// Before this time only pre-convention week program is shown in the program list
export const isMainEventProgramVisible = (timeNow: Dayjs): boolean => {
  const { mainEventProgramVisibleTime } = config.event();
  return (
    !mainEventProgramVisibleTime ||
    timeNow.isSameOrAfter(dayjs(mainEventProgramVisibleTime))
  );
};
 
const getUpcomingLotterySignups = (
  lotterySignups: readonly LotterySignupWithProgramItem[],
  timeNow: Dayjs,
): readonly LotterySignupWithProgramItem[] => {
  const { startTimesByParentIds } = config.event();
 
  const upcomingLotterySignups = lotterySignups.filter((lotterySignup) => {
    const parentStartTime = startTimesByParentIds.get(
      lotterySignup.programItem.parentId,
    );
 
    return dayjs(parentStartTime ?? lotterySignup.programItem.startTime)
      .add(1, "hours")
      .isAfter(timeNow);
  });
 
  return upcomingLotterySignups;
};
 
const getGroupCreator = (
  groupMembers: readonly GroupMemberWithLotteryProgramItem[],
): GroupMemberWithLotteryProgramItem | null => {
  const groupCreator = groupMembers.find((member) => member.isGroupCreator);
  if (!groupCreator) {
    return null;
  }
  return groupCreator;
};
 
interface GetLotterySignupsParams {
  lotterySignups: readonly LotterySignupWithProgramItem[];
  isGroupCreator: boolean;
  groupMembers: readonly GroupMemberWithLotteryProgramItem[];
  isInGroup: boolean;
  showAllProgramItems: boolean;
  timeNow: Dayjs;
}
 
export const getLotterySignups = ({
  lotterySignups,
  isGroupCreator,
  groupMembers,
  isInGroup,
  showAllProgramItems,
  timeNow,
}: GetLotterySignupsParams): readonly LotterySignupWithProgramItem[] => {
  // Show own lottery sign-ups if group creator or not in group
  if (isGroupCreator || !isInGroup) {
    return showAllProgramItems
      ? lotterySignups
      : getUpcomingLotterySignups(lotterySignups, timeNow);
  }
 
  // Show group creator lottery sign-ups if in group and not group creator
  const groupCreator = getGroupCreator(groupMembers);
  if (!groupCreator) {
    return [];
  }
 
  return showAllProgramItems
    ? groupCreator.lotterySignups
    : getUpcomingLotterySignups(groupCreator.lotterySignups, timeNow);
};
 
export const getUpcomingDirectSignups = (
  directSignups: readonly DirectSignupWithProgramItem[],
  timeNow: Dayjs,
): readonly DirectSignupWithProgramItem[] => {
  const upcomingProgramItems = directSignups.filter((directSignup) =>
    dayjs(directSignup.programItem.startTime).add(1, "hours").isAfter(timeNow),
  );
 
  return upcomingProgramItems;
};
 
export const getUpcomingFavorites = (
  favoriteProgramItems: readonly ProgramItem[],
  timeNow: Dayjs,
): readonly ProgramItem[] => {
  const { startTimesByParentIds } = config.event();
 
  const upcomingProgramItems = favoriteProgramItems.filter(
    (favoriteProgramItem) => {
      const parentStartTime = startTimesByParentIds.get(
        favoriteProgramItem.parentId,
      );
 
      return dayjs(parentStartTime ?? favoriteProgramItem.startTime)
        .add(1, "hours")
        .isAfter(timeNow);
    },
  );
 
  return upcomingProgramItems;
};