/* eslint-disable @next/next/no-img-element */ import Button from "@/components/Low/Button"; import ProgressBar from "@/components/Low/ProgressBar"; import InviteWithUserCard from "@/components/Medium/InviteWithUserCard"; import ModuleBadge from "@/components/ModuleBadge"; import ProfileSummary from "@/components/ProfileSummary"; import { Session } from "@/hooks/useSessions"; import { Grading } from "@/interfaces"; import { EntityWithRoles } from "@/interfaces/entity"; import { Exam } from "@/interfaces/exam"; import { InviteWithEntity } from "@/interfaces/invite"; import { Assignment, AssignmentWithHasResults } from "@/interfaces/results"; import { User } from "@/interfaces/user"; import { sessionOptions } from "@/lib/session"; import useExamStore from "@/stores/exam"; import { findBy, mapBy, redirect, serialize } from "@/utils"; import { requestUser } from "@/utils/api"; import { getAssignmentsForStudent } from "@/utils/assignments.be"; import { getEntities } from "@/utils/entities.be"; import { getExamsByIds } from "@/utils/exams.be"; import { getGradingSystemByEntity } from "@/utils/grading.be"; import { convertInvitersToEntity, getInvitesByInvitee, } from "@/utils/invites.be"; import { MODULE_ARRAY, sortByModule } from "@/utils/moduleUtils"; import { checkAccess } from "@/utils/permissions"; import { getGradingLabel } from "@/utils/score"; import { getSessionsByUser } from "@/utils/sessions.be"; import { getDetailedStatsByUser } from "@/utils/stats.be"; import clsx from "clsx"; import { withIronSessionSsr } from "iron-session/next"; import { capitalize, uniqBy } from "lodash"; import moment from "moment"; import Head from "next/head"; import { useRouter } from "next/router"; import { BsBook, BsClipboard, BsFileEarmarkText, BsHeadphones, BsMegaphone, BsPen, BsPencil, BsStar, } from "react-icons/bs"; import { ToastContainer } from "react-toastify"; interface Props { user: User; entities: EntityWithRoles[]; assignments: AssignmentWithHasResults[]; stats: { fullExams: number; uniqueModules: number; averageScore: number }; exams: Exam[]; sessions: Session[]; invites: InviteWithEntity[]; grading: Grading; } export const getServerSideProps = withIronSessionSsr(async ({ req, res }) => { const user = await requestUser(req, res); if (!user || !user.isVerified) return redirect("/login"); if (!checkAccess(user, ["admin", "developer", "student"])) return redirect("/"); const entityIDS = mapBy(user.entities, "id") || []; const entities = await getEntities(entityIDS, { _id: 0, label: 1 }); const currentDate = moment().toISOString(); const assignments = await getAssignmentsForStudent(user.id, currentDate); const stats = await getDetailedStatsByUser(user.id, "stats"); const assignmentsIDs = mapBy(assignments, "id"); const sessions = await getSessionsByUser(user.id, 10, { ["assignment.id"]: { $in: assignmentsIDs }, }); const invites = await getInvitesByInvitee(user.id); const grading = await getGradingSystemByEntity(entityIDS[0] || "", { _id: 0, steps: 1, }); const formattedInvites = await Promise.all( invites.map(convertInvitersToEntity) ); const examIDs = uniqBy( assignments.flatMap((a) => a.exams.map((e: { module: string; id: string }) => ({ module: e.module, id: e.id, key: `${e.module}_${e.id}`, })) ), "key" ); const exams = examIDs.length > 0 ? await getExamsByIds(examIDs) : []; return { props: serialize({ user, entities, assignments, stats, exams, sessions, invites: formattedInvites, grading, }), }; }, sessionOptions); export default function Dashboard({ user, entities, assignments, stats, invites, grading, sessions, exams, }: Props) { const router = useRouter(); const dispatch = useExamStore((state) => state.dispatch); const startAssignment = (assignment: Assignment) => { const assignmentExams = exams.filter((e) => { const exam = findBy(assignment.exams, "id", e.id); return !!exam && exam.module === e.module; }); if (assignmentExams.every((x) => !!x)) { dispatch({ type: "INIT_EXAM", payload: { exams: assignmentExams.sort(sortByModule), modules: mapBy(assignmentExams.sort(sortByModule), "module"), assignment, }, }); router.push("/exam"); } }; return ( <> EnCoach <> {entities.length > 0 && (
{mapBy(entities, "label")?.join(", ")}
)} ), value: stats.fullExams, label: "Exams", tooltip: "Number of all conducted completed exams", }, { icon: ( ), value: stats.uniqueModules, label: "Modules", tooltip: "Number of all exam modules performed including Level Test", }, { icon: ( ), value: `${stats?.averageScore.toFixed(2) || 0}%`, label: "Average Score", tooltip: "Average success rate for questions responded", }, ]} /> {/* Assignments */}
Assignments {assignments.length === 0 && "Assignments will appear here. It seems that for now there are no assignments for you."} {assignments.map((assignment) => (

{assignment.name}

{moment(assignment.startDate).format("DD/MM/YY, HH:mm")} - {moment(assignment.endDate).format("DD/MM/YY, HH:mm")}
{assignment.exams.map((e) => ( ))}
{!assignment.hasResults && ( <>
x.assignment?.id === assignment.id ).length > 0 && "tooltip" )} >
)} {assignment.hasResults && ( )}
))}
{/* Invites */} {invites.length > 0 && (
{invites.map((invite) => ( router.replace(router.asPath)} /> ))}
)} {/* Score History */}
Score History
{MODULE_ARRAY.map((module) => { const desiredLevel = user.desiredLevels[module] || 9; const level = user.levels[module] || 0; return (
{module === "reading" && ( )} {module === "listening" && ( )} {module === "writing" && ( )} {module === "speaking" && ( )} {module === "level" && ( )}
{capitalize(module)} {module === "level" && !!grading && `English Level: ${getGradingLabel( level, grading.steps )}`} {module !== "level" && `Level ${level} / Level 9 (Desired Level: ${desiredLevel})`}
); })}
); }