/* eslint-disable @next/next/no-img-element */ import Modal from "@/components/Modal"; import useFilterRecordsByUser from "@/hooks/useFilterRecordsByUser"; import useUsers from "@/hooks/useUsers"; import { CorporateUser, Group, Stat, User } from "@/interfaces/user"; import UserList from "@/pages/(admin)/Lists/UserList"; import { dateSorter } from "@/utils"; import moment from "moment"; import { useEffect, useState } from "react"; import { BsArrowLeft, BsArrowRepeat, BsClipboard2Data, BsClipboard2DataFill, BsClipboard2Heart, BsClipboard2X, BsClipboardPulse, BsClock, BsEnvelopePaper, BsGlobeCentralSouthAsia, BsPaperclip, BsPeople, BsPerson, BsPersonAdd, BsPersonFill, BsPersonFillGear, BsPersonGear, BsPlus, BsRepeat, BsRepeat1, } from "react-icons/bs"; import UserCard from "@/components/UserCard"; import useGroups from "@/hooks/useGroups"; import { calculateAverageLevel, calculateBandScore } from "@/utils/score"; import { MODULE_ARRAY } from "@/utils/moduleUtils"; import { Module } from "@/interfaces"; import { groupByExam } from "@/utils/stats"; import IconCard from "./IconCard"; import GroupList from "@/pages/(admin)/Lists/GroupList"; import useAssignments from "@/hooks/useAssignments"; import { Assignment } from "@/interfaces/results"; import AssignmentCard from "./AssignmentCard"; import Button from "@/components/Low/Button"; import clsx from "clsx"; import ProgressBar from "@/components/Low/ProgressBar"; import AssignmentCreator from "./AssignmentCreator"; import AssignmentView from "./AssignmentView"; import { getUserCorporate } from "@/utils/groups"; import { checkAccess } from "@/utils/permissions"; import usePermissions from "@/hooks/usePermissions"; import { futureAssignmentFilter, pastAssignmentFilter, archivedAssignmentFilter, activeAssignmentFilter } from '@/utils/assignments'; interface Props { user: User; } export default function TeacherDashboard({ user }: Props) { const [page, setPage] = useState(""); const [selectedUser, setSelectedUser] = useState(); const [showModal, setShowModal] = useState(false); const [selectedAssignment, setSelectedAssignment] = useState(); const [isCreatingAssignment, setIsCreatingAssignment] = useState(false); const [corporateUserToShow, setCorporateUserToShow] = useState(); const { data: stats } = useFilterRecordsByUser(); const { users, reload } = useUsers(); const { groups } = useGroups({ adminAdmins: user.id }); const { permissions } = usePermissions(user.id); const { assignments, isLoading: isAssignmentsLoading, reload: reloadAssignments, } = useAssignments({ assigner: user.id }); useEffect(() => { setShowModal(!!selectedUser && page === ""); }, [selectedUser, page]); useEffect(() => { getUserCorporate(user.id).then(setCorporateUserToShow); }, [user]); const studentFilter = (user: User) => user.type === "student" && groups.flatMap((g) => g.participants).includes(user.id); const getStatsByStudent = (user: User) => stats.filter((s) => s.user === user.id); const UserDisplay = (displayUser: User) => (
setSelectedUser(displayUser)} className="flex w-full p-4 gap-4 items-center hover:bg-mti-purple-ultralight cursor-pointer transition ease-in-out duration-300" > {displayUser.name}
{displayUser.name} {displayUser.email}
); const StudentsList = () => { const filter = (x: User) => x.type === "student" && (!!selectedUser ? groups .filter((g) => g.admin === selectedUser.id) .flatMap((g) => g.participants) .includes(x.id) || false : groups.flatMap((g) => g.participants).includes(x.id)); return ( (
setPage("")} className="flex gap-2 items-center text-mti-purple-light cursor-pointer hover:text-mti-purple-dark transition ease-in-out duration-300" > Back

Students ({total})

)} /> ); }; const GroupsList = () => { const filter = (x: Group) => x.admin === user.id; return ( <>
setPage("")} className="flex gap-2 items-center text-mti-purple-light cursor-pointer hover:text-mti-purple-dark transition ease-in-out duration-300" > Back

Groups ({groups.filter(filter).length})

); }; const averageLevelCalculator = (studentStats: Stat[]) => { const formattedStats = studentStats .map((s) => ({ focus: users.find((u) => u.id === s.user)?.focus, score: s.score, module: s.module, })) .filter((f) => !!f.focus); const bandScores = formattedStats.map((s) => ({ module: s.module, level: calculateBandScore( s.score.correct, s.score.total, s.module, s.focus! ), })); const levels: { [key in Module]: number } = { reading: 0, listening: 0, writing: 0, speaking: 0, level: 0, }; bandScores.forEach((b) => (levels[b.module] += b.level)); return calculateAverageLevel(levels); }; const AssignmentsPage = () => { return ( <> { setSelectedAssignment(undefined); setIsCreatingAssignment(false); reloadAssignments(); }} assignment={selectedAssignment} /> x.admin === user.id || x.participants.includes(user.id) )} users={users.filter( (x) => x.type === "student" && (!!selectedUser ? groups .filter((g) => g.admin === selectedUser.id) .flatMap((g) => g.participants) .includes(x.id) : groups.flatMap((g) => g.participants).includes(x.id)) )} assigner={user.id} isCreating={isCreatingAssignment} cancelCreation={() => { setIsCreatingAssignment(false); setSelectedAssignment(undefined); reloadAssignments(); }} />
setPage("")} className="flex gap-2 items-center text-mti-purple-light cursor-pointer hover:text-mti-purple-dark transition ease-in-out duration-300" > Back
Reload

