import Button from "@/components/Low/Button"; import Checkbox from "@/components/Low/Checkbox"; import {PERMISSIONS} from "@/constants/userPermissions"; 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 {checkAccess, getTypesOfUser} from "@/utils/permissions"; import {PermissionType} from "@/interfaces/permissions"; import usePermissions from "@/hooks/usePermissions"; const USER_TYPE_PERMISSIONS: { [key in Type]: {perm: PermissionType | undefined; list: Type[]}; } = { student: { perm: "createCodeStudent", list: [], }, teacher: { perm: "createCodeTeacher", list: [], }, agent: { perm: "createCodeCountryManager", list: ["student", "teacher", "corporate", "mastercorporate"], }, corporate: { perm: "createCodeCorporate", list: ["student", "teacher"], }, mastercorporate: { perm: undefined, list: ["student", "teacher", "corporate"], }, admin: { perm: "createCodeAdmin", list: ["student", "teacher", "agent", "corporate", "admin", "mastercorporate"], }, developer: { perm: undefined, list: ["student", "teacher", "agent", "corporate", "admin", "developer", "mastercorporate"], }, }; interface Props { user: User; permissions: PermissionType[]; onFinish: () => void; } export default function CodeGenerator({user, permissions, onFinish}: Props) { const [generatedCode, setGeneratedCode] = useState(); const [expiryDate, setExpiryDate] = useState( user?.subscriptionExpirationDate ? moment(user.subscriptionExpirationDate).toDate() : null, ); const [isExpiryDateEnabled, setIsExpiryDateEnabled] = useState(true); const [type, setType] = useState("student"); useEffect(() => { if (!isExpiryDateEnabled) setExpiryDate(null); }, [isExpiryDateEnabled]); const generateCode = (type: Type) => { const uid = new ShortUniqueId(); const code = uid.randomUUID(6); axios .post("/api/code", {type, codes: [code], expiryDate}) .then(({data, status}) => { if (data.ok) { toast.success(`Successfully generated a ${capitalize(type)} code!`, { toastId: "success", }); setGeneratedCode(code); 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", }); }); }; return (
{user && ( )} {user && checkAccess(user, ["developer", "admin", "corporate", "mastercorporate"]) && ( <>
Enabled
{isExpiryDateEnabled && ( moment(date).isAfter(new Date()) && (user.subscriptionExpirationDate ? moment(date).isBefore(user.subscriptionExpirationDate) : true) } dateFormat="dd/MM/yyyy" selected={expiryDate} onChange={(date) => setExpiryDate(date)} /> )} )} {checkAccess(user, ["developer", "admin", "corporate", "mastercorporate"], permissions, "createCodes") && ( )}
{ if (generatedCode) navigator.clipboard.writeText(generatedCode); }}> {generatedCode}
{generatedCode && Give this code to the user to complete their registration}
); }