Medallas — Indice de Documentacion
Feature de sistema de medallas/logros para Trivia Boston. Esta carpeta contiene el diseño completo end-to-end para que otra persona (o un futuro yo) implemente la feature sin ambiguedad.
Resumen ejecutivo (5 lineas)
- 13 medallas en 6 categorias (performance, streaks, speed, persistence, milestones, ranking) con 4 tiers (bronze/silver/gold/platinum), todas verificables contra
trivia_sessionsexistente. - Una sola tabla nueva
trivia_user_medals(user_id, medal_id, earned_at, session_id). El catalogo vive como constante TypeScript ensrc/lib/medals/catalog.tspara garantizar type-safety. - Evaluacion sincrona en server action post-partida:
saveSessionse extiende para correr el evaluator y devolvernewMedalsal cliente en el mismo roundtrip. - UI nueva:
MedalsScreencon grid 2/3-col,MedalCardcon estados locked/unlocked y tilt 3d,MedalUnlockToastcon auto-dismiss,NewMedalsBlockdentro deResultsScreen, todo en estetica Stadium Noir reutilizandoglass-card-elevated,confetti-burstydivider-glow. - Implementacion en 8 fases estimadas en 10-16 horas totales, divisibles en 3 PRs (backend / UI / backfill) para iterar con seguridad.
Tabla de contenidos
| # | Documento | Contenido |
|---|---|---|
| 1 | 01-medal-catalog.md |
Las 13 medallas: id, nombre, descripcion, tier, criterio, icono, color. Convenciones de tiers y resumen cuantitativo. |
| 2 | 02-data-model.md |
Schema Supabase (trivia_user_medals), RLS, queries de referencia, estrategia de evaluacion elegida con justificacion vs otras alternativas. |
| 3 | 03-unlock-logic.md |
Pseudocodigo del evaluator para las 13 medallas, agrupadas por categoria. Input/output del evaluator y edge cases. |
| 4 | 04-ui-design.md |
Layout y animaciones de MedalsScreen, MedalCard, MedalUnlockToast y NewMedalsBlock. Paleta, tipografia, accesibilidad, estados locked/unlocked. |
| 5 | 05-implementation-plan.md |
Roadmap tecnico en 8 fases con paths exactos de archivos nuevos, archivos a modificar, dependencias, riesgos y checklist de smoke test. |
Como usar esta documentacion
- Para entender la feature: leer primero este README y despues
01-medal-catalog.md. - Para implementar: seguir
05-implementation-plan.mden orden, consultando los otros docs segun la fase (02para schema,03para el evaluator,04para UI). - Para agregar una medalla nueva: editar
01-medal-catalog.md, agregar la regla en03-unlock-logic.md, y despues reflejar los cambios ensrc/lib/medals/catalog.tsysrc/lib/medals/evaluator.ts. No requiere migracion de DB. - Para cambiar la estrategia de evaluacion: revisar la tabla comparativa en
02-data-model.mdseccion "Estrategia de evaluacion" antes de proponer un cambio.
Decisiones clave (resumen)
- Catalogo en codigo, no en DB — type-safety y cero round-trips para metadata estatica.
- Evaluacion sincrona en
saveSession— single source of truth, toast inmediato, idempotencia garantizada por el unique constraint. - Una query agregada para 11/13 medallas — la query de ranking solo se ejecuta si el usuario aun no tiene las medallas de ranking.
king-of-the-weeksolo cuenta semanas cerradas — previene flapping durante la semana en curso.- Medallas nunca se revocan — simplifica el modelo mental y evita bugs en edge cases.
- Backfill como fase separada — deployeable despues, con
--dry-runpara validar.
Archivos del proyecto referenciados
Archivos existentes que la implementacion tocara (paths absolutos desde el root del repo):
src/app/actions/sessions.ts— extender return connewMedals.src/components/ResultsScreen.tsx— agregar bloque y toast.src/components/StartScreen.tsx— agregar boton "Mis medallas".src/components/TriviaGame.tsx— manejar phase'medals'.src/hooks/useGameState.ts— agregarshowMedals()yhighlightedMedalIds.src/types/game.ts— extenderGamePhaseyGameState.src/app/globals.css— agregar 4 utility classes de glow por tier.
Archivos nuevos que la implementacion creara:
src/lib/medals/types.tssrc/lib/medals/catalog.tssrc/lib/medals/evaluator.tssrc/lib/medals/queries.tssrc/app/actions/medals.tssrc/components/MedalsScreen.tsxsrc/components/MedalCard.tsxsrc/components/MedalUnlockToast.tsxsrc/components/NewMedalsBlock.tsxsupabase/migrations/<timestamp>_create_trivia_user_medals.sqlscripts/backfill-medals.ts