import { useMemo, useState } from "react"; import { Table, Thead, Tr, Th, Tbody, Td, IconButton, useDisclosure, Text, Button, } from "@chakra-ui/react"; import { useSession } from "next-auth/react"; import { BsTrash } from "react-icons/bs"; import { type User } from "@prisma/client"; import { useHandledAsyncCallback, useSelectedProject } from "~/utils/hooks"; import { InviteMemberModal } from "./InviteMemberModal"; import { RemoveMemberDialog } from "./RemoveMemberDialog"; import { api } from "~/utils/api"; import { maybeReportError } from "~/utils/errorHandling/maybeReportError"; const MemberTable = () => { const selectedProject = useSelectedProject().data; const session = useSession().data; const utils = api.useContext(); const [memberToRemove, setMemberToRemove] = useState(null); const inviteMemberModal = useDisclosure(); const cancelInvitationMutation = api.users.cancelProjectInvitation.useMutation(); const [cancelInvitation, isCancelling] = useHandledAsyncCallback( async (invitationToken: string) => { if (!selectedProject?.id) return; const resp = await cancelInvitationMutation.mutateAsync({ invitationToken, }); if (maybeReportError(resp)) return; await utils.projects.get.invalidate(); }, [selectedProject?.id, cancelInvitationMutation], ); const sortedMembers = useMemo(() => { if (!selectedProject?.projectUsers) return []; return selectedProject.projectUsers.sort((a, b) => { if (a.role === b.role) return a.createdAt < b.createdAt ? -1 : 1; // Take advantage of fact that ADMIN is alphabetically before MEMBER return a.role < b.role ? -1 : 1; }); }, [selectedProject?.projectUsers]); return ( <> {selectedProject?.role === "ADMIN" && {selectedProject && sortedMembers.map((member) => { return ( {selectedProject.role === "ADMIN" && ( )} ); })} {selectedProject?.projectUserInvitations?.map((invitation) => { return ( {selectedProject.role === "ADMIN" && ( )} ); })}
Name Email Role}
{member.user.name} {member.user.email} {member.role} {member.user.id !== session?.user?.id && member.user.id !== selectedProject.personalProjectUserId && ( } onClick={() => setMemberToRemove(member.user)} /> )}
Invitation pending {invitation.email} {invitation.role}
setMemberToRemove(null)} /> ); }; export default MemberTable;