export const dynamic = 'force-dynamic'; import React from 'react'; import Link from 'next/link'; import { notFound } from 'next/navigation'; import { revalidatePath } from 'next/cache'; import { prisma, getTenantPrisma } from '@/lib/prisma'; import { generateJitsiRoomName } from '@/lib/jitsi'; interface PageProps { params: Promise<{ tenant: string }>; } export default async function InstructorClassesPage({ params }: PageProps) { const { tenant: tenantSlug } = await params; const tenant = await prisma.tenant.findUnique({ where: { slug: tenantSlug }, include: { users: { where: { role: { in: ['INSTRUCTOR', 'SUPER_ADMIN'] } }, }, classSessions: { orderBy: { startTime: 'desc' }, include: { bookings: { include: { user: true }, }, }, }, }, }); if (!tenant) { notFound(); } // Server Action to schedule class async function scheduleClassAction(formData: FormData): Promise { 'use server'; const title = formData.get('title') as string; const description = (formData.get('description') as string) || ''; const dateStr = formData.get('date') as string; const timeStr = formData.get('time') as string; const durationMins = parseInt(formData.get('duration') as string, 10) || 60; const capacity = parseInt(formData.get('capacity') as string, 10) || 15; const start = new Date(`${dateStr}T${timeStr}:00`); const end = new Date(start.getTime() + durationMins * 60 * 1000); const timestamp = Date.now(); const tempId = Math.random().toString(36).slice(2, 7); const jitsiRoomId = generateJitsiRoomName(tenantSlug, tempId, timestamp); const tenantPrisma = getTenantPrisma(tenant!.id); await tenantPrisma.classSession.create({ data: { tenantId: tenant!.id, title, description, startTime: start, endTime: end, capacity, jitsiRoomId, }, }); revalidatePath(`/${tenantSlug}/instructor/classes`); revalidatePath(`/${tenantSlug}/classes`); } const defaultDate = new Date().toISOString().split('T')[0]; const defaultTime = '10:00'; return (
{/* Navigation Breadcrumb */}
← Student Class Schedule / Instructor Portal
Tenant: {tenant.name} ({tenant.slug})
{/* Header */}

Live Classroom Management

Schedule virtual workout classes, configure WebRTC room parameters, and launch live unbranded sessions.

{/* Schedule New Class Form */}

Schedule New Virtual Class

{/* Existing Classes List */}

Classroom Sessions ({tenant.classSessions.length})

Deterministic room names with host JWT signing
{tenant.classSessions.length === 0 ? (
No classes scheduled yet. Use the form above to create your first live class session.
) : (
{tenant.classSessions.map((session) => (

{session.title}

Cap: {session.bookings.length} / {session.capacity}
{session.description && (

{session.description}

)}
Start: {new Date(session.startTime).toLocaleString()} • Room: {session.jitsiRoomId}
Start Live Class (Host View) Preview Student View
))}
)}
); }