import React, { useEffect, useState } from 'react'; import Head from 'next/head'; import Image from 'next/image'; import { useRouter } from 'next/router'; import { faMagnifyingGlass, faPlus } from '@fortawesome/free-solid-svg-icons'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import Button from '~/components/basic/buttons/Button'; import AddProjectMemberDialog from '~/components/basic/dialog/AddProjectMemberDialog'; import UserTable from '~/components/basic/table/UserTable'; import NavHeader from '~/components/navigation/NavHeader'; import guidGenerator from '~/utilities/randomId'; import getOrganizationUsers from '../api/organization/GetOrgUsers'; import getUser from '../api/user/getUser'; // import DeleteUserDialog from '~/components/basic/dialog/DeleteUserDialog'; import addUserToWorkspace from '../api/workspace/addUserToWorkspace'; import getWorkspaceUsers from '../api/workspace/getWorkspaceUsers'; import uploadKeys from '../api/workspace/uploadKeys'; // #TODO: Update all the workspaceIds const crypto = require('crypto'); const { decryptAssymmetric, encryptAssymmetric } = require('../../components/utilities/cryptography/crypto'); const nacl = require('tweetnacl'); nacl.util = require('tweetnacl-util'); export default function Users() { let [isAddOpen, setIsAddOpen] = useState(false); // let [isDeleteOpen, setIsDeleteOpen] = useState(false); // let [userIdToBeDeleted, setUserIdToBeDeleted] = useState(false); let [email, setEmail] = useState(''); const [personalEmail, setPersonalEmail] = useState(''); const [searchUsers, setSearchUsers] = useState(''); const router = useRouter(); let workspaceId; function closeAddModal() { setIsAddOpen(false); } // function closeDeleteModal() { // setIsDeleteOpen(false); // } // function deleteMembership(userId) { // deleteUserFromWorkspace(userId, router.query.id) // } // function openDeleteModal() { // setIsDeleteOpen(true); // } async function submitAddModal() { let result = await addUserToWorkspace(email, router.query.id); if (result?.invitee && result?.latestKey) { 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: result.invitee.publicKey, privateKey: PRIVATE_KEY }); uploadKeys(router.query.id, result.invitee._id, ciphertext, nonce); } setEmail(''); setIsAddOpen(false); router.reload(); } function openAddModal() { setIsAddOpen(true); } const [userList, setUserList] = useState(); const [orgUserList, setOrgUserList] = useState([]); // eslint-disable-next-line react-hooks/exhaustive-deps useEffect(async () => { const user = await getUser(); setPersonalEmail(user.email); workspaceId = router.query.id; let workspaceUsers = await getWorkspaceUsers({ workspaceId }); const tempUserList = workspaceUsers.map((user) => ({ key: guidGenerator(), firstName: user.user?.firstName, lastName: user.user?.lastName, email: user.user?.email == null ? user.inviteEmail : user.user?.email, role: user?.role, status: user?.status, userId: user.user?._id, membershipId: user._id, publicKey: user.user?.publicKey })); setUserList(tempUserList); const orgUsers = await getOrganizationUsers({ orgId: localStorage.getItem('orgData.id') }); setOrgUserList(orgUsers); setEmail( orgUsers ?.filter((user) => user.status == 'accepted') .map((user) => user.user.email) .filter( (email) => !tempUserList?.map((user1) => user1.email).includes(email) )[0] ); }, []); return userList ? (
Project Members
This pages shows the members of the selected project.