import React, { useEffect, useState } from 'react'; import Head from 'next/head'; import { useRouter } from 'next/router'; import { faMagnifyingGlass, faPlus, faX } from '@fortawesome/free-solid-svg-icons'; import { faCheck } from '@fortawesome/free-solid-svg-icons'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import Button from '~/components/basic/buttons/Button'; import AddIncidentContactDialog from '~/components/basic/dialog/AddIncidentContactDialog'; import AddUserDialog from '~/components/basic/dialog/AddUserDialog'; import InputField from '~/components/basic/InputField'; import UserTable from '~/components/basic/table/UserTable'; import NavHeader from '~/components/navigation/NavHeader'; import guidGenerator from '~/utilities/randomId'; import addUserToOrg from '../../api/organization/addUserToOrg'; import deleteIncidentContact from '../../api/organization/deleteIncidentContact'; import getIncidentContacts from '../../api/organization/getIncidentContacts'; import getOrganization from '../../api/organization/GetOrg'; import getOrganizationSubscriptions from '../../api/organization/GetOrgSubscription'; import getOrganizationUsers from '../../api/organization/GetOrgUsers'; import renameOrg from '../../api/organization/renameOrg'; import getUser from '../../api/user/getUser'; import deleteWorkspace from '../../api/workspace/deleteWorkspace'; import getWorkspaces from '../../api/workspace/getWorkspaces'; export default function SettingsOrg() { const [buttonReady, setButtonReady] = useState(false); const router = useRouter(); const [orgName, setOrgName] = useState(''); const [emailUser, setEmailUser] = useState(''); const [workspaceToBeDeletedName, setWorkspaceToBeDeletedName] = useState(''); const [searchUsers, setSearchUsers] = useState(''); const [workspaceId, setWorkspaceId] = useState(''); const [isAddIncidentContactOpen, setIsAddIncidentContactOpen] = useState(false); const [isAddUserOpen, setIsAddUserOpen] = useState( router.asPath.split('?')[1] == 'invite' ); const [incidentContacts, setIncidentContacts] = useState([]); const [searchIncidentContact, setSearchIncidentContact] = useState(''); const [userList, setUserList] = useState(); const [personalEmail, setPersonalEmail] = useState(''); let workspaceIdTemp; const [email, setEmail] = useState(''); const [currentPlan, setCurrentPlan] = useState(''); useEffect(async () => { let org = await getOrganization({ orgId: localStorage.getItem('orgData.id') }); let orgData = org; setOrgName(orgData.name); let incidentContactsData = await getIncidentContacts( localStorage.getItem('orgData.id') ); setIncidentContacts(incidentContactsData?.map((contact) => contact.email)); const user = await getUser(); setPersonalEmail(user.email); workspaceIdTemp = router.query.id; let orgUsers = await getOrganizationUsers({ orgId: localStorage.getItem('orgData.id') }); setUserList( orgUsers.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 })) ); const subscriptions = await getOrganizationSubscriptions({ orgId: localStorage.getItem('orgData.id') }); setCurrentPlan(subscriptions.data[0].plan.product); }, []); const modifyOrgName = (newName) => { setButtonReady(true); setOrgName(newName); }; const submitChanges = (newOrgName) => { renameOrg(localStorage.getItem('orgData.id'), newOrgName); setButtonReady(false); }; useEffect(async () => { setWorkspaceId(router.query.id); }, []); function closeAddUserModal() { setIsAddUserOpen(false); } function closeAddIncidentContactModal() { setIsAddIncidentContactOpen(false); } function openAddUserModal() { setIsAddUserOpen(true); } function openAddIncidentContactModal() { setIsAddIncidentContactOpen(true); } async function submitAddUserModal(email) { await addUserToOrg(email, localStorage.getItem('orgData.id')); setEmail(''); setIsAddUserOpen(false); router.reload(); } const deleteIncidentContactFully = (incidentContact) => { setIncidentContacts( incidentContacts.filter((contact) => contact != incidentContact) ); deleteIncidentContact(localStorage.getItem('orgData.id'), incidentContact); }; /** * This function deleted a workspace. * It first checks if there is more than one workspace aviable. Otherwise, it doesn't delete * It then checks if the name of the workspace to be deleted is correct. Otherwise, it doesn't delete. * It then deletes the workspace and forwards the user to another aviable workspace. */ const executeDeletingWorkspace = async () => { let userWorkspaces = await getWorkspaces(); if (userWorkspaces.length > 1) { if ( userWorkspaces.filter( (workspace) => workspace._id == router.query.id )[0].name == workspaceToBeDeletedName ) { await deleteWorkspace(router.query.id); let userWorkspaces = await getWorkspaces(); router.push('/dashboard/' + userWorkspaces[0]._id); } } }; return (
Settings

Organization Settings

View and manage your organization here.

Display Name

Organization Members

Manage members of your organization. These users could afterwards be formed into projects.

{/* */}
setSearchUsers(e.target.value)} placeholder={'Search members...'} />
{userList && (
)}

Incident Contacts

These contacts will be notified in the unlikely event of a severe incident.

setSearchIncidentContact(e.target.value)} placeholder={'Search...'} />
{incidentContacts?.filter((email) => email.includes(searchIncidentContact) ).length > 0 ? ( incidentContacts .filter((email) => email.includes(searchIncidentContact)) .map((contact) => (

{contact}

)) ) : (

No incident contacts found.

)}
{/*

Danger Zone

As soon as you delete an organization, you will not be able to undo it. This will immediately remove all organization members and cancel your subscription. If you still want to do that, please enter the name of the organization below.

Note: You can only delete a project in case you have more than one.

*/}
); } SettingsOrg.requireAuth = true;