All files / client/src/utils getUpcomingProgramItems.ts

95.12% Statements 39/41
88.88% Branches 16/18
100% Functions 12/12
95% Lines 38/40

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 128 129 130                      358x     735x   735x 2532x 2532x     735x       358x 15402x 15402x           358x     263x   263x   263x 18x       18x         263x     358x     99x 99x     99x                     358x               2092x 1993x           99x 99x       99x         358x     263x   263x 19x     263x     358x     263x   263x   263x   4x       4x           263x    
import dayjs, { Dayjs } from "dayjs";
import { ProgramItem } from "shared/types/models/programItem";
import { getTimeNow } from "client/utils/getTimeNow";
import { getDirectSignupEndTime } from "shared/utils/signupTimes";
import {
  DirectSignupWithProgramItem,
  LotterySignupWithProgramItem,
} from "client/views/my-program-items/myProgramItemsSlice";
import { GroupMemberWithLotteryProgramItem } from "client/views/group/groupSlice";
import { config } from "shared/config";
 
export const getUpcomingProgramItems = (
  programItems: readonly ProgramItem[],
): readonly ProgramItem[] => {
  const timeNow = getTimeNow();
 
  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[],
): readonly LotterySignupWithProgramItem[] => {
  const timeNow = getTimeNow();
 
  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);
  Iif (!groupCreator) {
    return null;
  }
  return groupCreator;
};
 
interface GetLotterySignupsParams {
  lotterySignups: readonly LotterySignupWithProgramItem[];
  isGroupCreator: boolean;
  groupMembers: readonly GroupMemberWithLotteryProgramItem[];
  isInGroup: boolean;
  showAllProgramItems: boolean;
}
 
export const getLotterySignups = ({
  lotterySignups,
  isGroupCreator,
  groupMembers,
  isInGroup,
  showAllProgramItems,
}: GetLotterySignupsParams): readonly LotterySignupWithProgramItem[] => {
  // Show own lottery signups if group creator or not in group
  if (isGroupCreator || !isInGroup) {
    return showAllProgramItems
      ? lotterySignups
      : getUpcomingLotterySignups(lotterySignups);
  }
 
  // Show group creator lottery signups if in group and not group creator
  const groupCreator = getGroupCreator(groupMembers);
  Iif (!groupCreator) {
    return [];
  }
 
  return showAllProgramItems
    ? groupCreator.lotterySignups
    : getUpcomingLotterySignups(groupCreator.lotterySignups);
};
 
export const getUpcomingDirectSignups = (
  directSignups: readonly DirectSignupWithProgramItem[],
): readonly DirectSignupWithProgramItem[] => {
  const timeNow = getTimeNow();
 
  const upcomingProgramItems = directSignups.filter((directSignup) =>
    dayjs(directSignup.programItem.startTime).add(1, "hours").isAfter(timeNow),
  );
 
  return upcomingProgramItems;
};
 
export const getUpcomingFavorites = (
  favoriteProgramItems: readonly ProgramItem[],
): readonly ProgramItem[] => {
  const timeNow = getTimeNow();
 
  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;
};