import { Helmet } from "react-helmet"; import { useTranslation } from "react-i18next"; import { faChevronLeft } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { Link, useNavigate, useParams } from "@tanstack/react-router"; import { twMerge } from "tailwind-merge"; import { UpgradePlanModal } from "@app/components/license/UpgradePlanModal"; import { createNotification } from "@app/components/notifications"; import { OrgPermissionCan } from "@app/components/permissions"; import { Button, DeleteActionModal, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, PageHeader, Tooltip } from "@app/components/v2"; import { ROUTE_PATHS } from "@app/const/routes"; import { OrgPermissionActions, OrgPermissionSubjects, useOrganization, useUser } from "@app/context"; import { withPermission } from "@app/hoc"; import { useDeleteOrgMembership, useGetOrgMembership, useUpdateOrgMembership } from "@app/hooks/api"; import { usePopUp } from "@app/hooks/usePopUp"; import { OrgAccessControlTabSections } from "@app/types/org"; import { UserAuditLogsSection } from "./components/UserProjectsSection/UserAuditLogsSection"; import { UserGroupsSection } from "./components/UserProjectsSection/UserGroupsSection"; import { UserDetailsSection, UserOrgMembershipModal, UserProjectsSection } from "./components"; const Page = withPermission( () => { const navigate = useNavigate(); const search = useParams({ from: ROUTE_PATHS.Organization.UserDetailsByIDPage.id }); const membershipId = search.membershipId as string; const { user } = useUser(); const { currentOrg, isSubOrganization } = useOrganization(); const userId = user?.id || ""; const orgId = currentOrg?.id || ""; const { data: membership } = useGetOrgMembership(orgId, membershipId); const { mutateAsync: deleteOrgMembership } = useDeleteOrgMembership(); const { mutateAsync: updateOrgMembership } = useUpdateOrgMembership(); const { popUp, handlePopUpOpen, handlePopUpClose, handlePopUpToggle } = usePopUp([ "removeMember", "orgMembership", "deactivateMember", "upgradePlan" ] as const); const onDeactivateMemberSubmit = async (orgMembershipId: string) => { try { await updateOrgMembership({ organizationId: orgId, membershipId: orgMembershipId, isActive: false }); createNotification({ text: "Successfully deactivated user in organization", type: "success" }); } catch (err) { console.error(err); createNotification({ text: "Failed to deactivate user in organization", type: "error" }); } handlePopUpClose("deactivateMember"); }; const onRemoveMemberSubmit = async (orgMembershipId: string) => { try { await deleteOrgMembership({ orgId, membershipId: orgMembershipId }); createNotification({ text: "Successfully removed user from org", type: "success" }); handlePopUpClose("removeMember"); navigate({ to: "/organization/access-management" as const, search: { selectedTab: OrgAccessControlTabSections.Member } }); } catch (err) { console.error(err); createNotification({ text: "Failed to remove user from the organization", type: "error" }); } handlePopUpClose("removeMember"); }; return (
{membership && (
Users
{userId !== membership.user.id && (
{(isAllowed) => ( handlePopUpOpen("orgMembership", { membershipId: membership.id, role: membership.role, roleId: membership.roleId }) } disabled={!isAllowed} > Edit User )} {(isAllowed) => ( { if (currentOrg?.scimEnabled) { createNotification({ text: "You cannot manage users from Infisical when SCIM is enabled for your organization", type: "error" }); return; } if (!membership.isActive) { // activate user await updateOrgMembership({ organizationId: orgId, membershipId, isActive: true }); return; } // deactivate user handlePopUpOpen("deactivateMember", { orgMembershipId: membershipId, username: membership.user.username }); }} disabled={!isAllowed} > {`${membership.isActive ? "Deactivate" : "Activate"} User`} )} {(isAllowed) => ( { if (currentOrg?.scimEnabled) { createNotification({ text: "You cannot manage users from Infisical when SCIM is enabled for your organization", type: "error" }); return; } handlePopUpOpen("removeMember", { orgMembershipId: membershipId, username: membership.user.username }); }} disabled={!isAllowed} > Remove User )}
)}
)} handlePopUpToggle("removeMember", isOpen)} deleteKey="confirm" onDeleteApproved={() => onRemoveMemberSubmit( (popUp?.removeMember?.data as { orgMembershipId: string })?.orgMembershipId ) } /> handlePopUpToggle("deactivateMember", isOpen)} deleteKey="confirm" onDeleteApproved={() => onDeactivateMemberSubmit( (popUp?.deactivateMember?.data as { orgMembershipId: string })?.orgMembershipId ) } buttonText="Deactivate" /> handlePopUpToggle("upgradePlan", isOpen)} text={(popUp.upgradePlan?.data as { description: string })?.description} />
); }, { action: OrgPermissionActions.Read, subject: OrgPermissionSubjects.Member } ); export const UserDetailsByIDPage = () => { const { t } = useTranslation(); return ( <> {t("common.head-title", { title: t("settings.org.title") })} ); };