diff --git a/web/core/components/project/settings/member-columns.tsx b/web/core/components/project/settings/member-columns.tsx index c4d1ca95475..b403e70ade9 100644 --- a/web/core/components/project/settings/member-columns.tsx +++ b/web/core/components/project/settings/member-columns.tsx @@ -1,3 +1,4 @@ +import { observer } from "mobx-react"; import Link from "next/link"; import { Controller, useForm } from "react-hook-form"; import { Trash2 } from "lucide-react"; @@ -6,7 +7,7 @@ import { IUser, IWorkspaceMember } from "@plane/types"; import { CustomSelect, PopoverMenu, TOAST_TYPE, setToast } from "@plane/ui"; import { EUserProjectRoles } from "@/constants/project"; import { EUserWorkspaceRoles, ROLE } from "@/constants/workspace"; -import { useMember } from "@/hooks/store"; +import { useMember, useUser } from "@/hooks/store"; export interface RowData { member: IWorkspaceMember; @@ -80,62 +81,74 @@ export const NameColumn: React.FC = (props) => { ); }; -export const AccountTypeColumn: React.FC = (props) => { +export const AccountTypeColumn: React.FC = observer((props) => { const { rowData, currentProjectRole, projectId, workspaceSlug } = props; // form info const { control, formState: { errors }, } = useForm(); + // store hooks const { project: { updateMember }, } = useMember(); - return rowData.role === EUserWorkspaceRoles.ADMIN || currentProjectRole !== EUserProjectRoles.ADMIN ? ( -
- {ROLE[rowData.role as keyof typeof ROLE]} -
- ) : ( - ( - { - if (!workspaceSlug) return; + const { data: currentUser } = useUser(); - updateMember(workspaceSlug.toString(), projectId.toString(), rowData.member.id, { - role: value as unknown as EUserProjectRoles, // Cast value to unknown first, then to EUserWorkspaceRoles - }).catch((err) => { - console.log(err, "err"); - const error = err.error; - const errorString = Array.isArray(error) ? error[0] : error; + // derived values + const isCurrentUser = currentUser?.id === rowData.member.id; + const isAdminRole = currentProjectRole === EUserProjectRoles.ADMIN; + const isRoleEditable = isCurrentUser && isAdminRole; - setToast({ - type: TOAST_TYPE.ERROR, - title: "Error!", - message: errorString ?? "An error occurred while updating member role. Please try again.", - }); - }); - }} - label={ -
- {ROLE[rowData.role as keyof typeof ROLE]} -
- } - buttonClassName={`!px-0 !justify-start hover:bg-custom-background-100 ${errors.role ? "border-red-500" : "border-none"}`} - className="rounded-md p-0 w-32" - optionsClassName="w-full" - input - > - {Object.keys(ROLE).map((item) => ( - - {ROLE[item as unknown as keyof typeof ROLE]} - - ))} -
+ return ( + <> + {isRoleEditable ? ( +
+ {ROLE[rowData.role as keyof typeof ROLE]} +
+ ) : ( + ( + { + if (!workspaceSlug) return; + + updateMember(workspaceSlug.toString(), projectId.toString(), rowData.member.id, { + role: value as unknown as EUserProjectRoles, // Cast value to unknown first, then to EUserWorkspaceRoles + }).catch((err) => { + console.log(err, "err"); + const error = err.error; + const errorString = Array.isArray(error) ? error[0] : error; + + setToast({ + type: TOAST_TYPE.ERROR, + title: "Error!", + message: errorString ?? "An error occurred while updating member role. Please try again.", + }); + }); + }} + label={ +
+ {ROLE[rowData.role as keyof typeof ROLE]} +
+ } + buttonClassName={`!px-0 !justify-start hover:bg-custom-background-100 ${errors.role ? "border-red-500" : "border-none"}`} + className="rounded-md p-0 w-32" + optionsClassName="w-full" + input + > + {Object.keys(ROLE).map((item) => ( + + {ROLE[item as unknown as keyof typeof ROLE]} + + ))} +
+ )} + /> )} - /> + ); -}; +}); diff --git a/web/core/components/workspace/settings/member-columns.tsx b/web/core/components/workspace/settings/member-columns.tsx index 4c2cd4339c0..23e958d2151 100644 --- a/web/core/components/workspace/settings/member-columns.tsx +++ b/web/core/components/workspace/settings/member-columns.tsx @@ -1,3 +1,4 @@ +import { observer } from "mobx-react"; import Link from "next/link"; import { Controller, useForm } from "react-hook-form"; import { Trash2 } from "lucide-react"; @@ -6,7 +7,7 @@ import { IUser, IWorkspaceMember } from "@plane/types"; import { CustomSelect, PopoverMenu, TOAST_TYPE, setToast } from "@plane/ui"; import { EUserProjectRoles } from "@/constants/project"; import { EUserWorkspaceRoles, ROLE } from "@/constants/workspace"; -import { useMember } from "@/hooks/store"; +import { useMember, useUser } from "@/hooks/store"; export interface RowData { member: IWorkspaceMember; @@ -79,63 +80,75 @@ export const NameColumn: React.FC = (props) => { ); }; -export const AccountTypeColumn: React.FC = (props) => { +export const AccountTypeColumn: React.FC = observer((props) => { const { rowData, currentWorkspaceRole, workspaceSlug } = props; // form info const { control, formState: { errors }, } = useForm(); + // store hooks const { workspace: { updateMember }, } = useMember(); - return rowData.role === EUserWorkspaceRoles.ADMIN || currentWorkspaceRole !== EUserWorkspaceRoles.ADMIN ? ( -
- {ROLE[rowData.role as keyof typeof ROLE]} -
- ) : ( - ( - { - console.log({ value, workspaceSlug }, "onChange"); - if (!workspaceSlug) return; + const { data: currentUser } = useUser(); - updateMember(workspaceSlug.toString(), rowData.member.id, { - role: value as unknown as EUserWorkspaceRoles, // Cast value to unknown first, then to EUserWorkspaceRoles - }).catch((err) => { - console.log(err, "err"); - const error = err.error; - const errorString = Array.isArray(error) ? error[0] : error; + // derived values + const isCurrentUser = currentUser?.id === rowData.member.id; + const isAdminRole = currentWorkspaceRole === EUserWorkspaceRoles.ADMIN; + const isRoleEditable = isCurrentUser && isAdminRole; - setToast({ - type: TOAST_TYPE.ERROR, - title: "Error!", - message: errorString ?? "An error occurred while updating member role. Please try again.", - }); - }); - }} - label={ -
- {ROLE[rowData.role as keyof typeof ROLE]} -
- } - buttonClassName={`!px-0 !justify-start hover:bg-custom-background-100 ${errors.role ? "border-red-500" : "border-none"}`} - className="rounded-md p-0 w-32" - optionsClassName="w-full" - input - > - {Object.keys(ROLE).map((item) => ( - - {ROLE[item as unknown as keyof typeof ROLE]} - - ))} -
+ return ( + <> + {isRoleEditable ? ( +
+ {ROLE[rowData.role as keyof typeof ROLE]} +
+ ) : ( + ( + { + console.log({ value, workspaceSlug }, "onChange"); + if (!workspaceSlug) return; + + updateMember(workspaceSlug.toString(), rowData.member.id, { + role: value as unknown as EUserWorkspaceRoles, // Cast value to unknown first, then to EUserWorkspaceRoles + }).catch((err) => { + console.log(err, "err"); + const error = err.error; + const errorString = Array.isArray(error) ? error[0] : error; + + setToast({ + type: TOAST_TYPE.ERROR, + title: "Error!", + message: errorString ?? "An error occurred while updating member role. Please try again.", + }); + }); + }} + label={ +
+ {ROLE[rowData.role as keyof typeof ROLE]} +
+ } + buttonClassName={`!px-0 !justify-start hover:bg-custom-background-100 ${errors.role ? "border-red-500" : "border-none"}`} + className="rounded-md p-0 w-32" + optionsClassName="w-full" + input + > + {Object.keys(ROLE).map((item) => ( + + {ROLE[item as unknown as keyof typeof ROLE]} + + ))} +
+ )} + /> )} - /> + ); -}; +});