/* eslint-disable @next/next/no-img-element */ import Head from "next/head"; import {withIronSessionSsr} from "iron-session/next"; import {sessionOptions} from "@/lib/session"; import {ToastContainer} from "react-toastify"; import Layout from "@/components/High/Layout"; import {GroupWithUsers, User} from "@/interfaces/user"; import {shouldRedirectHome} from "@/utils/navigation.disabled"; import {getUserName, isAdmin} from "@/utils/users"; import {convertToUsers, getGroupsForEntities} from "@/utils/groups.be"; import {getSpecificUsers} from "@/utils/users.be"; import Link from "next/link"; import {uniq} from "lodash"; import {BsPlus} from "react-icons/bs"; import CardList from "@/components/High/CardList"; import Separator from "@/components/Low/Separator"; import {mapBy, redirect, serialize} from "@/utils"; import { requestUser } from "@/utils/api"; import { findAllowedEntities } from "@/utils/permissions"; import { getEntities, getEntitiesWithRoles } from "@/utils/entities.be"; import { useAllowedEntities } from "@/hooks/useEntityPermissions"; import { EntityWithRoles } from "@/interfaces/entity"; export const getServerSideProps = withIronSessionSsr(async ({req, res}) => { const user = await requestUser(req, res) if (!user) return redirect("/login") if (shouldRedirectHome(user)) return redirect("/") const entityIDS = mapBy(user.entities, "id"); const entities = await getEntitiesWithRoles(isAdmin(user) ? undefined : entityIDS) const allowedEntities = findAllowedEntities(user, entities, "view_classrooms") const groups = await getGroupsForEntities(mapBy(allowedEntities, 'id')); const users = await getSpecificUsers(uniq(groups.flatMap((g) => [...g.participants.slice(0, 5), g.admin]))); const groupsWithUsers: GroupWithUsers[] = groups.map((g) => convertToUsers(g, users)); return { props: serialize({user, groups: groupsWithUsers, entities: allowedEntities}), }; }, sessionOptions); const SEARCH_FIELDS = [ ["name"], ["admin", "name"], ["admin", "email"], ["admin", "corporateInformation", "companyInformation", "name"], ["participants", "name"], ["participants", "email"], ["participants", "corporateInformation", "companyInformation", "name"], ]; interface Props { user: User; groups: GroupWithUsers[]; entities: EntityWithRoles[] } export default function Home({user, groups, entities}: Props) { const entitiesAllowCreate = useAllowedEntities(user, entities, 'create_classroom') const renderCard = (group: GroupWithUsers) => ( Group: {group.name} Admin: {getUserName(group.admin)} Participants ({group.participants.length}): {group.participants.slice(0, 5).map(getUserName).join(", ")} {group.participants.length > 5 ? and {group.participants.length - 5} more : ""} ); const firstCard = () => ( Create Group ); return ( <> Classrooms | EnCoach

Classrooms

list={groups} searchFields={SEARCH_FIELDS} renderCard={renderCard} firstCard={entitiesAllowCreate.length === 0 ? undefined : firstCard} />
); }