import { subject } from "@casl/ability"; import { faFolder, faPencil, faTrash } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { format, formatDistance } from "date-fns"; import { twMerge } from "tailwind-merge"; import { createNotification } from "@app/components/notifications"; import { ProjectPermissionCan } from "@app/components/permissions"; import { DeleteActionModal, EmptyState, IconButton, Modal, ModalContent, Table, TableContainer, TableSkeleton, Tag, TBody, Td, Th, THead, Tooltip, Tr } from "@app/components/v2"; import { ProjectPermissionActions, ProjectPermissionSub, useProject } from "@app/context"; import { formatProjectRoleName } from "@app/helpers/roles"; import { usePopUp } from "@app/hooks"; import { useUpdateIdentityWorkspaceRole } from "@app/hooks/api"; import { IdentityMembership } from "@app/hooks/api/identities/types"; import { TProjectRole } from "@app/hooks/api/roles/types"; import { IdentityRoleModify } from "./IdentityRoleModify"; type Props = { identityMembershipDetails: IdentityMembership; isMembershipDetailsLoading?: boolean; }; export const IdentityRoleDetailsSection = ({ identityMembershipDetails, isMembershipDetailsLoading }: Props) => { const { currentProject } = useProject(); const { popUp, handlePopUpOpen, handlePopUpToggle, handlePopUpClose } = usePopUp([ "deleteRole", "modifyRole" ] as const); const { mutateAsync: updateIdentityWorkspaceRole } = useUpdateIdentityWorkspaceRole(); const handleRoleDelete = async () => { const { id } = popUp?.deleteRole?.data as TProjectRole; try { const updatedRoles = identityMembershipDetails?.roles?.filter((el) => el.id !== id); await updateIdentityWorkspaceRole({ projectId: currentProject?.id || "", identityId: identityMembershipDetails.identity.id, roles: updatedRoles.map( ({ role, customRoleSlug, isTemporary, temporaryMode, temporaryRange, temporaryAccessStartTime, temporaryAccessEndTime }) => ({ role: role === "custom" ? customRoleSlug : role, ...(isTemporary ? { isTemporary, temporaryMode, temporaryRange, temporaryAccessStartTime, temporaryAccessEndTime } : { isTemporary }) }) ) }); createNotification({ type: "success", text: "Successfully removed role" }); handlePopUpClose("deleteRole"); } catch (err) { console.log(err); createNotification({ type: "error", text: "Failed to delete role" }); } }; return (

Project Roles

{(isAllowed) => ( { handlePopUpOpen("modifyRole"); }} isDisabled={!isAllowed} > )}
{isMembershipDetailsLoading && ( )} {!isMembershipDetailsLoading && identityMembershipDetails?.roles?.map((roleDetails) => { const isTemporary = roleDetails?.isTemporary; const isExpired = roleDetails.isTemporary && new Date() > new Date(roleDetails.temporaryAccessEndTime || ""); let text = "Permanent"; let toolTipText = "Non-Expiring Access"; if (roleDetails.isTemporary) { if (isExpired) { text = "Access Expired"; toolTipText = "Timed Access Expired"; } else { text = formatDistance( new Date(roleDetails.temporaryAccessEndTime || ""), new Date() ); toolTipText = `Until ${format( new Date(roleDetails.temporaryAccessEndTime || ""), "yyyy-MM-dd hh:mm:ss aaa" )}`; } } return ( ); })}
Role Duration
{roleDetails.role === "custom" ? roleDetails.customRoleName : formatProjectRoleName(roleDetails.role)} {text}
{(isAllowed) => ( { e.stopPropagation(); handlePopUpOpen("deleteRole", { id: roleDetails?.id, slug: roleDetails?.customRoleName || roleDetails?.role }); }} > )}
{!isMembershipDetailsLoading && !identityMembershipDetails?.roles?.length && ( )}
handlePopUpToggle("deleteRole", isOpen)} onDeleteApproved={() => handleRoleDelete()} /> handlePopUpToggle("modifyRole", isOpen)} >
); };