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.


ModoEstilo
StandaloneCentrado max-w-lg, padding superior, fondo gris claro
EmbedTransparente, 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
EventoCuando
pinteach:resizeCambio de altura del contenido
pinteach:booking_createdReserva 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.


FeatureDescripcionEstadoImplementado
Anadir a calendario (.ics)Boton “Anadir a tu calendario” despues de reservar exitosamente. Genera archivo .ics descargable con los datos de la sesionBatch 4
Selector de timezoneDropdown de timezone manual junto al display de GMT offset. El alumno puede cambiar su timezone si viajaBatch 4
Preview de politica de cancelacionSe muestra texto “Puedes cancelar hasta X horas antes” calculado desde la politica del servicio seleccionadoBatch 4
Proteccion anti-bot (honeypot)Campo honeypot invisible en el formulario publico para detectar botsBatch 4
Multi-slot bookingPermitir reservar varias sesiones en una sola operacion para alumnos recurrentesImplementado ✅

BugDescripcionEstadoCorregido
Nivel CEFR sin validacionEl dropdown de nivel tenia default vacio sin error de validacion. Se podia enviar sin seleccionar nivelBatch 4
Textarea de objetivos sin contadorEl campo de objetivos ya muestra contador de caracteres restantes con warning ambar al 90% de capacidad. No era un bug realBatch 4

MejoraDescripcionDificultadEstadoImplementado
Boton “Anadir a calendario”Genera archivo .ics descargable despues de la reserva exitosaFacilBatch 4
reCAPTCHA o honeypotCampo honeypot invisible para proteccion anti-botMedioBatch 4
Preview de politicaMuestra texto de cancelacion calculado desde la politica del servicioFacilBatch 4

ArchivoProposito
apps/web/src/routes/public/book.lazy.tsxPagina de booking
apps/web/src/components/booking/booking-widget.tsxWidget de reserva (2 pasos)
EndpointMetodoProposito
/public/:slugGETPerfil minimo del profesor
/public/:slug/service-availabilityGETSlots disponibles
/public/:slug/trialPOSTReservar trial