/* eslint-disable @next/next/no-img-element */ import UserDisplayList from "@/components/UserDisplayList"; import IconCard from "@/components/IconCard"; import { EntityWithRoles } from "@/interfaces/entity"; import { Stat, StudentUser, Type, User } from "@/interfaces/user"; import { sessionOptions } from "@/lib/session"; import { filterBy, mapBy, redirect, serialize } from "@/utils"; import { requestUser } from "@/utils/api"; import { countEntitiesAssignments } from "@/utils/assignments.be"; import { getEntitiesWithRoles } from "@/utils/entities.be"; import { countGroupsByEntities } from "@/utils/groups.be"; import { checkAccess, groupAllowedEntitiesByPermissions, } from "@/utils/permissions"; import { groupByExam } from "@/utils/stats"; import { countAllowedUsers, getUsers, } from "@/utils/users.be"; import { withIronSessionSsr } from "iron-session/next"; import moment from "moment"; import Head from "next/head"; import { useRouter } from "next/router"; import { useMemo } from "react"; import { BsClock, BsEnvelopePaper, BsPencilSquare, BsPeople, BsPeopleFill, BsPersonFill, BsPersonFillGear, } from "react-icons/bs"; import { ToastContainer } from "react-toastify"; import { useAllowedEntities } from "@/hooks/useEntityPermissions"; import { isAdmin } from "@/utils/users"; interface Props { user: User; students: StudentUser[]; latestStudents: User[]; latestTeachers: User[]; userCounts: { [key in Type]: number }; entities: EntityWithRoles[]; assignmentsCount: number; stats: Stat[]; groupsCount: number; } 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", "corporate"])) return redirect("/"); const entityIDS = mapBy(user.entities, "id") || []; const entities = await getEntitiesWithRoles( isAdmin(user) ? undefined : entityIDS ); const { ["view_students"]: allowedStudentEntities, ["view_teachers"]: allowedTeacherEntities, } = groupAllowedEntitiesByPermissions(user, entities, [ "view_students", "view_teachers", ]); const allowedStudentEntitiesIDS = mapBy(allowedStudentEntities, "id"); const entitiesIDS = mapBy(entities, "id") || []; const students = await getUsers( { type: "student", "entities.id": { $in: allowedStudentEntitiesIDS } }, 10, { averageLevel: -1 }, { id: 1, name: 1, email: 1, profilePicture: 1 } ); const latestStudents = await getUsers( { type: "student", "entities.id": { $in: allowedStudentEntitiesIDS } }, 10, { registrationDate: -1 }, { id: 1, name: 1, email: 1, profilePicture: 1 } ); const latestTeachers = await getUsers( { type: "teacher", "entities.id": { $in: mapBy(allowedTeacherEntities, "id") }, }, 10, { registrationDate: -1 }, { id: 1, name: 1, email: 1, profilePicture: 1 } ); const userCounts = await countAllowedUsers(user, entities); const assignmentsCount = await countEntitiesAssignments( entitiesIDS, { archived: { $ne: true } } ); const groupsCount = await countGroupsByEntities(entitiesIDS); return { props: serialize({ user, students, latestStudents, latestTeachers, userCounts, entities, assignmentsCount, groupsCount, }), }; }, sessionOptions); export default function Dashboard({ user, students, latestStudents, latestTeachers, userCounts, entities, assignmentsCount, stats = [], groupsCount, }: Props) { const totalCount = useMemo( () => userCounts.corporate + userCounts.mastercorporate + userCounts.student + userCounts.teacher, [userCounts] ); const totalLicenses = useMemo( () => entities.reduce( (acc, curr) => acc + parseInt(curr.licenses.toString()), 0 ), [entities] ); const allowedEntityStatistics = useAllowedEntities( user, entities, "view_entity_statistics" ); const allowedStudentPerformance = useAllowedEntities( user, entities, "view_student_performance" ); const router = useRouter(); return ( <>