import { Helmet } from "react-helmet"; import { useTranslation } from "react-i18next"; import { useNavigate, useParams } from "@tanstack/react-router"; import { formatRelative } from "date-fns"; import { UpgradePlanModal } from "@app/components/license/UpgradePlanModal"; import { createNotification } from "@app/components/notifications"; import { ProjectPermissionCan } from "@app/components/permissions"; import { Button, ConfirmActionModal, DeleteActionModal, EmptyState, PageHeader, Spinner } from "@app/components/v2"; import { ProjectPermissionActions, ProjectPermissionMemberActions, ProjectPermissionSub, useOrganization, useWorkspace } from "@app/context"; import { usePopUp } from "@app/hooks"; import { useAssumeProjectPrivileges, useDeleteUserFromWorkspace, useGetWorkspaceUserDetails } from "@app/hooks/api"; import { ActorType } from "@app/hooks/api/auditLogs/enums"; import { MemberProjectAdditionalPrivilegeSection } from "./components/MemberProjectAdditionalPrivilegeSection"; import { MemberRoleDetailsSection } from "./components/MemberRoleDetailsSection"; export const Page = () => { const navigate = useNavigate(); const membershipId = useParams({ strict: false, select: (el) => el.membershipId as string }); const { currentOrg } = useOrganization(); const { currentWorkspace } = useWorkspace(); const workspaceId = currentWorkspace?.id || ""; const { data: membershipDetails, isPending: isMembershipDetailsLoading } = useGetWorkspaceUserDetails(workspaceId, membershipId); const { mutateAsync: removeUserFromWorkspace, isPending: isRemovingUserFromWorkspace } = useDeleteUserFromWorkspace(); const assumePrivileges = useAssumeProjectPrivileges(); const { handlePopUpToggle, popUp, handlePopUpOpen, handlePopUpClose } = usePopUp([ "removeMember", "upgradePlan", "assumePrivileges" ] as const); const handleAssumePrivileges = async () => { const { userId } = popUp?.assumePrivileges?.data as { userId: string }; assumePrivileges.mutate( { actorId: userId, actorType: ActorType.USER, projectId: workspaceId }, { onSuccess: () => { createNotification({ type: "success", text: "User privilege assumption has started" }); window.location.href = `/${currentWorkspace.type}/${currentWorkspace.id}/overview`; } } ); }; const handleRemoveUser = async () => { if (!currentOrg?.id || !currentWorkspace?.id || !membershipDetails?.user?.username) return; try { await removeUserFromWorkspace({ workspaceId: currentWorkspace.id, usernames: [membershipDetails?.user?.username], orgId: currentOrg.id }); createNotification({ text: "Successfully removed user from project", type: "success" }); navigate({ to: `/${currentWorkspace.type}/$projectId/access-management` as const, params: { projectId: currentWorkspace.id } }); } catch (error) { console.error(error); createNotification({ text: "Failed to remove user from the project", type: "error" }); } handlePopUpClose("removeMember"); }; if (isMembershipDetailsLoading) { return (