import { useEffect, useState } from "react"; import Head from "next/head"; import Image from "next/image"; import { useRouter } from "next/router"; import { useTranslation } from "next-i18next"; 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 { getTranslatedServerSideProps } from "~/utilities/withTranslateProps"; 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 { t } = useTranslation(); 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 ? (
{t("settings-members:title")}
{t("settings-members:description")}