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.