# DELEGACION: Frontend-Agent - Sprint P2
**Proyecto:** GAMILIT
**Fecha:** 2025-12-05
**De:** Requirements-Analyst
**Para:** Frontend-Agent
**Sprint:** P2-A, P2-B, P2-C
---
## CONTEXTO
El Sprint P1 ha sido completado exitosamente con ~12 componentes nuevos para el sistema de amigos. El proyecto ahora esta al 75% de completitud. Se requiere que Frontend-Agent complete las siguientes tareas para cerrar gaps criticos en portales Teacher y Admin.
## PREREQUISITOS COMPLETADOS
- [x] Sprint P1 - Componentes Friends implementados (7 componentes)
- [x] Sprint P1 - TeacherProgressPage mejorada
- [x] Sprint P1 - Avatar Upload implementado
- [x] Backend APIs disponibles para todas las tareas
---
## TAREAS ASIGNADAS
### Sprint P2-A (Prioridad P0/P1)
#### FE-P2-001 a FE-P2-010: Eliminar Mock-Teacher-ID
**Story:** US-P2-001
**SP:** 3
**Prioridad:** P0
**Archivos a modificar:**
1. `apps/frontend/src/features/teacher/pages/TeacherDashboardPage.tsx` (linea 45)
2. `apps/frontend/src/features/teacher/pages/TeacherStudentsPage.tsx` (linea 38)
3. `apps/frontend/src/features/teacher/pages/TeacherProgressPage.tsx` (linea 52)
4. `apps/frontend/src/features/teacher/pages/TeacherActivitiesPage.tsx` (linea 41)
5. `apps/frontend/src/features/teacher/pages/TeacherGamificationPage.tsx` (linea 47)
6. `apps/frontend/src/features/teacher/pages/TeacherNotificationsPage.tsx` (linea 35)
7. `apps/frontend/src/features/teacher/pages/TeacherCalendarPage.tsx` (linea 43)
8. `apps/frontend/src/features/teacher/pages/TeacherAnalyticsPage.tsx` (linea 56)
9. `apps/frontend/src/features/teacher/pages/TeacherMissionsPage.tsx` (linea 39)
10. `apps/frontend/src/features/teacher/pages/TeacherClassroomsPage.tsx` (linea 44)
**Patron de correccion:**
```typescript
// ANTES (incorrecto)
const userId = user?.id || 'mock-teacher-id';
// DESPUES (correcto)
const { user, isLoading } = useAuth();
if (isLoading) return ;
if (!user?.id) {
navigate('/login');
return null;
}
const userId = user.id;
```
**Recomendacion:** Crear hook `useAuthenticatedUser()` reutilizable.
---
#### FE-P2-011 a FE-P2-014: Transformacion Snake/Camel
**Story:** US-P2-002
**SP:** 3
**Prioridad:** P0
**Archivos a crear:**
```
apps/frontend/src/utils/
├── transformKeys.ts
├── intervalToMinutes.ts
└── index.ts (actualizar)
```
**Implementacion transformKeys.ts:**
```typescript
export function snakeToCamel(obj: Record): Record {
if (Array.isArray(obj)) {
return obj.map(snakeToCamel);
}
if (obj !== null && typeof obj === 'object') {
return Object.keys(obj).reduce((acc, key) => {
const camelKey = key.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());
acc[camelKey] = snakeToCamel(obj[key]);
return acc;
}, {} as Record);
}
return obj;
}
export function camelToSnake(obj: Record): Record {
// Implementacion inversa
}
```
**Integrar en axios interceptors:**
```typescript
// apps/frontend/src/config/axios.config.ts
axios.interceptors.response.use((response) => {
response.data = snakeToCamel(response.data);
return response;
});
axios.interceptors.request.use((config) => {
if (config.data) {
config.data = camelToSnake(config.data);
}
return config;
});
```
---
#### FE-P2-015 a FE-P2-020: Tipos Canonicos
**Story:** US-P2-003
**SP:** 5
**Prioridad:** P0
**Archivos a crear/modificar:**
1. `apps/frontend/src/types/userStats.ts` (nuevo)
```typescript
export interface UserStats {
id: string;
userId: string;
totalXp: number;
totalMlCoins: number;
currentRank: MayaRank;
currentLevel: number;
exercisesCompleted: number;
correctAnswers: number;
totalAnswers: number;
studyTimeMinutes: number;
currentStreak: number;
longestStreak: number;
lastActivityAt: Date;
createdAt: Date;
updatedAt: Date;
}
```
2. `apps/frontend/src/types/classroom.ts` (actualizar)
- Agregar campos: maxStudents, isActive, metadata, createdBy, academicYear
3. `apps/frontend/src/types/user.ts` (actualizar)
- Agregar campos: lastLogin, metadata, isVerified
4. `apps/frontend/src/types/exerciseSubmission.ts` (nuevo)
- Crear discriminated unions por tipo de ejercicio
5. `apps/frontend/src/types/achievement.ts` (actualizar)
- Estandarizar naming: unlockedAt (no dateUnlocked)
---
#### FE-ADMIN-001 a FE-ADMIN-005: AdminRolesPage
**Story:** US-ADMIN-P2-001
**SP:** 8
**Prioridad:** P1
**Componentes a crear:**
```
apps/frontend/src/apps/admin/components/roles/
├── RolesTable.tsx
├── RoleEditor.tsx
├── PermissionMatrix.tsx
└── index.ts
```
**Hooks a usar:** `useRoles`, `useRolePermissions` (ya existen)
**Endpoints:**
- GET /admin/roles
- GET /admin/roles/:id
- POST /admin/roles
- PUT /admin/roles/:id
- DELETE /admin/roles/:id
---
#### FE-ADMIN-006 a FE-ADMIN-010: AdminInstitutionsPage
**Story:** US-ADMIN-P2-002
**SP:** 8
**Prioridad:** P1
**Componentes a crear:**
```
apps/frontend/src/apps/admin/components/institutions/
├── InstitutionsTable.tsx
├── InstitutionFilters.tsx
├── InstitutionDetailModal.tsx
├── InstitutionStats.tsx
└── index.ts
```
**Hook a usar:** `useOrganizations` (ya existe)
---
### Sprint P2-B (Prioridad P1)
#### FE-TEACHER-001: Habilitar TeacherCommunicationPage
**Story:** US-TEACHER-P2-001
**SP:** 3
**Acciones:**
1. Modificar `apps/frontend/src/features/teacher/constants/featureFlags.ts`
2. Cambiar `SHOW_COMMUNICATION: true`
3. Verificar que componentes funcionan correctamente
4. Agregar tests basicos
---
#### FE-TEACHER-002: Habilitar TeacherContentPage
**Story:** US-TEACHER-P2-002
**SP:** 3
**Acciones:**
1. Cambiar `SHOW_CONTENT: true` en featureFlags.ts
2. Verificar integracion con backend
3. Agregar tests basicos
---
#### FE-TEACHER-003: Implementar TeacherResourcesPage
**Story:** US-TEACHER-P2-003
**SP:** 8
**Componentes a crear:**
```
apps/frontend/src/features/teacher/pages/TeacherResourcesPage/
├── TeacherResourcesPage.tsx
├── ResourcesGrid.tsx
├── ResourceUploader.tsx
├── ResourceCard.tsx
└── index.ts
```
**Funcionalidades:**
- Subir archivos (PDF, DOCX, imágenes)
- Organizar por carpetas/categorias
- Compartir con estudiantes/aulas
- Preview de documentos
---
#### FE-ADMIN-011 a FE-ADMIN-016: AdminAdvancedPage
**Story:** US-ADMIN-P2-003
**SP:** 13
**Componentes a crear:**
```
apps/frontend/src/apps/admin/components/advanced/
├── FeatureFlagsPanel.tsx
├── FeatureFlagEditor.tsx
├── RolloutSlider.tsx
├── TargetingConfig.tsx
├── ABTestingDashboard.tsx
└── index.ts
```
**Hook a crear:** `useFeatureFlags`
---
### Sprint P2-C (Prioridad P2)
#### FE-M4-001: Drag-Drop Infografia
**Story:** US-M4-P2-002
**SP:** 5
**Archivo:** `apps/frontend/src/features/mechanics/module4/InfografiaInteractiva.tsx`
**Acciones:**
1. Reemplazar click-to-reveal con drag-drop
2. Usar libreria como @dnd-kit/core
3. Mantener fallback para dispositivos tactiles
---
#### FE-M4-002: Penalizacion Tiempo Quiz
**Story:** US-M4-P2-003
**SP:** 3
**Archivo:** `apps/frontend/src/features/mechanics/module4/QuizTikTok.tsx`
**Linea:** 145
**Acciones:**
1. Implementar penalizacion de puntuacion por tiempo
2. Formula: score = baseScore * (1 - timeElapsed/totalTime * 0.5)
3. Mostrar indicador visual de penalizacion
---
#### FE-M5-001: Secciones Cronometradas Video
**Story:** US-M5-P2-002
**SP:** 5
**Archivo:** `apps/frontend/src/features/mechanics/module5/VideoCartaCurie.tsx`
**Acciones:**
1. Dividir grabacion en 4 secciones
2. Introduccion: 30s
3. Mensaje Principal: 90s
4. Reflexiones: 45s
5. Cierre: 15s
6. Mostrar timer por seccion
---
## RESUMEN DE TAREAS
| ID | Tarea | SP | Sprint | Prioridad |
|----|-------|-----|--------|-----------|
| FE-P2-001-010 | Eliminar mocks | 3 | P2-A | P0 |
| FE-P2-011-014 | Transform snake/camel | 3 | P2-A | P0 |
| FE-P2-015-020 | Tipos canonicos | 5 | P2-A | P0 |
| FE-ADMIN-001-005 | AdminRolesPage | 8 | P2-A | P1 |
| FE-ADMIN-006-010 | AdminInstitutionsPage | 8 | P2-A | P1 |
| FE-TEACHER-001 | Communication Page | 3 | P2-B | P1 |
| FE-TEACHER-002 | Content Page | 3 | P2-B | P1 |
| FE-TEACHER-003 | Resources Page | 8 | P2-B | P1 |
| FE-ADMIN-011-016 | AdminAdvancedPage | 13 | P2-B | P1 |
| FE-M4-001 | Drag-drop infografia | 5 | P2-C | P2 |
| FE-M4-002 | Penalizacion tiempo | 3 | P2-C | P2 |
| FE-M5-001 | Secciones video | 5 | P2-C | P2 |
**Total Frontend P2:** 67 SP
---
## ARCHIVOS DE REFERENCIA
- Analisis completo: `orchestration/agentes/requirements-analyst/ANALISIS-ALCANCES-P2-POST-SPRINT-P1-2025-12-05.md`
- Historias P0: `orchestration/agentes/requirements-analyst/historias-usuario/US-P2-CRITICAS.md`
- Historias Admin: `orchestration/agentes/requirements-analyst/historias-usuario/US-P2-ADMIN.md`
---
## CRITERIOS DE ACEPTACION GENERALES
- [ ] Componentes con TypeScript estricto
- [ ] Tests unitarios para componentes criticos
- [ ] Responsive design verificado
- [ ] Accesibilidad basica (ARIA labels)
- [ ] Sin errores en npm run lint
- [ ] Build exitoso
---
**Generado por:** Requirements-Analyst
**Fecha:** 2025-12-05
**Revision:** Despues de Sprint P2-A