import React, { useEffect, useMemo, useState } from "react"; import { useRouter } from "next/router"; import { faX } from "@fortawesome/free-solid-svg-icons"; import deleteUserFromOrganization from "~/pages/api/organization/deleteUserFromOrganization"; import changeUserRoleInWorkspace from "~/pages/api/workspace/changeUserRoleInWorkspace"; import deleteUserFromWorkspace from "~/pages/api/workspace/deleteUserFromWorkspace"; import getLatestFileKey from "~/pages/api/workspace/getLatestFileKey"; import uploadKeys from "~/pages/api/workspace/uploadKeys"; import guidGenerator from "../../utilities/randomId"; import Button from "../buttons/Button"; import Listbox from "../Listbox"; const { decryptAssymmetric, encryptAssymmetric, } = require("../../utilities/cryptography/crypto"); const nacl = require("tweetnacl"); nacl.util = require("tweetnacl-util"); const roles = ["admin", "user"]; /** * This is the component that we utilize for the user table - in future, can reuse it for some other purposes too. * #TODO: add the possibility of choosing and doing operations on multiple users. * @param {*} props * @returns */ const UserTable = ({ userData, changeData, myUser, filter, resendInvite, isOrg, onClick, deleteUser, setUserIdToBeDeleted, }) => { const [roleSelected, setRoleSelected] = useState( Array(userData?.length).fill(userData.map((user) => user.role)) ); const router = useRouter(); const [myRole, setMyRole] = useState("member"); // Delete the row in the table (e.g. a user) // #TODO: Add a pop-up that warns you that the user is going to be deleted. const handleDelete = (membershipId, index, e) => { // setUserIdToBeDeleted(userId); // onClick(); if (isOrg) { deleteUserFromOrganization(membershipId); } else { deleteUserFromWorkspace(membershipId); } changeData(userData.filter((v, i) => i !== index)); setRoleSelected([ ...roleSelected.slice(0, index), ...roleSelected.slice(index + 1, userData?.length), ]); }; // Update the rold of a certain user const handleRoleUpdate = (index, e) => { changeUserRoleInWorkspace(userData[index].membershipId, e); changeData([ ...userData.slice(0, index), ...[ { key: userData[index].key, firstName: userData[index].firstName, lastName: userData[index].lastName, email: userData[index].email, role: e, status: userData[index].status, userId: userData[index].userId, membershipId: userData[index].membershipId, publicKey: userData[index].publicKey, }, ], ...userData.slice(index + 1, userData?.length), ]); }; useEffect(() => { setMyRole(userData.filter((user) => user.email == myUser)[0]?.role); }, [userData, myUser]); const grantAccess = async (id, publicKey) => { let result = await getLatestFileKey(router.query.id); const PRIVATE_KEY = localStorage.getItem("PRIVATE_KEY"); // assymmetrically decrypt symmetric key with local private key const key = decryptAssymmetric({ ciphertext: result.latestKey.encryptedKey, nonce: result.latestKey.nonce, publicKey: result.latestKey.sender.publicKey, privateKey: PRIVATE_KEY, }); const { ciphertext, nonce } = encryptAssymmetric({ plaintext: key, publicKey: publicKey, privateKey: PRIVATE_KEY, }); uploadKeys(router.query.id, id, ciphertext, nonce); router.reload(); }; const deleteMembershipAndResendInvite = (email, membershipId) => { // deleteUserFromWorkspace(membershipId); resendInvite(email); }; return (
{userData?.filter( (user) => user.firstName?.toLowerCase().includes(filter) || user.lastName?.toLowerCase().includes(filter) || user.email?.toLowerCase().includes(filter) ).length > 0 && userData ?.filter( (user) => user.firstName?.toLowerCase().includes(filter) || user.lastName?.toLowerCase().includes(filter) || user.email?.toLowerCase().includes(filter) ) .map((row, index) => { return ( ); })}
First Name Last Name Email
{row.firstName} {row.lastName} {row.email}
{row.status == "granted" && ((myRole == "admin" && row.role != "owner") || myRole == "owner") && myUser !== row.email ? ( handleRoleUpdate(index, e)} data={ myRole == "owner" ? ["owner", "admin", "member"] : ["admin", "member"] } text="Role: " membershipId={row.membershipId} /> ) : ( row.status != "invited" && row.status != "verified" && ( ) )} {(row.status == "invited" || row.status == "verified") && (
)} {row.status == "completed" && myUser !== row.email && (
)}
{myUser !== row.email && // row.role != "admin" && myRole != "member" ? (
) : (
)}
); }; export default UserTable;