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/web/src/routes/public/book.lazy.tsx | Pagina de booking |
apps/web/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 |