All files / client/src/views/program-item/signup ProgramItemSignup.tsx

87.5% Statements 7/8
20% Branches 2/10
100% Functions 1/1
87.5% Lines 7/8

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                                                          356x                 547x     547x   547x 547x   547x                                                                 1x        
import { ReactElement } from "react";
import styled from "styled-components";
import {
  ProgramItem,
  ProgramItemSignupStrategy,
} from "shared/types/models/programItem";
import { ProgramItemDirectSignup } from "client/views/program-item/signup/components/direct-signup/ProgramItemDirectSignup";
import { ProgramItemLotterySignup } from "client/views/program-item/signup/components/lottery-signup/ProgramItemLotterySignup";
import { SignupHelpText } from "client/views/program-item/signup/components/SignupHelpText";
import { getTimeNow } from "client/utils/getTimeNow";
import { isAlreadyDirectySigned } from "client/views/program-item/programItemUtils";
import { AdmissionTicketLink } from "client/views/program-item/signup/components/AdmissionTicketLink";
import { getDirectSignupEndTime } from "shared/utils/signupTimes";
import { isDirectSignupAlwaysOpen } from "shared/utils/isDirectSignupAlwaysOpen";
import {
  DirectSignupWithProgramItem,
  LotterySignupWithProgramItem,
} from "client/views/my-program-items/myProgramItemsSlice";
 
interface Props {
  signupStrategy: ProgramItemSignupStrategy;
  lotterySignups: readonly LotterySignupWithProgramItem[];
  directSignups: readonly DirectSignupWithProgramItem[];
  programItem: ProgramItem;
  attendees: number;
  usesKonstiSignup: boolean;
  signupRequired: boolean;
}
 
export const ProgramItemSignup = ({
  signupStrategy,
  lotterySignups,
  directSignups,
  programItem,
  attendees,
  usesKonstiSignup,
  signupRequired,
}: Props): ReactElement => {
  const signupAlwaysOpen = isDirectSignupAlwaysOpen(programItem);
 
  const isDirectSignupMode =
    signupStrategy === ProgramItemSignupStrategy.DIRECT || signupAlwaysOpen;
 
  const directSignupEndTime = getDirectSignupEndTime(programItem);
  const isDirectSignupOver = getTimeNow().isAfter(directSignupEndTime);
 
  const hasSignedUp = isAlreadyDirectySigned(programItem, directSignups);
 
  return (
    <div>
      <SignupHelpText
        programItem={programItem}
        usesKonstiSignup={usesKonstiSignup}
      />
 
      {signupRequired &&
        !isDirectSignupOver &&
        (isDirectSignupMode ? (
          <ProgramItemDirectSignup
            programItem={programItem}
            programItemIsFull={attendees >= programItem.maxAttendance}
          />
        ) : (
          <ProgramItemLotterySignup
            programItem={programItem}
            lotterySignups={lotterySignups}
            directSignups={directSignups}
          />
        ))}
 
      {isDirectSignupOver && hasSignedUp && (
        <LinkContainer>
          <AdmissionTicketLink programItemId={programItem.programItemId} />
        </LinkContainer>
      )}
    </div>
  );
};
 
const LinkContainer = styled.div`
  display: flex;
  justify-content: center;
`;