diff --git a/web/src/ui/rightpanel/UserModeration.tsx b/web/src/ui/rightpanel/UserModeration.tsx index 3b018de..afef1fe 100644 --- a/web/src/ui/rightpanel/UserModeration.tsx +++ b/web/src/ui/rightpanel/UserModeration.tsx @@ -23,6 +23,7 @@ import ConfirmWithMessageModal from "@/ui/timeline/menu/ConfirmWithMessageModal. import Gavel from "@/icons/gavel.svg?react" import PersonAdd from "@/icons/person-add.svg?react" import PersonRemove from "@/icons/person-remove.svg?react" +import { getPowerLevels } from "@/ui/timeline/menu/util.ts"; interface UserModerationProps { userID: string; @@ -33,7 +34,19 @@ interface UserModerationProps { const UserModeration = ({ userID, client, member }: UserModerationProps) => { const roomCtx = use(RoomContext) + if(!roomCtx) { + return null // There is no room context, moderation is not an applicable context. + } const openModal = use(ModalContext) + const hasPl = (action: "invite" | "kick" | "ban") => { + const [pls, ownPL] = getPowerLevels(roomCtx.store, client) + const actionPL = pls[action] ?? pls.state_default ?? 50 + const otherUserPl = pls.users?.[userID] ?? pls.users_default ?? 0 + if(action === "invite") { + return ownPL >= actionPL // no need to check otherUserPl + } + return ownPL >= actionPL && ownPL > otherUserPl + } const runAction = (mode: Membership) => { const callback = (reason: string) => { @@ -81,31 +94,31 @@ const UserModeration = ({ userID, client, member }: UserModerationProps) => {

Moderation

- {(["knock", "leave"].includes(membership) || !member) && ( + {(["knock", "leave"].includes(membership) || !member) && hasPl("invite") && ( )} - {["knock", "invite"].includes(membership) && ( + {["knock", "invite"].includes(membership) && hasPl("kick") && ( )} - {membership === "join" && ( + {membership === "join" && hasPl("kick") && ( )} - {membership !== "ban" && ( + {membership !== "ban" && hasPl("ban") && ( )} - {membership === "ban" && ( + {membership === "ban" && hasPl("ban") && (