export const dynamic = 'force-dynamic'; import React from 'react'; import Link from 'next/link'; import { notFound } from 'next/navigation'; import { prisma } from '@/lib/prisma'; import { generateJitsiToken, JITSI_DOMAIN } from '@/lib/jitsi'; import JitsiClassroom from '@/components/classroom/JitsiClassroom'; interface PageProps { params: Promise<{ tenant: string; classId: string }>; searchParams: Promise<{ role?: string; userId?: string }>; } export default async function ClassroomLivePage({ params, searchParams }: PageProps) { const { tenant: tenantSlug, classId } = await params; const { role: queryRole, userId: queryUserId } = await searchParams; // 1. Verify tenant & class session const session = await prisma.classSession.findUnique({ where: { id: classId }, include: { tenant: true, bookings: { include: { user: true }, }, }, }); if (!session || session.tenant.slug !== tenantSlug) { notFound(); } // 2. Resolve user & permissions const isHostRequested = queryRole === 'INSTRUCTOR' || queryRole === 'SUPER_ADMIN'; let user = null; if (queryUserId) { user = await prisma.user.findUnique({ where: { id: queryUserId }, }); } if (!user) { // Select first appropriate user in the tenant matching requested role user = await prisma.user.findFirst({ where: { tenantId: session.tenantId, role: isHostRequested ? { in: ['INSTRUCTOR', 'SUPER_ADMIN'] } : 'CLIENT', }, }); } // Fallback demo user if tenant has no seeded users yet const effectiveUser = user || { id: `guest-${Math.random().toString(36).slice(2, 8)}`, name: isHostRequested ? 'Head Coach' : 'Fitness Member', email: `${isHostRequested ? 'coach' : 'member'}@${tenantSlug}.local`, role: (isHostRequested ? 'INSTRUCTOR' : 'CLIENT') as 'INSTRUCTOR' | 'CLIENT', }; const isHost = effectiveUser.role === 'INSTRUCTOR' || effectiveUser.role === 'SUPER_ADMIN'; // 3. Generate signed Jitsi JWT token for this session const jwtToken = generateJitsiToken({ roomName: session.jitsiRoomId, tenantSlug: session.tenant.slug, user: { id: effectiveUser.id, name: effectiveUser.name || 'Participant', email: effectiveUser.email, role: effectiveUser.role, }, expiresInSeconds: 7200, }); return (
{/* Top Banner Navigation */}
← Exit to Dashboard {session.title} • {session.tenant.name}
Signed in as: {effectiveUser.name} ({effectiveUser.role})
{/* Main Jitsi WebRTC Classroom Container */}
); }