Skip to content

Perfil publico

Ruta Astro: /profesores/:slug (SSR) · Ruta React legacy: /:slug (redirects to Astro) · Auth: Ninguna (publica)

Pagina publica del profesor visible para cualquier visitante. El layout es configurable por el profesor via el editor de perfil con grid de 4 columnas y drag-and-drop.


Layout de 4 columnas (responsive a 1 en movil). Cada seccion puede ocupar 1-4 columnas segun la configuracion del profesor (profileLayout). Las secciones se renderizan en el orden definido en layout.sections y solo las marcadas como visible: true.

SeccionContenido
HeroAvatar, nombre, badge Super Tutor, headline, anos de experiencia, bio
VideoIframe responsive de YouTube/Vimeo
EspecialidadesGrid de badges con color y descripcion
IdiomasBadges con nivel CEFR (A1-C2)
CertificacionesCards verticales con badge de verificacion
EducacionCards con titulo, universidad, especializacion
ExperienciaCards con puesto, empresa, fechas
HobbiesPills inline flex-wrapped
Booking WidgetFormulario de reserva de trial (full width)
ReviewsResenas publicas con paginacion y distribucion de estrellas
StorefrontTarjetas de servicios con tabs por estructura

Formulario de reserva de trial integrado en el perfil:

  • Tab bar multi-servicio (si hay mas de 1 trial)
  • Calendario semanal con slots (4 semanas)
  • Agrupacion por periodo (manana/tarde/noche)
  • Formulario: nombre, email, telefono, nivel CEFR, objetivos
  • Exito: checkmark + mensaje (sin redirect, embed-safe)

Grid de tarjetas de servicios con:

  • Tabs automaticos por estructura (Trial, Clases, Paquetes, Cursos, Suscripciones)
  • Barra de contexto del alumno (si logueado): saludo + creditos
  • Auth gate para compras (magic link)
  • Barra resumen: rating grande + contador + distribucion de estrellas
  • Cards con avatar, nombre, rating, verificacion, source, quick tags
  • Respuesta del profesor (si existe)
  • Reviews destacadas con borde ambar
  • Paginacion (10 por pagina)

Boton “Reservar” flotante bottom-right que aparece via IntersectionObserver cuando la seccion de booking sale del viewport.

El perfil soporta el parametro ?ref=direct para distinguir entre alumnos propios del profesor y leads generados por PinTeach:

URLreferralSourceSignificado
/profesores/maria-garcia?ref=directdirectAlumno propio del profesor (sin comision)
/profesores/maria-garciadirectoryLead de PinTeach (via directorio u organico)

El parametro ref se propaga automaticamente a los CTAs de booking y a las tarjetas de servicio, y llega hasta la API que lo almacena en students.referralSource.

Cadena: [slug].astroBookingCta / ServicesSection → React /book/$slug → API → students.referralSource

Eventos automaticos: page_view, service_click, booking_started, section_view. Enviados via useProfileTracking(slug) a /public/:slug/analytics-events.


FeatureDescripcionEstadoImplementado
Links socialesNueva seccion con iconos de redes sociales (LinkedIn, Instagram, YouTube, X, sitio web). Datos desde teachers.socialLinks JSONBBatch 4
FAQ del profesorSeccion de preguntas frecuentes con accordion colapsable. Datos desde teachers.faq JSONBBatch 4
Badge de disponibilidadIndicador de disponibilidad proxima junto al hero del perfilBatch 4
CTA personalizableEl profesor puede personalizar el texto del boton flotante de reservaBatch 4
Testimonios en videoPermitir a los alumnos subir video-reviews ademas de textoAplazado

BugDescripcionEstadoCorregido
Video iframe sin sandboxEl embed de YouTube/Vimeo ya tiene sandbox="allow-scripts allow-same-origin allow-presentation" en el iframe. No era un bug realBatch 4
Bio renderizada sin sanitizarReact JSX auto-escaping previene XSS. No se usa dangerouslySetInnerHTML. No era un bug realBatch 4

MejoraDescripcionDificultadEstadoImplementado
Agregar links socialesSeccion con iconos de redes sociales, datos desde teachers.socialLinks JSONBFacilBatch 4
Seccion FAQAccordion colapsable con preguntas/respuestas, datos desde teachers.faq JSONBFacilBatch 4
Badge de disponibilidadIndicador de disponibilidad proxima junto al heroMedioBatch 4

ArchivoProposito
apps/pinteach-web/src/pages/profesores/[slug].astroPagina principal del perfil (Astro SSR)
apps/pinteach-web/src/components/profile/20 componentes de seccion (hero, video, services, reviews, FAQ, etc.)
apps/pinteach-web/src/components/BaseHead.astroSEO meta tags, OG, Twitter
apps/pinteach-web/src/components/ProfileHead.astroSchema.org structured data
apps/web/src/routes/public/profile.tsxRedirect legacy /$slug → Astro /profesores/$slug
apps/web/src/components/storefront/5 componentes (card, grid, booking, auth gate, context bar) — usados en booking
apps/web/src/components/reviews/public-reviews-section.tsxReviews publicas en React (legacy, usado en widgets)
EndpointMetodoProposito
/public/:slugGETPerfil completo del profesor
/public/:slug/reviewsGETReviews paginadas
/public/:slug/service-availabilityGETSlots disponibles
/public/:slug/trialPOSTReservar trial (acepta referralSource)
/public/:slug/enrollPOSTComprar servicio (acepta referralSource)
/public/:slug/analytics-eventsPOSTTracking de eventos
ElementoDetalle
<title>{Name} — {Headline} | PinTeach
<meta description>Primeros 160 chars del bio
Open Graphtype=profile, image=avatar
Twitter Cardsummary_large_image
Canonicalhttps://pinteach.com/profesores/{slug}
Schema.orgService + Person + Offer (precio minimo) + AggregateRating
Cache-Controlpublic, s-maxage=300, stale-while-revalidate=600