Skip to content

Tienda

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

Pagina de compra de servicios del profesor. Muestra los paquetes disponibles con precios y redirige a Stripe Checkout para el pago. El profesor controla que servicios se muestran.


Grid responsive (3 columnas lg, 2 sm, 1 movil) con tarjetas de servicio:

  • Nombre del servicio + headline
  • Descripcion completa del servicio
  • Numero de creditos
  • Dias de validez (si aplica)
  • Precio grande + desglose por clase (ej: “$19.80 por clase”)
  • Boton CTA
  • Servicios de pago: Click en CTA → POST /student/enrollments → redirect a Stripe Checkout → retorno al portal
  • Servicios gratuitos: Click en CTA → enrollment creado inmediatamente → toast de exito

Input para codigo de descuento en el flujo de compra:

  • Validacion via API (POST /public/:slug/validate-discount, rate-limited 10/min)
  • Precio original tachado con precio final visible
  • Descuento server-side antes de Stripe (no usa Stripe Coupons)
  • Soporte para porcentaje y monto fijo, limites de uso, fecha de vigencia

Boton de acceso al Stripe Customer Portal para gestionar suscripciones activas (cancelar, ver historial de pagos, cambiar metodo de pago).

  • Usa Intl.NumberFormat con la moneda del servicio
  • Desglose por clase: precio / creditos
  • Loading: 3 tarjetas skeleton
  • Vacio: Icono de paquete + “No hay paquetes disponibles”
  • Impersonacion: Aviso ambar + boton deshabilitado
  • Error TRIAL_REQUIRED: Enlace directo a la pagina de booking para hacer el trial
  • Stripe redirect timeout: 10s via STRIPE_REDIRECT_TIMEOUT_MS, resetea estado

ArchivoProposito
apps/app/src/components/student/tab-shop.tsxTab de tienda
EndpointMetodoProposito
/student/teacherGETInfo del profesor + servicios disponibles
/student/enrollmentsPOSTCrear enrollment (retorna checkoutUrl si pago)
/public/:slug/validate-discountPOSTValidar codigo de descuento