import Button from "@/components/Low/Button"; import Checkbox from "@/components/Low/Checkbox"; import {PERMISSIONS} from "@/constants/userPermissions"; import useUsers from "@/hooks/useUsers"; import {Type, User} from "@/interfaces/user"; import {USER_TYPE_LABELS} from "@/resources/user"; import axios from "axios"; import clsx from "clsx"; import {capitalize} from "lodash"; import moment from "moment"; import {useEffect, useState} from "react"; import ReactDatePicker from "react-datepicker"; import {toast} from "react-toastify"; import ShortUniqueId from "short-unique-id"; import {useFilePicker} from "use-file-picker"; export default function BatchCodeGenerator({user}: {user: User}) { const [emails, setEmails] = useState([]); const [isLoading, setIsLoading] = useState(false); const [expiryDate, setExpiryDate] = useState(null); const [isExpiryDateEnabled, setIsExpiryDateEnabled] = useState(true); const [type, setType] = useState("student"); const {users} = useUsers(); const {openFilePicker, filesContent} = useFilePicker({ accept: ".txt", multiple: false, }); useEffect(() => { if (user && (user.type === "corporate" || user.type === "teacher")) { setExpiryDate(user.subscriptionExpirationDate || null); } }, [user]); useEffect(() => { if (!isExpiryDateEnabled) setExpiryDate(null); }, [isExpiryDateEnabled]); useEffect(() => { if (filesContent.length > 0) { const file = filesContent[0]; const emails = file.content .split("\n") .map((x) => x.trim()) .filter((x) => new RegExp(/^[a-zA-Z0-9]+(?:\.[a-zA-Z0-9]+)*@[a-zA-Z0-9]+(?:\.[a-zA-Z0-9]+)*$/).test(x)) .filter((x) => !users.map((u) => u.email).includes(x)); if (emails.length === 0) { toast.error("Please upload a .txt file containing e-mails, one per line! All already registered e-mails have also been ignored!"); return; } setEmails([...new Set(emails)]); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [filesContent]); const generateCode = (type: Type) => { const uid = new ShortUniqueId(); const codes = emails.map(() => uid.randomUUID(6)); setIsLoading(true); axios .post("/api/code", {type, codes, emails, expiryDate}) .then(({data, status}) => { if (data.ok) { toast.success(`Successfully generated ${capitalize(type)} codes and they have been notified by e-mail!`, {toastId: "success"}); return; } if (status === 403) { toast.error(data.reason, {toastId: "forbidden"}); } }) .catch(({response: {status, data}}) => { if (status === 403) { toast.error(data.reason, {toastId: "forbidden"}); return; } toast.error(`Something went wrong, please try again later!`, {toastId: "error"}); }) .finally(() => setIsLoading(false)); }; return (
{user && (user.type === "developer" || user.type === "admin") && ( <>
Enabled
{isExpiryDateEnabled && ( moment(date).isAfter(new Date())} dateFormat="dd/MM/yyyy" selected={expiryDate} onChange={(date) => setExpiryDate(date)} /> )} )} {user && ( )}
); }