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 (
| First Name | Last Name | ||
|---|---|---|---|
| {row.firstName} | {row.lastName} | {row.email} |
{row.status == "granted" &&
((myRole == "admin" && row.role != "owner") ||
myRole == "owner") &&
myUser !== row.email ? (
{myUser !== row.email &&
// row.role != "admin" &&
myRole != "member" ? (
|