# US-ACT-007: Sistema de feedback básico **Épica:** EAI-002 - Actividades Básicas Hardcodeadas **Sprint:** Mes 1, Semana 4 **Story Points:** 5 SP **Presupuesto:** $1,800 MXN **Prioridad:** Alta (Alcance Inicial) **Estado:** ✅ Completada (Mes 1) --- ## Descripción Como **estudiante**, quiero **recibir feedback claro e inmediato al responder actividades** para **entender mis aciertos y errores de forma educativa**. **Contexto del Alcance Inicial:** Sistema centralizado de feedback para todas las mecánicas. Mensajes pre-cargados, explicaciones hardcodeadas, y animaciones simples. NO usa IA para generar feedback personalizado. --- ## Criterios de Aceptación - [ ] **CA-01:** Feedback inmediato al enviar respuesta (< 1 segundo) - [ ] **CA-02:** Mensaje "Correcto" con animación positiva (confetti, check verde) - [ ] **CA-03:** Mensaje "Incorrecto" con animación neutra (sin penalización negativa) - [ ] **CA-04:** Explicación educativa de la respuesta correcta - [ ] **CA-05:** Visualización de XP y monedas ganadas - [ ] **CA-06:** Botón para continuar a siguiente actividad - [ ] **CA-07:** Mensajes motivacionales aleatorios - [ ] **CA-08:** Feedback adaptado según tipo de actividad --- ## Especificaciones Técnicas ### Backend **Mensajes Motivacionales:** ```typescript const MOTIVATIONAL_MESSAGES = { correct: [ '¡Excelente trabajo! Sigues avanzando como un verdadero sabio maya.', '¡Correcto! Tu conocimiento crece como las pirámides mayas.', '¡Muy bien! Los antiguos mayas estarían orgullosos.', '¡Perfecto! Continúa tu camino al conocimiento.', ], incorrect: [ 'No te preocupes, cada error es una oportunidad para aprender.', 'Sigue intentando, estás en el camino correcto.', 'Aprender requiere práctica. ¡Tú puedes!', 'Los sabios mayas también comenzaron desde cero.', ] } // En el servicio class FeedbackService { generateFeedback(isCorrect: boolean, explanation: string, xpEarned: number, coinsEarned: number) { const messages = isCorrect ? MOTIVATIONAL_MESSAGES.correct : MOTIVATIONAL_MESSAGES.incorrect const randomMessage = messages[Math.floor(Math.random() * messages.length)] return { isCorrect, message: randomMessage, explanation, rewards: isCorrect ? { xp: xpEarned, coins: coinsEarned } : null } } } ``` ### Frontend **Componente de Feedback:** ```typescript // components/activities/FeedbackSection.tsx import { CheckCircleIcon, XCircleIcon } from '@heroicons/react/24/solid' import confetti from 'canvas-confetti' import { useEffect } from 'react' interface FeedbackSectionProps { feedback: { isCorrect: boolean message: string explanation: string rewards?: { xp: number, coins: number } } onContinue: () => void } export function FeedbackSection({ feedback, onContinue }: FeedbackSectionProps) { useEffect(() => { if (feedback.isCorrect) { // Animación de confetti confetti({ particleCount: 100, spread: 70, origin: { y: 0.6 } }) } }, [feedback.isCorrect]) return (
{feedback.message}
{/* Explicación */}Explicación:
{feedback.explanation}
XP Ganado
+{feedback.rewards.xp}
ML Coins
+{feedback.rewards.coins}