Resenas
Ruta: /teacher/reviews · Atajo: g r · Sidebar: Resenas
Gestion completa del sistema de resenas: moderar, responder, importar de plataformas externas, solicitar a alumnos y configurar automatizaciones.
Que hay
Section titled “Que hay”5 Tabs
Section titled “5 Tabs”4 KPI Cards:
- Rating medio (estrella, fondo ambar)
- Total de reviews (comentario, fondo azul)
- Tasa de respuesta % (tendencia, fondo verde)
- Este mes (calendario, fondo morado)
Distribucion de ratings: Barras horizontales 5→1 estrellas con conteos.
Reviews recientes: Primeras 5 reviews con cards completas.
Filtros:
- Busqueda full-text (debounced 300ms) por body, titulo, nombre
- Filtro por estado: pending, approved, hidden, flagged
- Filtro por source: pinteach, preply, italki, verbling, google_business, trustpilot, other
Lista paginada (20 por pagina) con review cards completas.
Tabla con columnas: Alumno (avatar+nombre+email), Estado, Canal, Enviada, Completada, Rating.
Merge inteligente: Muestra TODOS los alumnos de la lista de estudiantes con su solicitud mas reciente. Si no se ha enviado solicitud, muestra boton “Enviar” inline.
Filtro por estado: not_sent, pending, completed, expired, dismissed.
Cooldown: Maximo 1 solicitud por alumno cada 7 dias.
Formulario de importacion:
- Source (requerido): preply, italki, verbling, google_business, trustpilot, other
- Nombre del reviewer (requerido)
- Rating (requerido, picker de 5 estrellas)
- Titulo (opcional)
- Body (opcional, max 2000 chars)
- URL externa (opcional)
- Fecha de display (opcional, date picker)
Auto-solicitud:
- Toggle activar auto-solicitud despues de sesiones
- Minutos despues de la sesion (5-1440)
- Sesiones minimas antes de solicitar (1-50)
Moderacion:
- Toggle auto-aprobar
- Rating minimo para auto-aprobar (1-5)
Display:
- Mostrar en perfil publico
- Mostrar reviews externas
- Notificar al profesor en nuevas reviews
Filtros en reviews publicas
Section titled “Filtros en reviews publicas”La seccion publica del perfil (public-reviews-section.tsx) permite filtrar y ordenar reviews:
- Pills de rating: Botones 5, 4, 3, 2, 1 estrellas con comportamiento toggle. Se pueden combinar.
- Dropdown de source: Aparece solo cuando existen 2 o mas fuentes distintas. Opciones generadas dinamicamente desde
availableSources. - Dropdown de orden: Mas recientes / Mejor valoradas / Peor valoradas.
- Limpiar filtros: Enlace que resetea todos los filtros activos.
El backend (listPublic()) acepta source y sortBy como parametros. La consulta de estadisticas (barra resumen) es independiente y siempre devuelve totales sin filtrar.
Review card (componente)
Section titled “Review card (componente)”Cada review muestra:
- Avatar o circulo de inicial
- Nombre (o “Anonimo”)
- 5 estrellas (llenas/vacias)
- Tiempo relativo (“5m”, “2h”, “3d”)
- Badge de verificacion (verde)
- Badge de source (gris, omitido para “pinteach”)
- Badge de estado (amber=pending, gray=hidden, red=flagged)
- Titulo + body
- Quick tags (badges)
- Miniaturas de imagenes (thumbnails 64x64px,
object-cover, max 3) — solo si la review tieneimageUrls - Votacion de utilidad — Boton “Fue util” con contador en reviews publicas. Los visitantes pueden votar una vez por review. El voto se registra en
reviews.helpfulCounty se muestra como “X personas encontraron esto util”. La accion llama aPOST /public/:slug/reviews/:id/helpful. Una cookie previene votos duplicados del mismo visitante. - Respuesta del profesor (caja gris)
- Reviews destacadas: borde ambar + fondo ambar claro
Acciones por review
Section titled “Acciones por review”| Accion | Efecto |
|---|---|
| Aprobar | Estado → approved |
| Ocultar | Estado → hidden (opacity reducida) |
| Destacar | Toggle isFeatured (max 5 por profesor). Si se intenta destacar la 6ta, muestra toast “Maximo 5 reviews destacadas” |
| Responder | Abre formulario de respuesta (max 1000 chars) |
| Eliminar respuesta | Borra teacherResponse |
| Eliminar review | Hard delete con confirmacion |
Que falta
Section titled “Que falta”| Feature | Descripcion | Estado | Implementado |
|---|---|---|---|
| Reviews con imagenes | Los alumnos pueden adjuntar hasta 3 URLs de imagen al enviar su resena via ReviewForm. Se muestran como miniaturas 64x64px en ReviewCard | ✅ | Batch 2 |
| Votacion de utilidad | Boton “Fue util” en reviews publicas con contador helpfulCount. Prevencion de votos duplicados via cookie | ✅ | Batch 3 |
| Limite de destacadas con feedback | Al intentar destacar la 6ta review, se muestra un toast de error. Comprobacion client-side en handleUpdate antes de la mutacion | ✅ | Batch 3 |
| Traduccion automatica | Reviews en otros idiomas no se traducen. Podria integrarse Google Translate para reviews de alumnos internacionales | Aplazado |
Que falla
Section titled “Que falla”No hay bugs conocidos en esta pagina.
Que cambiaria
Section titled “Que cambiaria”| Mejora | Descripcion | Dificultad | Estado | Implementado |
|---|---|---|---|---|
| Filtro por fecha en reviews publicas | Los filtros de rating y source ya estan implementados. Anadir un filtro por rango de fechas completaria la experiencia | Facil | ✅ | Batch 4 |
| Auto-solicitud mejorada | Agregar canal de solicitud configurable (in_app, email, link) y preview del mensaje que recibira el alumno | Medio |
Referencia tecnica
Section titled “Referencia tecnica”Archivos clave
Section titled “Archivos clave”| Archivo | Proposito |
|---|---|
apps/web/src/routes/teacher/reviews.lazy.tsx | Pagina principal (5 tabs) |
apps/web/src/components/reviews/review-card.tsx | Card de review |
apps/web/src/components/reviews/review-response-form.tsx | Formulario de respuesta |
apps/web/src/components/reviews/review-settings-panel.tsx | Panel de configuracion |
apps/web/src/components/reviews/import-review-form.tsx | Formulario de importacion |
apps/web/src/components/reviews/review-form.tsx | Formulario de envio de resena (portal alumno) |
apps/web/src/components/reviews/public-reviews-section.tsx | Seccion de resenas en perfil publico |
apps/api/src/services/reviews/review-service.ts | Servicio principal |
apps/api/src/services/reviews/review-request-service.ts | Solicitudes |
apps/api/src/services/reviews/review-settings-service.ts | Configuracion |
| Endpoint | Metodo | Proposito |
|---|---|---|
/teacher/reviews/stats | GET | KPIs y distribucion |
/teacher/reviews | GET | Lista paginada con filtros |
/public/:slug/reviews | GET | Reviews publicas. Params: source, sortBy (newest/highest/lowest), dateFrom, dateTo. Devuelve availableSources[] |
/teacher/reviews/:id | PATCH/DELETE | Moderar / eliminar |
/teacher/reviews/:id/respond | POST/DELETE | Responder / eliminar respuesta |
/teacher/reviews/import | POST | Importar review externa |
/teacher/reviews/requests | GET | Lista de solicitudes |
/teacher/reviews/requests/send | POST | Enviar solicitud manual |
/teacher/reviews/settings | GET/PATCH | Configuracion |
Imagenes en reviews
Section titled “Imagenes en reviews”- DB:
reviews.imageUrls JSONB— array de URLs de imagen (strings). No hay limite en DB; la restriccion de max 3 se aplica en el formulario de alumno. - Formulario alumno (
ReviewForm): Campo “Step 4” visible tras seleccionar rating. Valida URL valida connew URL(). Muestra previsualizacion 64x64px con boton X para eliminar. Maximo 3 imagenes. Enter en el input llamaaddImageUrl(). - Card (
ReviewCard): Bloque de miniaturas renderizado entre quick tags y la respuesta del profesor. Condicional: solo aparece sireview.imageUrls && review.imageUrls.length > 0. - API: El campo
imageUrlsse envia en el body dePOST /student/sessions/:id/review. El endpoint de listado (GET /teacher/reviews) devuelveimageUrls[]en cada review.
Valores por defecto
Section titled “Valores por defecto”| Parametro | Valor |
|---|---|
| Cooldown entre solicitudes | 7 dias |
| Ventana de edicion de resena | 30 dias |
| Retraso auto-request | 30 minutos |
| Sesiones minimas para solicitar | 1 |
| Maximo imagenes por review | 3 |