From 32348988923a9d9378518f44785f6bcaa711c9c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juli=C3=A1n=20David=20S=C3=A1nchez=20Gallego?= <50778235+juliansg022@users.noreply.github.com> Date: Mon, 14 Mar 2022 10:34:05 -0500 Subject: [PATCH] Add restrictions to protect the owners and change their roles --- .../components/team/MemberChangeRoleModal.tsx | 9 +++++--- .../components/team/MemberInvitationModal.tsx | 6 ++++-- apps/web/components/team/MemberListItem.tsx | 21 +++++++++++++++++-- 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/apps/web/components/team/MemberChangeRoleModal.tsx b/apps/web/components/team/MemberChangeRoleModal.tsx index e3917899..bd2a11dd 100644 --- a/apps/web/components/team/MemberChangeRoleModal.tsx +++ b/apps/web/components/team/MemberChangeRoleModal.tsx @@ -5,6 +5,7 @@ import React, { SyntheticEvent, useEffect } from "react"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import Button from "@calcom/ui/Button"; +import { TeamWithMembers } from "@lib/queries/teams"; import { trpc } from "@lib/trpc"; import ModalContainer from "@components/ui/ModalContainer"; @@ -15,10 +16,11 @@ type MembershipRoleOption = { label?: string; }; -const options: MembershipRoleOption[] = [{ value: "MEMBER" }, { value: "ADMIN" }]; +const options: MembershipRoleOption[] = [{ value: "MEMBER" }, { value: "ADMIN" }, { value: "OWNER" }]; export default function MemberChangeRoleModal(props: { isOpen: boolean; + team: TeamWithMembers; memberId: number; teamId: number; initialRole: MembershipRole; @@ -48,6 +50,8 @@ export default function MemberChangeRoleModal(props: { }, }); + const memberRole = props.team?.membership.role; + function changeRole(e: SyntheticEvent) { e.preventDefault(); @@ -57,7 +61,6 @@ export default function MemberChangeRoleModal(props: { role: role.value, }); } - return ( <> @@ -76,7 +79,7 @@ export default function MemberChangeRoleModal(props: { {/* - needs dialog to confirm change of ownership */} { + const { members } = props.team; + const owners = members.filter((member) => member["role"] === "OWNER"); + return owners.length; + }; + + const useCurrentUser = () => { + const query = useMeQuery(); + const user = query.data; + return user?.id; + }; + + const currentUser = useCurrentUser(); + const name = props.member.name || (() => { @@ -121,8 +136,9 @@ export default function MemberListItem(props: Props) { - {(props.team.membership.role === MembershipRole.OWNER || - props.team.membership.role === MembershipRole.ADMIN) && ( + {((props.team.membership.role === MembershipRole.OWNER && + (props.member.role !== "OWNER" || (ownersInTeam() > 1 && props.member.id === currentUser))) || + (props.team.membership.role === MembershipRole.ADMIN && props.member.role !== "OWNER")) && ( <>