/* eslint-disable @next/next/no-img-element */ import AssignmentCard from "@/components/High/AssignmentCard"; import Layout from "@/components/High/Layout"; import Button from "@/components/Low/Button"; import Separator from "@/components/Low/Separator"; 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 } from "@/interfaces/results"; import { Stat, User } from "@/interfaces/user"; import { sessionOptions } from "@/lib/session"; import useExamStore from "@/stores/exam"; import { filterBy, findBy, mapBy, redirect, serialize } from "@/utils"; import { requestUser } from "@/utils/api"; import { activeAssignmentFilter, futureAssignmentFilter } from "@/utils/assignments"; import { getAssignmentsByAssignee } from "@/utils/assignments.be"; import { getEntitiesWithRoles } from "@/utils/entities.be"; import { getExamsByIds } from "@/utils/exams.be"; import { sortByModule } from "@/utils/moduleUtils"; import { checkAccess } from "@/utils/permissions"; import { getSessionsByUser } from "@/utils/sessions.be"; import axios from "axios"; import clsx from "clsx"; import { withIronSessionSsr } from "iron-session/next"; import { uniqBy } from "lodash"; import moment from "moment"; import Head from "next/head"; import { useRouter } from "next/router"; import { useMemo, useState } from "react"; import { BsArrowRepeat } from "react-icons/bs"; import { ToastContainer } from "react-toastify"; interface Props { user: User; entities: EntityWithRoles[]; assignments: Assignment[]; stats: Stat[]; exams: Exam[]; sessions: Session[]; invites: InviteWithEntity[]; grading: Grading; } export const getServerSideProps = withIronSessionSsr(async ({ req, res }) => { const user = await requestUser(req, res) const destination = Buffer.from(req.url || "/").toString("base64") if (!user) return redirect(`/login?destination=${destination}`) if (!checkAccess(user, ["admin", "developer", "student"])) return redirect("/") const entityIDS = mapBy(user.entities, "id") || []; const entities = await getEntitiesWithRoles(entityIDS); const assignments = await getAssignmentsByAssignee(user.id, { archived: { $ne: true } }); const sessions = await getSessionsByUser(user.id, 0, { "assignment.id": { $in: mapBy(assignments, 'id') } }); const examIDs = uniqBy( assignments.flatMap((a) => filterBy(a.exams, 'assignee', user.id).map((e) => ({ module: e.module, id: e.id, key: `${e.module}_${e.id}` })), ), "key", ); const exams = await getExamsByIds(examIDs); return { props: serialize({ user, entities, assignments, exams, sessions }) }; }, sessionOptions); const destination = Buffer.from("/official-exam").toString("base64") export default function OfficialExam({ user, entities, assignments, sessions, exams }: Props) { const [isLoading, setIsLoading] = useState(false) const router = useRouter(); const dispatch = useExamStore((state) => state.dispatch); const reload = () => { setIsLoading(true) router.replace(router.asPath) setTimeout(() => setIsLoading(false), 500) } 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?assignment=${assignment.id}&destination=${destination}`); } }; const loadSession = async (session: Session) => { dispatch({type: "SET_SESSION", payload: {session}}); router.push(`/exam?assignment=${session.assignment?.id}&destination=${destination}`); }; const logout = async () => { axios.post("/api/logout").finally(() => { setTimeout(() => router.reload(), 500); }); }; const studentAssignments = useMemo(() => [ ...assignments.filter(activeAssignmentFilter), ...assignments.filter(futureAssignmentFilter)], [assignments] ); const assignmentSessions = useMemo(() => sessions.filter(s => mapBy(studentAssignments, 'id').includes(s.assignment?.id || "")), [sessions, studentAssignments]) return ( <> EnCoach {entities.length > 0 && (
{mapBy(entities, "label")?.join(", ")}
)} {/* Assignments */}
Assignments
{studentAssignments.length === 0 && "Assignments will appear here. It seems that for now there are no assignments for you."} {studentAssignments .sort((a, b) => moment(a.startDate).diff(b.startDate)) .map((a) => s.assignment?.id === a.id)} startAssignment={startAssignment} resumeAssignment={loadSession} /> )}
); }