import { faEllipsisV, faFolder, faPlus, faTrash } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { format, formatDistance } from "date-fns"; import { AnimatePresence, motion } from "framer-motion"; import { twMerge } from "tailwind-merge"; import { createNotification } from "@app/components/notifications"; import { ProjectPermissionCan } from "@app/components/permissions"; import { DeleteActionModal, EmptyState, IconButton, Table, TableContainer, TableSkeleton, Tag, TBody, Td, Th, THead, Tooltip, Tr } from "@app/components/v2"; import { ProjectPermissionActions, ProjectPermissionMemberActions, ProjectPermissionSub, useProjectPermission, useUser } from "@app/context"; import { usePopUp } from "@app/hooks"; import { useDeleteProjectUserAdditionalPrivilege, useListProjectUserPrivileges } from "@app/hooks/api"; import { TWorkspaceUser } from "@app/hooks/api/types"; import { MembershipProjectAdditionalPrivilegeModifySection } from "./MembershipProjectAdditionalPrivilegeModifySection"; type Props = { membershipDetails: TWorkspaceUser; }; export const MemberProjectAdditionalPrivilegeSection = ({ membershipDetails }: Props) => { const { user } = useUser(); const userId = user?.id; const { popUp, handlePopUpOpen, handlePopUpToggle, handlePopUpClose } = usePopUp([ "deletePrivilege", "modifyPrivilege" ] as const); const { permission } = useProjectPermission(); const { mutateAsync: deletePrivilege } = useDeleteProjectUserAdditionalPrivilege(); const { data: userProjectPrivileges, isPending } = useListProjectUserPrivileges( membershipDetails?.id ); const isOwnProjectMembershipDetails = userId === membershipDetails?.user?.id; const handlePrivilegeDelete = async () => { const { id } = popUp?.deletePrivilege?.data as { id: string }; try { await deletePrivilege({ privilegeId: id, projectMembershipId: membershipDetails.id }); createNotification({ type: "success", text: "Successfully removed the privilege" }); handlePopUpClose("deletePrivilege"); } catch (err) { console.log(err); createNotification({ type: "error", text: "Failed to delete privilege" }); } }; return (
{popUp?.modifyPrivilege.isOpen ? ( handlePopUpClose("modifyPrivilege")} projectMembershipId={membershipDetails?.id} privilegeId={(popUp?.modifyPrivilege?.data as { id: string })?.id} isDisabled={ isOwnProjectMembershipDetails || permission.cannot(ProjectPermissionMemberActions.Edit, ProjectPermissionSub.Member) } /> ) : (

Project Additional Privileges

{userId !== membershipDetails?.user?.id && membershipDetails?.status !== "invited" && ( {(isAllowed) => ( { handlePopUpOpen("modifyPrivilege"); }} isDisabled={!isAllowed} > )} )}
{isPending && } {!isPending && userProjectPrivileges?.map((privilegeDetails) => { const isTemporary = privilegeDetails?.isTemporary; const isExpired = privilegeDetails.isTemporary && new Date() > new Date(privilegeDetails.temporaryAccessEndTime || ""); let text = "Permanent"; let toolTipText = "Non-Expiring Access"; if (privilegeDetails.isTemporary) { if (isExpired) { text = "Access Expired"; toolTipText = "Timed Access Expired"; } else { text = formatDistance( new Date(privilegeDetails.temporaryAccessEndTime || ""), new Date() ); toolTipText = `Until ${format( new Date(privilegeDetails.temporaryAccessEndTime || ""), "yyyy-MM-dd hh:mm:ss aaa" )}`; } } return ( { if (evt.key === "Enter") { handlePopUpOpen("modifyPrivilege", privilegeDetails); } }} onClick={() => handlePopUpOpen("modifyPrivilege", privilegeDetails)} > ); })}
Name Duration
{privilegeDetails.slug} {text}
{(isAllowed) => ( { e.stopPropagation(); e.preventDefault(); handlePopUpOpen("deletePrivilege", { id: privilegeDetails?.id, slug: privilegeDetails?.slug }); }} > )}
{!isPending && !userProjectPrivileges?.length && ( )}
handlePopUpToggle("deletePrivilege", isOpen)} onDeleteApproved={() => handlePrivilegeDelete()} />
)}
); };