All files / client/src/views/group GroupView.tsx

96.42% Statements 27/28
20% Branches 2/10
100% Functions 10/10
96% Lines 24/25

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 131 132 133 134 135 136 137                                      356x 87x   174x 174x 174x 87x   87x 87x   87x 33x 33x     33x     87x 4x     87x 87x 87x   1x   87x                 348x                         1x                                                                                                     1x               1x       1x      
import { ReactElement, useEffect } from "react";
import { useTranslation } from "react-i18next";
import styled from "styled-components";
import dayjs from "dayjs";
import { Link } from "react-router";
import { GroupMembersList } from "client/views/group/components/GroupMembersList";
import { loadGroupMembers } from "client/utils/loadData";
import { useAppSelector } from "client/utils/hooks";
import { getIsInGroup } from "client/views/group/groupUtils";
import { NotInGroupActions } from "client/views/group/components/NotInGroupActions";
import { GroupCreatorActions } from "client/views/group/components/GroupCreatorActions";
import { GroupMemberActions } from "client/views/group/components/GroupMemberActions";
import { getTimeNow } from "client/utils/getTimeNow";
import { selectDirectSignups } from "client/views/my-program-items/myProgramItemsSlice";
import { config } from "shared/config";
import { AppRoute } from "client/app/AppRoutes";
import { isLotterySignupProgramItem } from "shared/utils/isLotterySignupProgramItem";
import { selectGroupMembers } from "client/views/group/groupSlice";
 
export const GroupView = (): ReactElement => {
  const { twoPhaseSignupProgramTypes } = config.event();
 
  const username = useAppSelector((state) => state.login.username);
  const groupCode = useAppSelector((state) => state.group.groupCode);
  const isGroupCreator = useAppSelector((state) => state.group.isGroupCreator);
  const groupMembers = useAppSelector(selectGroupMembers);
 
  const directSignups = useAppSelector(selectDirectSignups);
  const { t } = useTranslation();
 
  useEffect(() => {
    const fetchData = async (): Promise<void> => {
      await loadGroupMembers();
    };
    // eslint-disable-next-line @typescript-eslint/no-floating-promises
    fetchData();
  }, []);
 
  const filteredActiveDirectSignups = directSignups.filter((directSignup) =>
    isLotterySignupProgramItem(directSignup.programItem),
  );
 
  const isInGroup = getIsInGroup(groupCode);
  const timeNow = getTimeNow();
  const directSignupsAfterNow = filteredActiveDirectSignups.filter(
    (directSignup) =>
      timeNow.isSameOrBefore(dayjs(directSignup.signedToStartTime)),
  );
  const hasDirectSignups = directSignupsAfterNow.length > 0;
 
  return (
    <div className="group-view">
      <p>
        {t("group.groupLotterySignupGuide")}{" "}
        {t("group.groupLotterySignupProgramTypes")}{" "}
        {twoPhaseSignupProgramTypes
          .map((twoPhaseSignupProgramType) =>
            t(`programTypePlural.${twoPhaseSignupProgramType}`),
          )
          .join(", ")}
        .
      </p>
 
      {!isInGroup && (
        <>
          {hasDirectSignups && (
            <DirectSignupsContainer>
              <p>{t("group.hasDirectlySignedFollowingProgramItems")}</p>
              <ListItem>
                {filteredActiveDirectSignups.map((directSignup) => (
                  <li key={directSignup.programItemId}>
                    <Link
                      to={`${AppRoute.PROGRAM_ITEM}/${directSignup.programItemId}`}
                    >
                      {directSignup.programItem.title}
                    </Link>
                  </li>
                ))}
              </ListItem>
              <p>{t("group.cancelSignupBeforeJoiningOrCreatingGroup")}</p>
            </DirectSignupsContainer>
          )}
 
          <NotInGroupActions disabled={hasDirectSignups} />
        </>
      )}
 
      {isInGroup && (
        <>
          {isGroupCreator && (
            <>
              <p>
                <BoldText>{t("group.youAreGroupCreator")}</BoldText>.{" "}
                {t("group.groupCreatorInfo")}
              </p>
              <p>
                {t("group.groupCodeInfo")}
                <BoldText data-testid="group-code">{groupCode}</BoldText>.
              </p>
              <GroupCreatorActions username={username} groupCode={groupCode} />
            </>
          )}
 
          {!isGroupCreator && (
            <>
              <p>
                <BoldText>{t("group.youAreInGroup")}</BoldText>.{" "}
                {t("group.groupMemberInfo")}
              </p>
              <GroupMemberActions />
            </>
          )}
 
          <h3>{t("group.groupMembers")}</h3>
          <GroupMembersList groupMembers={groupMembers} />
        </>
      )}
    </div>
  );
};
 
const DirectSignupsContainer = styled.div`
  margin: 10px 0;
 
  > ul {
    margin: 10px 15px;
  }
`;
 
const BoldText = styled.span`
  font-weight: 600;
`;
 
const ListItem = styled.ul`
  padding: 0 0 0 20px;
`;