import Button from "@/components/Low/Button"; import Input from "@/components/Low/Input"; import Modal from "@/components/Modal"; import useGroups from "@/hooks/useGroups"; import useUsers from "@/hooks/useUsers"; import { CorporateUser, Group, User } from "@/interfaces/user"; import { createColumnHelper, flexRender, getCoreRowModel, useReactTable, } from "@tanstack/react-table"; import axios from "axios"; import { capitalize, uniq } from "lodash"; import { useEffect, useState } from "react"; import { BsPencil, BsQuestionCircleFill, BsTrash } from "react-icons/bs"; import Select from "react-select"; import { toast } from "react-toastify"; import readXlsxFile from "read-excel-file"; import { useFilePicker } from "use-file-picker"; import { getUserCorporate } from "@/utils/groups"; import { isAgentUser, isCorporateUser } from "@/resources/user"; import { checkAccess } from "@/utils/permissions"; const columnHelper = createColumnHelper(); const EMAIL_REGEX = new RegExp( /^[a-zA-Z0-9]+(?:\.[a-zA-Z0-9]+)*@[a-zA-Z0-9]+(?:\.[a-zA-Z0-9]+)*$/ ); const LinkedCorporate = ({ userId, users, groups, }: { userId: string; users: User[]; groups: Group[]; }) => { const [companyName, setCompanyName] = useState(""); const [isLoading, setIsLoading] = useState(false); useEffect(() => { const user = users.find((u) => u.id === userId); if (!user) return setCompanyName(""); if (isCorporateUser(user)) return setCompanyName( user.corporateInformation?.companyInformation?.name || user.name ); if (isAgentUser(user)) return setCompanyName(user.agentInformation?.companyName || user.name); const belongingGroups = groups.filter((x) => x.participants.includes(userId) ); const belongingGroupsAdmins = belongingGroups .map((x) => users.find((u) => u.id === x.admin)) .filter((x) => !!x && isCorporateUser(x)); if (belongingGroupsAdmins.length === 0) return setCompanyName(""); const admin = belongingGroupsAdmins[0] as CorporateUser; setCompanyName( admin.corporateInformation?.companyInformation.name || admin.name ); }, [userId, users, groups]); return isLoading ? ( Loading... ) : ( <>{companyName} ); }; interface CreateDialogProps { user: User; users: User[]; group?: Group; onClose: () => void; } const CreatePanel = ({ user, users, group, onClose }: CreateDialogProps) => { const [name, setName] = useState( group?.name || undefined ); const [admin, setAdmin] = useState(group?.admin || user.id); const [participants, setParticipants] = useState( group?.participants || [] ); const [isLoading, setIsLoading] = useState(false); const { openFilePicker, filesContent, clear } = useFilePicker({ accept: ".xlsx", multiple: false, readAs: "ArrayBuffer", }); useEffect(() => { if (filesContent.length > 0) { setIsLoading(true); const file = filesContent[0]; readXlsxFile(file.content).then((rows) => { const emails = uniq( rows .map((row) => { const [email] = row as string[]; return EMAIL_REGEX.test(email) && !users.map((u) => u.email).includes(email) ? email.toString().trim() : undefined; }) .filter((x) => !!x) ); if (emails.length === 0) { toast.error("Please upload an Excel file containing e-mails!"); clear(); setIsLoading(false); return; } const emailUsers = [...new Set(emails)] .map((x) => users.find((y) => y.email.toLowerCase() === x)) .filter((x) => x !== undefined); const filteredUsers = emailUsers.filter( (x) => ((user.type === "developer" || user.type === "admin" || user.type === "corporate" || user.type === "mastercorporate") && (x?.type === "student" || x?.type === "teacher")) || (user.type === "teacher" && x?.type === "student") ); setParticipants(filteredUsers.filter((x) => !!x).map((x) => x!.id)); toast.success( user.type !== "teacher" ? "Added all teachers and students found in the file you've provided!" : "Added all students found in the file you've provided!", { toastId: "upload-success" } ); setIsLoading(false); }); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [filesContent, user.type, users]); const submit = () => { setIsLoading(true); if (name !== group?.name && (name === "Students" || name === "Teachers")) { toast.error( "That group name is reserved and cannot be used, please enter another one." ); setIsLoading(false); return; } (group ? axios.patch : axios.post)( group ? `/api/groups/${group.id}` : "/api/groups", { name, admin, participants } ) .then(() => { toast.success( `Group "${name}" ${group ? "edited" : "created"} successfully` ); return true; }) .catch(() => { toast.error("Something went wrong, please try again later!"); return false; }) .finally(() => { setIsLoading(false); onClose(); }); }; return (