import { useEffect, useState } from 'react'; import { useRouter } from 'next/router'; import { faX } from '@fortawesome/free-solid-svg-icons'; import changeUserRoleInOrganization from '@app/pages/api/organization/changeUserRoleInOrganization'; import deleteUserFromOrganization from '@app/pages/api/organization/deleteUserFromOrganization'; import deleteUserFromWorkspace from '@app/pages/api/workspace/deleteUserFromWorkspace'; import getLatestFileKey from '@app/pages/api/workspace/getLatestFileKey'; import uploadKeys from '@app/pages/api/workspace/uploadKeys'; import { decryptAssymmetric, encryptAssymmetric } from '../../utilities/cryptography/crypto'; import guidGenerator from '../../utilities/randomId'; import Button from '../buttons/Button'; import Listbox from '../Listbox'; // const roles = ['admin', 'user']; // TODO: Set type for this type Props = { userData: any[]; changeData: (users: any[]) => void; myUser: string; filter: string; resendInvite: (email: string) => void; isOrg: boolean; }; /** * 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 }: Props) => { const [roleSelected, setRoleSelected] = useState( Array(userData?.length).fill(userData.map((user) => user.role)) ); const router = useRouter(); const [myRole, setMyRole] = useState('member'); const workspaceId = router.query.id as string; // 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: string, index: number) => { // 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 role of a certain user const handleRoleUpdate = (index: number, e: string) => { changeUserRoleInOrganization(String(localStorage.getItem("orgData.id")), 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: string, publicKey: string) => { const result = await getLatestFileKey({ workspaceId }); const PRIVATE_KEY = localStorage.getItem('PRIVATE_KEY') as string; // 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, privateKey: PRIVATE_KEY }); uploadKeys(workspaceId, id, ciphertext, nonce); router.reload(); }; const deleteMembershipAndResendInvite = (email: string) => { // deleteUserFromWorkspace(membershipId); resendInvite(email); }; return (
| NAME | ROLE | ||
|---|---|---|---|
| {row.firstName} {row.lastName} | {row.email} |
{row.status === 'accepted' &&
((myRole === 'admin' && row.role !== 'owner') || myRole === 'owner') &&
(myUser !== row.email) ? (
|
{myUser !== row.email &&
// row.role !== "admin" &&
myRole !== 'member' ? (
|