import { 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({ workspaceId: 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;