import { useTheme } from "@emotion/react"; import TabPanel from "@mui/lab/TabPanel"; import { Button, ButtonGroup, Stack, Typography } from "@mui/material"; import { useEffect, useState } from "react"; import Field from "../../Inputs/Field"; import { credentials } from "../../../Validation/validation"; import { networkService } from "../../../main"; import { createToast } from "../../../Utils/toastUtils"; import { useSelector } from "react-redux"; import BasicTable from "../../BasicTable"; import Select from "../../Inputs/Select"; import LoadingButton from "@mui/lab/LoadingButton"; import { GenericDialog } from "../../Dialog/genericDialog"; /** * TeamPanel component manages the organization and team members, * providing functionalities like renaming the organization, managing team members, * and inviting new members. * * @returns {JSX.Element} */ const TeamPanel = () => { const roleMap = { superadmin: "Super admin", admin: "Admin", user: "Team member", demo: "Demo User", }; const theme = useTheme(); const { authToken, user } = useSelector((state) => state.auth); //TODO // const [orgStates, setOrgStates] = useState({ // name: "Bluewave Labs", // isEdit: false, // }); const [toInvite, setToInvite] = useState({ email: "", role: ["0"], }); const [tableData, setTableData] = useState({}); const [members, setMembers] = useState([]); const [filter, setFilter] = useState("all"); const [isDisabled, setIsDisabled] = useState(true); const [errors, setErrors] = useState({}); const [isSendingInvite, setIsSendingInvite] = useState(false); useEffect(() => { const fetchTeam = async () => { try { const response = await networkService.getAllUsers({ authToken: authToken, }); setMembers(response.data.data); } catch (error) { createToast({ body: error.message || "Error fetching team members.", }); } }; fetchTeam(); }, [user]); useEffect(() => { let team = members; if (filter !== "all") team = members.filter((member) => { if (filter === "admin") { return member.role.includes("admin") || member.role.includes("superadmin"); } return member.role.includes(filter); }); const data = { cols: [ { id: 1, name: "NAME" }, { id: 2, name: "EMAIL" }, { id: 3, name: "ROLE" }, // FEATURE STILL TO BE IMPLEMENTED // { id: 4, name: "ACTION" }, ], rows: team?.map((member, idx) => { const roles = member.role.map((role) => roleMap[role]).join(","); return { id: member._id, data: [ { id: idx, data: ( {member.firstName + " " + member.lastName} Created {new Date(member.createdAt).toLocaleDateString()} ), }, { id: idx + 1, data: member.email }, { // TODO - Add select dropdown id: idx + 2, data: roles, }, // FEATURE STILL TO BE IMPLEMENTED // { // // TODO - Add delete onClick // id: idx + 3, // data: ( // // // // ), // }, ], }; }), }; setTableData(data); }, [members, filter]); useEffect(() => { setIsDisabled(Object.keys(errors).length !== 0 || toInvite.email === ""); }, [errors, toInvite.email]); // RENAME ORGANIZATION // const toggleEdit = () => { // setOrgStates((prev) => ({ ...prev, isEdit: !prev.isEdit })); // }; // const handleRename = () => {}; // INVITE MEMBER const [isOpen, setIsOpen] = useState(false); const handleChange = (event) => { const { value } = event.target; setToInvite((prev) => ({ ...prev, email: value, })); const validation = credentials.validate({ email: value }, { abortEarly: false }); setErrors((prev) => { const updatedErrors = { ...prev }; if (validation.error) { updatedErrors.email = validation.error.details[0].message; } else { delete updatedErrors.email; } return updatedErrors; }); }; const handleInviteMember = async () => { if (!toInvite.email) { setErrors((prev) => ({ ...prev, email: "Email is required." })); return; } setIsSendingInvite(true); if (!toInvite.role.includes("user") || !toInvite.role.includes("admin")) setToInvite((prev) => ({ ...prev, role: ["user"] })); const { error } = credentials.validate( { email: toInvite.email }, { abortEarly: false, } ); if (error) { setErrors((prev) => ({ ...prev, email: error.details[0].message })); return; } try { await networkService.requestInvitationToken({ authToken: authToken, email: toInvite.email, role: toInvite.role, }); closeInviteModal(); createToast({ body: "Member invited. They will receive an email with details on how to create their account.", }); } catch (error) { createToast({ body: error.message || "Unknown error.", }); } finally { setIsSendingInvite(false); } }; const closeInviteModal = () => { setIsOpen(false); setToInvite({ email: "", role: ["0"] }); setErrors({}); }; return ( {/* FEATURE STILL TO BE IMPLEMENTED */} {/* Organization name setOrgStates((prev) => ({ ...prev, name: event.target.value, })) } disabled={!orgStates.isEdit} sx={{ color: theme.palette.otherColors.bluishGray, "& .Mui-disabled": { WebkitTextFillColor: "initial !important", }, "& .Mui-disabled fieldset": { borderColor: "transparent !important", }, }} inputProps={{ sx: { textAlign: "end", padding: theme.spacing(4) }, }} /> setIsOpen(true)} > Invite a team member