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 |