import { useState, FC } from "react"; import Link from "next/link"; import { useRouter } from "next/router"; // mobx store import { useMobxStore } from "lib/mobx/store-provider"; // services import { WorkspaceService } from "services/workspace.service"; // hooks import useToast from "hooks/use-toast"; // components import { ConfirmWorkspaceMemberRemove } from "components/workspace"; // ui import { CustomSelect, Tooltip } from "@plane/ui"; // icons import { ChevronDown, XCircle } from "lucide-react"; // constants import { ROLE } from "constants/workspace"; import { TUserWorkspaceRole } from "types"; type Props = { member: { id: string; memberId: string; avatar: string; first_name: string; last_name: string; email: string | undefined; display_name: string; role: TUserWorkspaceRole; status: boolean; member: boolean; accountCreated: boolean; }; }; // services const workspaceService = new WorkspaceService(); export const WorkspaceMembersListItem: FC = (props) => { const { member } = props; // router const router = useRouter(); const { workspaceSlug } = router.query; // store const { workspace: workspaceStore, user: userStore } = useMobxStore(); const { currentWorkspaceMemberInfo, currentWorkspaceRole } = userStore; const isAdmin = currentWorkspaceRole === 20; // states const [removeMemberModal, setRemoveMemberModal] = useState(false); // hooks const { setToastAlert } = useToast(); const handleRemoveMember = async () => { if (!workspaceSlug) return; if (member.member) await workspaceStore.removeMember(workspaceSlug.toString(), member.id).catch((err) => { const error = err?.error; setToastAlert({ type: "error", title: "Error", message: error || "Something went wrong", }); }); else await workspaceService .deleteWorkspaceInvitations(workspaceSlug.toString(), member.id) .then(() => { setToastAlert({ type: "success", title: "Success", message: "Member removed successfully", }); }) .catch((err) => { const error = err?.error; setToastAlert({ type: "error", title: "Error", message: error || "Something went wrong", }); }); }; if (!currentWorkspaceMemberInfo) return null; return ( <> setRemoveMemberModal(false)} data={member} onSubmit={handleRemoveMember} />
{member.avatar && member.avatar !== "" ? ( {member.display_name ) : ( {(member.email ?? member.display_name ?? "?")[0]} )}
{member.member ? ( {member.first_name} {member.last_name} ) : (

{member.display_name || member.email}

)}

{member.email ?? member.display_name}

{!member?.status && (

Pending

)} {member?.status && !member?.accountCreated && (

Account not created

)} {ROLE[member.role as keyof typeof ROLE]} {member.memberId !== currentWorkspaceMemberInfo.member && ( )}
} value={member.role} onChange={(value: TUserWorkspaceRole | undefined) => { if (!workspaceSlug || !value) return; workspaceStore .updateMember(workspaceSlug.toString(), member.id, { role: value, }) .catch(() => { setToastAlert({ type: "error", title: "Error!", message: "An error occurred while updating member role. Please try again.", }); }); }} disabled={ member.memberId === currentWorkspaceMemberInfo.member || !member.status || Boolean(currentWorkspaceRole && currentWorkspaceRole !== 20 && currentWorkspaceRole < member.role) } placement="bottom-end" > {Object.keys(ROLE).map((key) => { if (currentWorkspaceRole && currentWorkspaceRole !== 20 && currentWorkspaceRole < parseInt(key)) return null; return ( <>{ROLE[parseInt(key) as keyof typeof ROLE]} ); })} {isAdmin && ( )}
); };