/* eslint-disable @next/next/no-img-element */ import Input from "@/components/Low/Input"; import Select from "@/components/Low/Select"; import Tooltip from "@/components/Low/Tooltip"; import { useListSearch } from "@/hooks/useListSearch"; import usePagination from "@/hooks/usePagination"; import { EntityWithRoles } from "@/interfaces/entity"; import { User } from "@/interfaces/user"; import { sessionOptions } from "@/lib/session"; import { USER_TYPE_LABELS } from "@/resources/user"; import { filterBy, mapBy, redirect, serialize } from "@/utils"; import { getEntitiesWithRoles } from "@/utils/entities.be"; import { shouldRedirectHome } from "@/utils/navigation.disabled"; import { getUserName, isAdmin } from "@/utils/users"; import { getEntitiesUsers } from "@/utils/users.be"; import axios from "axios"; import clsx from "clsx"; import { withIronSessionSsr } from "iron-session/next"; import moment from "moment"; import Head from "next/head"; import Link from "next/link"; import { useRouter } from "next/router"; import { Divider } from "primereact/divider"; import { useEffect, useMemo, useState } from "react"; import { BsCheck, BsChevronLeft, BsClockFill, BsEnvelopeFill, BsStopwatchFill, } from "react-icons/bs"; import { toast, ToastContainer } from "react-toastify"; import { requestUser } from "@/utils/api"; import { findAllowedEntities } from "@/utils/permissions"; import { capitalize } from "lodash"; export const getServerSideProps = withIronSessionSsr(async ({ req, res }) => { const user = await requestUser(req, res); if (!user) return redirect("/login"); if (shouldRedirectHome(user)) return redirect("/"); const entities = await getEntitiesWithRoles( isAdmin(user) ? undefined : mapBy(user.entities, "id") ); const users = await getEntitiesUsers( mapBy(entities, "id"), { id: { $ne: user.id }, }, 0, { _id: 0, id: 1, name: 1, email: 1, profilePicture: 1, type: 1, corporateInformation: 1, lastLogin: 1, subscriptionExpirationDate: 1, } ); const allowedEntities = findAllowedEntities( user, entities, "create_classroom" ); return { props: serialize({ user, entities: allowedEntities, users: users, }), }; }, sessionOptions); interface Props { user: User; users: User[]; entities: EntityWithRoles[]; } export default function Home({ user, users, entities }: Props) { const [isLoading, setIsLoading] = useState(false); const [selectedUsers, setSelectedUsers] = useState([]); const [name, setName] = useState(""); const [entity, setEntity] = useState(entities[0]?.id); const entityUsers = useMemo( () => !entity ? users : users.filter((u) => mapBy(u.entities, "id").includes(entity)), [entity, users] ); const { rows, renderSearch } = useListSearch( [ ["name"], ["type"], ["corporateInformation", "companyInformation", "name"], ], entityUsers ); const { items, renderMinimal } = usePagination(rows, 16); const router = useRouter(); useEffect(() => setSelectedUsers([]), [entity]); const createGroup = () => { if (!name.trim()) return; if (!entity) return; if ( !confirm( `Are you sure you want to create this group with ${selectedUsers.length} participants?` ) ) return; setIsLoading(true); axios .post<{ id: string }>(`/api/groups`, { name, participants: selectedUsers, admin: user.id, entity, }) .then((result) => { toast.success("Your group has been created successfully!"); router.replace(`/classrooms/${result.data.id}`); }) .catch((e) => { console.error(e); toast.error("Something went wrong!"); }) .finally(() => setIsLoading(false)); }; const toggleUser = (u: User) => setSelectedUsers((prev) => prev.includes(u.id) ? prev.filter((p) => p !== u.id) : [...prev, u.id] ); return ( <> Create Group | EnCoach <>

Create Classroom

Classroom Name:
Entity: