import { useState, FC } from "react"; import { observer } from "mobx-react"; import { useParams } from "next/navigation"; import { ChevronDown, XCircle } from "lucide-react"; // ui import { CustomSelect, Tooltip, TOAST_TYPE, setToast } from "@plane/ui"; // components import { ConfirmWorkspaceMemberRemove } from "@/components/workspace"; // constants import { EUserWorkspaceRoles, ROLE } from "@/constants/workspace"; // hooks import { useMember, useUser } from "@/hooks/store"; import { usePlatformOS } from "@/hooks/use-platform-os"; type Props = { invitationId: string; }; export const WorkspaceInvitationsListItem: FC = observer((props) => { const { invitationId } = props; // states const [removeMemberModal, setRemoveMemberModal] = useState(false); // router const { workspaceSlug } = useParams(); // store hooks const { membership: { currentWorkspaceMemberInfo, currentWorkspaceRole }, } = useUser(); const { workspace: { updateMemberInvitation, deleteMemberInvitation, getWorkspaceInvitationDetails }, } = useMember(); const { isMobile } = usePlatformOS(); // derived values const invitationDetails = getWorkspaceInvitationDetails(invitationId); const handleRemoveInvitation = async () => { if (!workspaceSlug || !invitationDetails) return; await deleteMemberInvitation(workspaceSlug.toString(), invitationDetails.id) .then(() => { setToast({ type: TOAST_TYPE.SUCCESS, title: "Success!", message: "Invitation removed successfully.", }); }) .catch((err) => setToast({ type: TOAST_TYPE.ERROR, title: "Error!", message: err?.error || "Something went wrong. Please try again.", }) ); }; if (!invitationDetails) return null; // is the current logged in user admin const isAdmin = currentWorkspaceRole === EUserWorkspaceRoles.ADMIN; // role change access- // 1. user cannot change their own role // 2. only admin or member can change role // 3. user cannot change role of higher role const hasRoleChangeAccess = currentWorkspaceRole && [EUserWorkspaceRoles.ADMIN, EUserWorkspaceRoles.MEMBER].includes(currentWorkspaceRole); if (!currentWorkspaceMemberInfo) return null; return ( <> setRemoveMemberModal(false)} userDetails={{ id: invitationDetails.id, display_name: `${invitationDetails.email}`, }} onSubmit={handleRemoveInvitation} />
{(invitationDetails.email ?? "?")[0]}

{invitationDetails.email}

Pending

{ROLE[invitationDetails.role]} {hasRoleChangeAccess && ( )}
} value={invitationDetails.role} onChange={(value: EUserWorkspaceRoles) => { if (!workspaceSlug || !value) return; updateMemberInvitation(workspaceSlug.toString(), invitationDetails.id, { role: value, }).catch(() => { setToast({ type: TOAST_TYPE.ERROR, title: "Error!", message: "An error occurred while updating member role. Please try again.", }); }); }} disabled={!hasRoleChangeAccess} 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]} ); })}
); });