import React, { useState, useEffect } from 'react'; import { Box, Typography, Card, CardContent, Button, CircularProgress, Alert, } from '@mui/material'; import { useNavigate, useParams } from 'react-router-dom'; import { apiService } from '../services/api'; import { useAuth } from '../context/AuthContext'; import { QuestionCard } from '../components/ui/QuestionCard'; import { AnswerOption } from '../components/ui/AnswerOption'; import type { Quiz, Question, UserAnswer } from '../types'; export const QuizPage: React.FC = () => { const navigate = useNavigate(); const { id } = useParams<{ id: string }>(); const { user, updateUser } = useAuth(); const [quiz, setQuiz] = useState(null); const [currentQuestionIndex, setCurrentQuestionIndex] = useState(0); const [answers, setAnswers] = useState([]); const [loading, setLoading] = useState(true); const [submitting, setSubmitting] = useState(false); const [error, setError] = useState(null); useEffect(() => { const fetchQuiz = async () => { if (!id) return; try { const response = await apiService.getQuizById(parseInt(id)); console.log('Quiz response:', response); if (response.success && response.data) { setQuiz(response.data); // Initialize answers const initialAnswers = response.data.questions?.map((q: Question) => ({ question_id: q.id, option_ids: [], })) || []; console.log('Initial answers:', initialAnswers); setAnswers(initialAnswers); } else { setError('Не удалось загрузить викторину'); } } catch (err) { console.error('Error fetching quiz:', err); setError('Произошла ошибка при загрузке викторины'); } finally { setLoading(false); } }; fetchQuiz(); }, [id]); const handleAnswerChange = (questionId: number, optionId: string, isMultiple: boolean) => { console.log('handleAnswerChange called:', { questionId, optionId, isMultiple }); setAnswers(prev => { // Create deep copy to ensure immutability const newAnswers = prev.map(answer => ({ ...answer, option_ids: [...answer.option_ids] })); const answerIndex = newAnswers.findIndex(a => a.question_id === questionId); console.log('Current answers:', prev); console.log('Answer index:', answerIndex); if (answerIndex === -1) return prev; const optionIdNum = parseInt(optionId); if (isMultiple) { const currentOptions = newAnswers[answerIndex].option_ids; const optionIndex = currentOptions.indexOf(optionIdNum); if (optionIndex === -1) { currentOptions.push(optionIdNum); } else { currentOptions.splice(optionIndex, 1); } } else { newAnswers[answerIndex].option_ids = [optionIdNum]; } console.log('Updated answers:', newAnswers); return newAnswers; }); }; const handleNext = () => { if (quiz && currentQuestionIndex < quiz.questions!.length - 1) { setCurrentQuestionIndex(prev => prev + 1); } }; const handlePrevious = () => { if (currentQuestionIndex > 0) { setCurrentQuestionIndex(prev => prev - 1); } }; const handleSubmit = async () => { if (!quiz || !id) return; setSubmitting(true); setError(null); try { const response = await apiService.submitQuiz(parseInt(id), { answers }); if (response.success && response.data) { // Update user balance with earned stars if (response.data.stars_earned > 0) { updateUser({ stars_balance: (user?.stars_balance || 0) + response.data.stars_earned }); } // Navigate to results page navigate('/quiz-result', { state: { result: response.data, quizTitle: quiz.title } }); } else { setError('Не удалось отправить ответы'); } } catch (err) { console.error('Error submitting quiz:', err); setError('Произошла ошибка при отправке ответов'); } finally { setSubmitting(false); } }; if (loading) { return ( ); } if (error || !quiz) { return ( {error || 'Викторина не найдена'} ); } const currentQuestion = quiz.questions?.[currentQuestionIndex]; const currentAnswer = answers.find(a => a.question_id === currentQuestion?.id); const isLastQuestion = currentQuestionIndex === quiz.questions!.length - 1; const canProceed = currentAnswer?.option_ids && currentAnswer.option_ids.length > 0; console.log('Current state:', { currentQuestion, currentAnswer, answers, canProceed }); return ( {/* Header */} {quiz.title} Вопрос {currentQuestionIndex + 1} из {quiz.questions?.length} {/* Question Card */} {/* Answer Options */} {currentQuestion?.options.map((option) => ( { console.log('AnswerOption onSelect called:', optionId); if (currentQuestion) { handleAnswerChange(currentQuestion.id, optionId, currentQuestion.type === 'multiple'); } }} /> ))} {/* Navigation Buttons */} {!isLastQuestion ? ( ) : ( )} ); };