import useStats from "@/hooks/useStats"; import {EMPLOYMENT_STATUS, User} from "@/interfaces/user"; import {groupBySession, averageScore} from "@/utils/stats"; import {RadioGroup} from "@headlessui/react"; import axios from "axios"; import clsx from "clsx"; import moment from "moment"; import {Divider} from "primereact/divider"; import {useEffect, useState} from "react"; import ReactDatePicker from "react-datepicker"; import {BsFileEarmarkText, BsPencil, BsStar} from "react-icons/bs"; import {toast} from "react-toastify"; import Button from "./Low/Button"; import Checkbox from "./Low/Checkbox"; import CountrySelect from "./Low/CountrySelect"; import Input from "./Low/Input"; import ProfileSummary from "./ProfileSummary"; import Select from "react-select"; import useUsers from "@/hooks/useUsers"; import {USER_TYPE_LABELS} from "@/resources/user"; import {CURRENCIES} from "@/resources/paypal"; const expirationDateColor = (date: Date) => { const momentDate = moment(date); const today = moment(new Date()); if (today.add(1, "days").isAfter(momentDate)) return "!bg-mti-red-ultralight border-mti-red-light"; if (today.add(3, "days").isAfter(momentDate)) return "!bg-mti-rose-ultralight border-mti-rose-light"; if (today.add(7, "days").isAfter(momentDate)) return "!bg-mti-orange-ultralight border-mti-orange-light"; }; interface Props { user: User; loggedInUser: User; onClose: (reload?: boolean) => void; onViewStudents?: () => void; onViewTeachers?: () => void; onViewCorporate?: () => void; } const UserCard = ({user, loggedInUser, onClose, onViewStudents, onViewTeachers, onViewCorporate}: Props) => { const [expiryDate, setExpiryDate] = useState(user.subscriptionExpirationDate); const [type, setType] = useState(user.type); const [status, setStatus] = useState(user.status); const [referralAgentLabel, setReferralAgentLabel] = useState(); const [position, setPosition] = useState(user.type === "corporate" ? user.demographicInformation?.position : undefined); const [referralAgent, setReferralAgent] = useState(user.type === "corporate" ? user.corporateInformation?.referralAgent : undefined); const [companyName, setCompanyName] = useState( user.type === "corporate" ? user.corporateInformation?.companyInformation.name : user.type === "agent" ? user.agentInformation.companyName : undefined, ); const [commercialRegistration, setCommercialRegistration] = useState( user.type === "agent" ? user.agentInformation.commercialRegistration : undefined, ); const [userAmount, setUserAmount] = useState(user.type === "corporate" ? user.corporateInformation?.companyInformation.userAmount : undefined); const [paymentValue, setPaymentValue] = useState(user.type === "corporate" ? user.corporateInformation?.payment?.value : undefined); const [paymentCurrency, setPaymentCurrency] = useState(user.type === "corporate" ? user.corporateInformation?.payment?.currency : "EUR"); const [monthlyDuration, setMonthlyDuration] = useState(user.type === "corporate" ? user.corporateInformation?.monthlyDuration : undefined); const [commissionValue, setCommission] = useState(user.type === "corporate" ? user.corporateInformation?.payment?.commission : undefined); const {stats} = useStats(user.id); const {users} = useUsers(); useEffect(() => { if (users && users.length > 0) { if (!referralAgent) { setReferralAgentLabel("No manager"); return; } const agent = users.find((x) => x.id === referralAgent); setReferralAgentLabel(`${agent?.name} - ${agent?.email}`); } }, [users, referralAgent]); const updateUser = () => { if (user.type === "corporate" && (!paymentValue || paymentValue < 0)) return toast.error("Please set a price for the user's package before updating!"); if (!confirm(`Are you sure you want to update ${user.name}'s account?`)) return; axios .post<{user?: User; ok?: boolean}>(`/api/users/update?id=${user.id}`, { ...user, subscriptionExpirationDate: expiryDate, type, status, agentInformation: type === "agent" ? { name: companyName, commercialRegistration, } : undefined, corporateInformation: type === "corporate" ? { referralAgent, monthlyDuration, companyInformation: { name: companyName, userAmount, }, payment: { value: paymentValue, currency: paymentCurrency, ...(referralAgent === "" ? {} : {commission: commissionValue}), }, } : undefined, }) .then(() => { toast.success("User updated successfully!"); onClose(true); }) .catch(() => { toast.error("Something went wrong!", {toastId: "update-error"}); }); }; return ( <> , value: Object.keys(groupBySession(stats)).length, label: "Exams", }, { icon: , value: stats.length, label: "Exercises", }, { icon: , value: `${stats.length > 0 ? averageScore(stats) : 0}%`, label: "Average Score", }, ]} /> {user.type === "agent" && ( <>
)} {user.type === "corporate" && ( <>
setUserAmount(e ? parseInt(e) : undefined)} placeholder="Enter number of users" defaultValue={userAmount} /> setMonthlyDuration(e ? parseInt(e) : undefined)} placeholder="Enter monthly duration" defaultValue={monthlyDuration} />
setPaymentValue(e ? parseInt(e) : undefined)} type="number" defaultValue={paymentValue || 0} className="col-span-3" />
{referralAgentLabel && ( setCommission(e ? parseInt(e) : undefined)} type="number" defaultValue={commissionValue || 0} className="col-span-3" /> ) : (
)}
)}
null} placeholder="Enter your name" defaultValue={user.name} disabled /> null} placeholder="Enter email address" defaultValue={user.email} disabled />
null} placeholder="Enter phone number" defaultValue={user.demographicInformation?.phone} disabled />
{user.type !== "corporate" && (
{EMPLOYMENT_STATUS.map(({status, label}) => ( {({checked}) => ( {label} )} ))}
)} {user.type === "corporate" && ( )}
{({checked}) => ( Male )} {({checked}) => ( Female )} {({checked}) => ( Other )}
setExpiryDate(checked ? user.subscriptionExpirationDate || new Date() : null)}> Enabled
{!expiryDate && (
{!expiryDate && "Unlimited"} {expiryDate && moment(expiryDate).format("DD/MM/YYYY")}
)} {expiryDate && ( moment(date).isAfter(new Date()) && (loggedInUser.subscriptionExpirationDate ? moment(date).isBefore(moment(loggedInUser.subscriptionExpirationDate)) : true) } dateFormat="dd/MM/yyyy" selected={moment(expiryDate).toDate()} onChange={(date) => setExpiryDate(date)} /> )}
{(loggedInUser.type === "developer" || loggedInUser.type === "admin") && ( <>
)}
{onViewCorporate && ( )} {onViewStudents && ( )} {onViewTeachers && ( )}
); }; export default UserCard;