Active Assignments ({assignments.filter(activeAssignmentFilter).length})

{assignments.filter(activeAssignmentFilter).map((a) => ( setSelectedAssignment(a)} key={a.id} /> ))}

Planned Assignments ({assignments.filter(futureAssignmentFilter).length})

setIsCreatingAssignment(true)} className="w-[250px] h-[200px] flex flex-col gap-2 items-center justify-center bg-white hover:bg-mti-purple-ultralight text-mti-purple-light hover:text-mti-purple-dark border border-mti-gray-platinum hover:drop-shadow p-4 cursor-pointer rounded-xl transition ease-in-out duration-300" > New Assignment
{assignments.filter(futureAssignmentFilter).map((a) => ( { setSelectedAssignment(a); setIsCreatingAssignment(true); }} key={a.id} /> ))}

Past Assignments ({assignments.filter(pastAssignmentFilter).length})

{assignments.filter(pastAssignmentFilter).map((a) => ( setSelectedAssignment(a)} key={a.id} allowDownload reload={reloadAssignments} allowArchive allowExcelDownload /> ))}

Archived Assignments ({assignments.filter(archivedAssignmentFilter).length})

{assignments.filter(archivedAssignmentFilter).map((a) => ( setSelectedAssignment(a)} key={a.id} allowDownload reload={reloadAssignments} allowUnarchive allowExcelDownload /> ))}
); }; const DefaultDashboard = () => ( <> {corporateUserToShow && (
Linked to:{" "} {corporateUserToShow?.corporateInformation?.companyInformation .name || corporateUserToShow.name}
)}
setPage("students")} Icon={BsPersonFill} label="Students" value={users.filter(studentFilter).length} color="purple" /> groups.flatMap((g) => g.participants).includes(s.user) ).length } color="purple" /> groups.flatMap((g) => g.participants).includes(s.user) ) ).toFixed(1)} color="purple" /> {checkAccess( user, ["teacher", "developer"], permissions, "viewGroup" ) && ( x.admin === user.id).length} color="purple" onClick={() => setPage("groups")} /> )}
setPage("assignments")} className="bg-white rounded-xl shadow p-4 flex flex-col gap-4 items-center w-96 h-52 justify-center cursor-pointer hover:shadow-xl transition ease-in-out duration-300" > Assignments {assignments.filter((a) => !a.archived).length}
Latest students
{users .filter(studentFilter) .sort((a, b) => dateSorter(a, b, "desc", "registrationDate")) .map((x) => ( ))}
Highest level students
{users .filter(studentFilter) .sort( (a, b) => calculateAverageLevel(b.levels) - calculateAverageLevel(a.levels) ) .map((x) => ( ))}
Highest exam count students
{users .filter(studentFilter) .sort( (a, b) => Object.keys(groupByExam(getStatsByStudent(b))).length - Object.keys(groupByExam(getStatsByStudent(a))).length ) .map((x) => ( ))}
); return ( <> setSelectedUser(undefined)}> <> {selectedUser && (
{ setSelectedUser(undefined); if (shouldReload) reload(); }} onViewStudents={ selectedUser.type === "corporate" || selectedUser.type === "teacher" ? () => setPage("students") : undefined } onViewTeachers={ selectedUser.type === "corporate" ? () => setPage("teachers") : undefined } user={selectedUser} />
)}
{page === "students" && } {page === "groups" && } {page === "assignments" && } {page === "" && } ); }