Skip to content

Booking

Ruta: /book/:slug · Auth: Ninguna (publica)

Pagina de reserva independiente que tambien funciona como widget embebible via iframe. Permite a nuevos alumnos reservar sesiones de prueba.


Modo Estilo
Standalone Centrado max-w-lg, padding superior, fondo gris claro
Embed Transparente, padding minimo, resize via postMessage

Deteccion de embed: window.self !== window.top o parametro ?embed=true

Paso 1 — Calendario:

  • Tab bar multi-servicio (si hay mas de 1 trial, muestra opciones por duracion)
  • Navegacion semanal con flechas (max 4 semanas)
  • Grid de 7 dias con indicador de dia actual
  • Dias sin slots deshabilitados/muted
  • Zona horaria con offset GMT
  • Slots agrupados por periodo (manana/tarde/noche con iconos)
  • Fallback: “No hay slots” + “Probar proxima semana”

Paso 2 — Formulario:

  • Resumen de seleccion (fecha, hora, duracion) en caja primary-50
  • Campos: Nombre (requerido), Email (requerido), Telefono, Nivel CEFR, Objetivos
  • Boton submit (deshabilitado hasta nombre+email)
  • Display de errores
Evento Cuando
pinteach:resize Cambio de altura del contenido
pinteach:booking_created Reserva completada exitosamente
  • embed=true — Modo embed
  • theme=dark — Forzar modo oscuro
  • lang=es|en — Forzar idioma

“Powered by PinTeach” — link externo en embeds, texto en standalone.


Feature Descripcion Estado Implementado
Anadir a calendario (.ics) Boton “Anadir a tu calendario” despues de reservar exitosamente. Genera archivo .ics descargable con los datos de la sesion ✅ Batch 4
Selector de timezone Dropdown de timezone manual junto al display de GMT offset. El alumno puede cambiar su timezone si viaja ✅ Batch 4
Preview de politica de cancelacion Se muestra texto “Puedes cancelar hasta X horas antes” calculado desde la politica del servicio seleccionado ✅ Batch 4
Proteccion anti-bot (honeypot) Campo honeypot invisible en el formulario publico para detectar bots ✅ Batch 4
Multi-slot booking Permitir reservar varias sesiones en una sola operacion para alumnos recurrentes Implementado ✅

Bug Descripcion Estado Corregido
Nivel CEFR sin validacion El dropdown de nivel tenia default vacio sin error de validacion. Se podia enviar sin seleccionar nivel ✅ Batch 4
Textarea de objetivos sin contador El campo de objetivos ya muestra contador de caracteres restantes con warning ambar al 90% de capacidad. No era un bug real ✅ Batch 4

Mejora Descripcion Dificultad Estado Implementado
Boton “Anadir a calendario” Genera archivo .ics descargable despues de la reserva exitosa Facil ✅ Batch 4
reCAPTCHA o honeypot Campo honeypot invisible para proteccion anti-bot Medio ✅ Batch 4
Preview de politica Muestra texto de cancelacion calculado desde la politica del servicio Facil ✅ Batch 4

Archivo Proposito
apps/app/src/routes/public/book.lazy.tsx Pagina de booking
apps/app/src/components/booking/booking-widget.tsx Widget de reserva (2 pasos)
Endpoint Metodo Proposito
/public/:slug GET Perfil minimo del profesor
/public/:slug/service-availability GET Slots disponibles
/public/:slug/trial POST Reservar trial