Skip to content

Reservar clase

Ruta: /student?tab=book · Auth: Magic link (alumno)

Calendario visual semanal que muestra los huecos libres del profesor como bloques clicables. El alumno puede seleccionar hasta 5 slots y reservar en batch.


Cuando el alumno tiene un solo paquete activo, se selecciona automaticamente (paso 1 oculto). Cuando ese paquete tiene un solo servicio elegible, se selecciona automaticamente (paso 2 oculto). Resultado: el alumno va directo al calendario sin pasos intermedios.

Si hay multiples opciones, se muestran los selectores.

Paso 1 — Seleccionar enrollment (condicional)

Section titled “Paso 1 — Seleccionar enrollment (condicional)”

Grid de enrollments activos mostrando creditos restantes. Solo visible cuando hay mas de uno.

Paso 2 — Seleccionar servicio (condicional)

Section titled “Paso 2 — Seleccionar servicio (condicional)”

Grid de servicios elegibles filtrados por eligibleServiceIds del enrollment. Solo visible cuando hay mas de uno.

Grid visual tipo calendario con 7 columnas (Lun–Dom) y filas de hora:

ElementoVisualAccion
Slot disponibleBloque verde (emerald)Click para seleccionar/deseleccionar
Slot preferidoBloque ambar con estrellaClick para seleccionar/deseleccionar
Slot seleccionadoBloque primary con checkClick para deseleccionar
Sesion ya reservadaBloque semitransparente con color del servicioSolo informativo
Linea de hora actualLinea roja horizontalSolo informativo

Caracteristicas del calendario:

  • Rango de horas auto-calculado segun los slots disponibles (con 1h padding)
  • Dot verde en el header de los dias que tienen slots
  • Sesiones ya reservadas del alumno visibles como contexto
  • Reglas de media hora con lineas de grid sutiles

Navegacion semanal: Flechas izquierda/derecha. Siempre Lun–Dom completo.

Selector de timezone: Dropdown compacto para ajustar zona horaria.

Toggle para mostrar/editar preferencias horarias del alumno:

  • Selectores de hora inicio/fin (intervalos de 30 min)
  • Selector de dias de la semana (7 toggles Lun–Dom)
  • Los slots que coinciden muestran estrella ambar en el calendario
  • Leyenda con tooltip auto-show en primera visita (6s, localStorage)

El alumno puede seleccionar hasta 5 slots en la misma semana o semanas diferentes. Barra de confirmacion inferior muestra:

  • Nombre del servicio + conteo de slots seleccionados
  • Chips con fecha/hora de cada slot (removibles con X)
  • Boton de reserva (single endpoint si 1, batch si >1)

Checkmark + mensaje de exito + boton “Reservar otra”.


ArchivoProposito
apps/app/src/components/student/tab-book.tsxTab de reserva completo
apps/app/src/components/student/booking-calendar.tsxComponente BookingCalendar — grid visual
EndpointMetodoProposito
/student/teacherGETInfo del profesor + servicios
/student/enrollmentsGETEnrollments activos del alumno
/student/preferred-hoursGET/PATCHPreferencias horarias
/student/sessionsGETSesiones de la semana (para mostrar en calendario)
/public/:slug/service-availabilityGETSlots disponibles (con flag isPreferred)
/student/sessionsPOSTReservar sesion individual
/student/sessions/batchPOSTReservar multiples sesiones
interface BookingCalendarProps {
weekDays: Date[]; // 7 Date objects (Mon-Sun)
slots: AvailableSlot[]; // Available slots from API
selectedSlots: AvailableSlot[]; // Currently selected
onSlotToggle: (slot) => void;
bookedSessions?: BookedSession[]; // Student's existing sessions
hasPreferredHours?: boolean;
isLoading?: boolean;
timezone: string; // IANA timezone
}

Grid constants: HOUR_HEIGHT = 56px, auto-fit hour range based on slot data.