Skip to content

Mi Perfil

Ruta: /teacher/profile · Atajo: g f · Sidebar: Mi Perfil

Editor de perfil del profesor con layout configurable de 4 columnas, drag-and-drop para reordenar secciones, score de completitud, estado Super Tutor y analytics integradas.

Profile page
  • Titulo “Mi Perfil”
  • Toggle “Editar Layout” (alterna entre modo vista y edicion)
  • Link “Ver perfil publico” (abre /:slug)

1. Score de completitud:

  • Indicador circular SVG con porcentaje animado
  • Color: verde (>= 80%), warning (50-80%), rojo (< 50%)
  • Checklist de 7 items: nombre, foto, bio (>50 chars), video, especialidades (>= 3), certificaciones (>= 1), idiomas (>= 2)

2. Badge Super Tutor:

  • Badge dorado con estrella si es elegible
  • 4 criterios: perfil >= 80%, completion rate >= 95% (90 dias), >= 10 clases, >= 3 alumnos activos

3. Analytics de perfil:

  • Toggle 7d / 30d
  • 4 metricas: vistas, vistas de video, intentos de booking, tasa de conversion
  • Sparkline (area chart) de tendencia de vistas
  • Mini bar chart de funnel
SeccionContenido
HeroAvatar (96px, upload/delete), nombre, headline, anos experiencia, timezone, URL publica, bio (max 5000). Auto-guardado debounced (2s) para el campo bio via hook useAutoSave
VideoURL YouTube/Vimeo, iframe preview
EspecialidadesTags con nombre + descripcion, add inline
IdiomasBadges idioma + nivel CEFR, add con selects
CertificacionesCards con nombre, materia, emisor, badge verificacion
EducacionCards con titulo, universidad, especializacion, tipo
ExperienciaCards con puesto, empresa, fechas
HobbiesChips inline, add/delete
FAQPreguntas frecuentes. Hasta 20 pares pregunta/respuesta. Inline add form con campo pregunta (max 500) + respuesta (max 2000). Icono HelpCircle. Datos en columna faq JSONB de teachers. Auto-guardado debounced (2s) al editar cualquier pregunta o respuesta — el hook useAutoSave muestra indicador “Guardando…” / “Guardado” junto al titulo de la seccion
Links socialesLinkedIn, Instagram, YouTube, X/Twitter, sitio web. Iconos SVG de marca, modos vista y edicion

Secciones de preview (solo en modo edicion)

Section titled “Secciones de preview (solo en modo edicion)”
SeccionPreview
BookingSettings rapidos de trial (tipo, duracion, buffer, notice, dias). Links a widgets/settings
StorefrontToggles de visibilidad por servicio (public/unlisted/private). Link a servicios
ReviewsRating medio, total, tasa de respuesta, distribucion

Card informativa que muestra la URL personal del profesor con ?ref=direct:

  • URL copiable: pinteach.com/profesores/{slug}?ref=direct
  • Boton “Copiar enlace” con feedback “Copiado”
  • Texto explicativo: los alumnos que lleguen por este enlace son del profesor, sin comision
  • Aparece antes de las secciones del perfil
  • Secciones arrastrables con dnd-kit (PointerSensor, 5px activation)
  • Toolbar flotante por seccion: drag handle, icono, nombre, picker de columnas (1-4), toggle visibilidad
  • Overlay azul durante drag
  • Secciones ocultas colapsan a placeholder con borde discontinuo
  • Al soltar: PUT /api/teacher/profile/layout guarda orden + visibilidad + columnas
  • Overlay con icono de camara
  • Max 1.5MB, data URI almacenado en DB
  • Botones guardar/cancelar/eliminar
  • Certificaciones y educacion tienen badge de verificacion
  • Boton “Request Verification” si no verificado
  • Badge verde “Verified” si verificado

FeatureDescripcionEstadoImplementado
Auto-guardado de borradoresLas secciones Bio y FAQ usan el hook useAutoSave para guardar automaticamente con debounce de 2s. Indicador visual “Guardando…” / “Guardado” junto al tituloBatch 3
Layout responsive por breakpointLa configuracion de columnas es global. No se puede tener 4 columnas en desktop y 1 en movil con orden diferente (el responsive es automatico)Aplazado

BugDescripcionEstadoCorregido
Avatar almacenado como data URILa foto se guarda como data URI en avatarUrl de la DB. Con muchos profesores, infla la tabla teachers. Fix: subir a storage externo (S3/R2) y guardar solo la URLAplazadoRequiere S3/R2 storage migration
Hobbies como array de stringsLos hobbies se gestionaban via bulk update del campo about, lo cual era fragil. FIXED: HobbiesSection component with dedicated add/remove UI, badge pills with delete button, Enter key support. API: PATCH /teacher/profile/about with hobbies: string[]Batch 4

MejoraDescripcionDificultadEstadoImplementado
Storage externo para avataresMigrar de data URI a Cloudflare R2 o S3. Guardar URL en DB. Reduce tamano de tabla y mejora performance de queriesMedioAplazado
Auto-guardadoBio y FAQ tienen auto-guardado debounced con hook useAutoSaveMedioBatch 3
Preview del perfil publico inlineVista previa embebida del perfil publico dentro del editor, actualizada en tiempo real mientras se editaMedioImplementado ✅

ArchivoProposito
apps/web/src/routes/teacher/profile.lazy.tsxPagina completa (1850+ lineas)
apps/api/src/services/teacher/profile-service.tsCRUD de perfil
apps/api/src/services/teacher/profile-analytics-service.tsAnalytics de perfil
apps/api/src/routes/teacher/profile.tsRutas HTTP
packages/shared/src/schemas/teacher-profile.tsSchemas layout + perfil
EndpointMetodoProposito
/teacher/profileGETPerfil completo
/teacher/profile/aboutPATCHActualizar bio, nombre, hobbies
/teacher/profile/photoPOST/DELETEUpload/eliminar avatar
/teacher/profile/videoPATCHActualizar URL video
/teacher/profile/layoutPUTGuardar layout (orden, cols, visibilidad)
/teacher/profile/super-tutorGETEstado y criterios Super Tutor
/teacher/profile/analyticsGETMetricas de perfil (7d/30d)
/teacher/profile/subjectsPOST/PATCH/DELETECRUD especialidades
/teacher/profile/languagesPOST/PATCH/DELETECRUD idiomas
/teacher/profile/certificationsPOST/PATCH/DELETECRUD certificaciones
/teacher/profile/educationPOST/PATCH/DELETECRUD educacion
/teacher/profile/experiencePOST/PATCH/DELETECRUD experiencia
/teacher/profile/analytics/views-trendGETDatos de tendencia de vistas para sparkline
/teacher/profile/certifications/:id/request-verificationPOSTSolicitar verificacion de certificacion
/teacher/profile/education/:id/request-verificationPOSTSolicitar verificacion de titulo
/teacher/profile/social-linksPATCHActualizar links sociales (LinkedIn, Instagram, YouTube, X, sitio web)
/teacher/profile/faqPATCHReemplazar array de FAQ (max 20 items). Body: { faq: [{ question, answer }] }