import Button from "@/components/Low/Button"; import Checkbox from "@/components/Low/Checkbox"; import Input from "@/components/Low/Input"; import useGroups from "@/hooks/useGroups"; import useUsers from "@/hooks/useUsers"; import {Module} from "@/interfaces"; import {Group, User} from "@/interfaces/user"; import {Disclosure, Transition} from "@headlessui/react"; import {createColumnHelper, flexRender, getCoreRowModel, useReactTable} from "@tanstack/react-table"; import axios from "axios"; import clsx from "clsx"; import {capitalize} from "lodash"; import {useEffect, useRef, useState} from "react"; import {BsCheck, BsDash, BsPencil, BsPlus, BsTrash} from "react-icons/bs"; import {toast} from "react-toastify"; import Select from "react-select"; import {uuidv4} from "@firebase/util"; import {useFilePicker} from "use-file-picker"; import Modal from "@/components/Modal"; const columnHelper = createColumnHelper(); 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 {openFilePicker, filesContent} = useFilePicker({ accept: ".txt", multiple: false, }); useEffect(() => { if (filesContent.length > 0) { const file = filesContent[0]; const emails = file.content .toLowerCase() .split("\n") .filter((x) => new RegExp(/^[a-zA-Z0-9]+(?:\.[a-zA-Z0-9]+)*@[a-zA-Z0-9]+(?:\.[a-zA-Z0-9]+)*$/).test(x)); if (emails.length === 0) { toast.error("Please upload a .txt file containing e-mails, one per line!"); 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") && (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"}, ); } }, [filesContent, user.type, users]); const submit = () => { if (name !== group?.name && (name === "Students" || name === "Teachers")) { toast.error("That group name is reserved and cannot be used, please enter another one."); 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(onClose); }; return (