import { useState, useEffect } from "react"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Progress } from "@/components/ui/progress"; import { useExerciseWords } from "@/hooks/phonics/useExerciseAttempt"; import { useUpdatePhonicsProgress } from "@/hooks/phonics/usePhonicsProgress"; import { ExerciseFactory } from "./exercises/ExerciseFactory"; import { Timer } from "lucide-react"; import type { PhonicsExercise, PhonicsWord } from "@/types/phonics"; import { cn } from "@/lib/utils"; interface ExercisePlayerProps { exercise: PhonicsExercise; studentId: string; onComplete: () => void; onExit: () => void; } export function ExercisePlayer({ exercise, studentId, onComplete, onExit }: ExercisePlayerProps) { const [currentStep, setCurrentStep] = useState(0); const [score, setScore] = useState(0); const [timeSpent, setTimeSpent] = useState(0); const [answers, setAnswers] = useState([]); const [mistakes, setMistakes] = useState([]); const [showFeedback, setShowFeedback] = useState(false); const [lastAnswerCorrect, setLastAnswerCorrect] = useState(null); const { data: exerciseWords, isLoading } = useExerciseWords(exercise.id); const updateProgress = useUpdatePhonicsProgress(); useEffect(() => { const timer = setInterval(() => { setTimeSpent((prev) => prev + 1); }, 1000); return () => clearInterval(timer); }, []); const handleAnswer = async (word: string, isCorrect: boolean) => { setLastAnswerCorrect(isCorrect); setShowFeedback(true); if (isCorrect) { setScore((prev) => prev + 1); setAnswers((prev) => [...prev, word]); } else { setMistakes((prev) => [...prev, word]); } // Aguardar feedback antes de prosseguir await new Promise(resolve => setTimeout(resolve, 1500)); setShowFeedback(false); if (currentStep < (exerciseWords?.length || 0) - 1) { setCurrentStep((prev) => prev + 1); } else { handleComplete(); } }; const handleComplete = async () => { const finalScore = score / (exerciseWords?.length || 1); const stars = Math.ceil(finalScore * 3); await updateProgress.mutateAsync({ studentId, exerciseId: exercise.id, attempts: 1, bestScore: finalScore, lastScore: finalScore, completed: finalScore >= exercise.requiredScore, stars, xpEarned: Math.round(finalScore * exercise.points) }); onComplete(); }; if (isLoading || !exerciseWords?.length) { return (
Carregando exercício...
); } const progress = ((currentStep + 1) / exerciseWords.length) * 100; const currentWord = exerciseWords[currentStep].word as unknown as PhonicsWord; return (
{exercise.title}
{Math.floor(timeSpent / 60)}:{(timeSpent % 60).toString().padStart(2, '0')}
Exercício {currentStep + 1} de {exerciseWords.length}
{showFeedback && (
{lastAnswerCorrect ? "Muito bem!" : "Tente novamente na próxima!"}
)}
); }