All files / publisher-admin/pages/Collaboration Invites.tsx

92.85% Statements 13/14
100% Branches 0/0
50% Functions 1/2
92.85% Lines 13/14

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                                13x 13x 13x 13x   13x 13x 13x 13x       13x   13x                       13x                       13x                         13x                                                                          
import { useAtomValue, useSetAtom } from "jotai";
import { MainTable } from "@canonical/react-components";
import { useParams } from "react-router-dom";
import { useState } from "react";
 
import { getInvitesByStatus, buildInviteTableRows } from "../../utils";
 
import { activeInviteEmailState } from "../../state/atoms";
import { filteredInvitesListState } from "../../state/selectors";
 
type Props = {
  setShowRevokeModal: (showRevokeModal: boolean) => void;
  setShowReopenModal: (showReopenModal: boolean) => void;
};
 
function Invites({ setShowRevokeModal, setShowReopenModal }: Props) {
  const invitesList = useAtomValue(filteredInvitesListState);
  const setActiveInviteEmail = useSetAtom(activeInviteEmailState);
  const [loadingInviteUrl, setLoadingInviteUrl] = useState<string | null>(null);
  const [copiedInviteUrl, setCopiedInviteUrl] = useState<string | null>(null);
 
  const pendingInvites = getInvitesByStatus(invitesList, "pending");
  const expiredInvites = getInvitesByStatus(invitesList, "expired");
  const revokedInvites = getInvitesByStatus(invitesList, "revoked");
  const uniqueRevokedInvites = Array.from(
    new Map(revokedInvites.map((invite) => [invite.email, invite])).values()
  );
 
  const { packageName } = useParams();
 
  const pendingInvitesTableRows = buildInviteTableRows(
    pendingInvites,
    "Pending",
    packageName!,
    setShowRevokeModal,
    setShowReopenModal,
    setActiveInviteEmail,
    loadingInviteUrl,
    setLoadingInviteUrl,
    copiedInviteUrl,
    setCopiedInviteUrl
  );
  const expiredInvitesTableRows = buildInviteTableRows(
    expiredInvites,
    "Expired",
    packageName!,
    setShowRevokeModal,
    setShowReopenModal,
    setActiveInviteEmail,
    loadingInviteUrl,
    setLoadingInviteUrl,
    copiedInviteUrl,
    setCopiedInviteUrl
  );
  const revokedInvitesTableRows = buildInviteTableRows(
    uniqueRevokedInvites,
    "Revoked",
    packageName!,
    setShowRevokeModal,
    setShowReopenModal,
    setActiveInviteEmail,
    loadingInviteUrl,
    setLoadingInviteUrl,
    copiedInviteUrl,
    setCopiedInviteUrl
  );
 
  return (
    <MainTable
      responsive
      headers={[
        {
          content: "Status",
          heading: "Status",
        },
        {
          content: "Email",
          heading: "Email",
        },
        {
          content: "Sent by",
          heading: "Sent by",
        },
        {
          content: "Expires",
        },
        {
          content: "",
          heading: "Revoke",
        },
        {
          content: "",
          heading: "Actions",
        },
      ]}
      rows={pendingInvitesTableRows.concat(
        expiredInvitesTableRows,
        revokedInvitesTableRows
      )}
    />
  );
}
 
export default Invites;