fix: Editor displayed as member in role menu

This commit is contained in:
Tom Moor
2024-04-10 23:06:30 -04:00
parent d883ba347b
commit 9c179fdd30
3 changed files with 34 additions and 19 deletions

View File

@@ -3,6 +3,7 @@ import * as React from "react";
import { UserRole } from "@shared/types"; import { UserRole } from "@shared/types";
import { UserRoleHelper } from "@shared/utils/UserRoleHelper"; import { UserRoleHelper } from "@shared/utils/UserRoleHelper";
import stores from "~/stores"; import stores from "~/stores";
import User from "~/models/User";
import Invite from "~/scenes/Invite"; import Invite from "~/scenes/Invite";
import { import {
UserChangeRoleDialog, UserChangeRoleDialog,
@@ -27,23 +28,21 @@ export const inviteUser = createAction({
}, },
}); });
export const updateUserRoleActionFactory = (userId: string, role: UserRole) => export const updateUserRoleActionFactory = (user: User, role: UserRole) =>
createAction({ createAction({
name: ({ t }) => { name: ({ t }) =>
const user = stores.users.get(userId); UserRoleHelper.isRoleHigher(role, user!.role)
? `${t("Promote to {{ role }}", {
return UserRoleHelper.isRoleHigher(role, user!.role) role: UserRoleHelper.displayName(role, t),
? `${t("Promote to {{ role }}", { role })}…` })}…`
: `${t("Demote to {{ role }}", { role })}…`; : `${t("Demote to {{ role }}", {
}, role: UserRoleHelper.displayName(role, t),
})}…`,
analyticsName: "Update user role", analyticsName: "Update user role",
section: UserSection, section: UserSection,
visible: ({ stores }) => { visible: ({ stores }) => {
const can = stores.policies.abilities(userId); const can = stores.policies.abilities(user.id);
const user = stores.users.get(userId);
if (!user) {
return false;
}
return UserRoleHelper.isRoleHigher(role, user.role) return UserRoleHelper.isRoleHigher(role, user.role)
? can.promote ? can.promote
: UserRoleHelper.isRoleLower(role, user.role) : UserRoleHelper.isRoleLower(role, user.role)
@@ -51,11 +50,6 @@ export const updateUserRoleActionFactory = (userId: string, role: UserRole) =>
: false; : false;
}, },
perform: ({ t }) => { perform: ({ t }) => {
const user = stores.users.get(userId);
if (!user) {
return;
}
stores.dialogs.openModal({ stores.dialogs.openModal({
title: t("Update role"), title: t("Update role"),
content: ( content: (

View File

@@ -108,7 +108,7 @@ function UserMenu({ user }: Props) {
items: [UserRole.Admin, UserRole.Member, UserRole.Viewer].map( items: [UserRole.Admin, UserRole.Member, UserRole.Viewer].map(
(role) => (role) =>
actionToMenuItem( actionToMenuItem(
updateUserRoleActionFactory(user.id, role), updateUserRoleActionFactory(user, role),
context context
) )
), ),

View File

@@ -1,3 +1,4 @@
import { type TFunction } from "i18next";
import { UserRole } from "../types"; import { UserRole } from "../types";
interface User { interface User {
@@ -5,6 +6,26 @@ interface User {
} }
export class UserRoleHelper { export class UserRoleHelper {
/**
* Get the display name for a role.
*
* @param role The role to get the display name for
* @param t The translation function
* @returns The display name for the role
*/
static displayName(role: UserRole, t: TFunction): string {
switch (role) {
case UserRole.Guest:
return t("Guest");
case UserRole.Viewer:
return t("Viewer");
case UserRole.Member:
return t("Editor");
case UserRole.Admin:
return t("Admin");
}
}
/** /**
* Check if the first role is higher than the second role. * Check if the first role is higher than the second role.
* *