@schoolio/player 1.2.1 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/api.ts","../src/utils.ts","../src/QuizPlayer.tsx","../src/AttemptViewer.tsx"],"names":["jsx","useState","useRef","useEffect","useCallback","selectedAnswer","jsxs","defaultStyles"],"mappings":"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","file":"index.js","sourcesContent":["import type { Quiz, ExternalQuizAttempt, QuizAnswerDetail } from './types';\r\n\r\nexport interface ApiClientConfig {\r\n baseUrl: string;\r\n authToken?: string;\r\n}\r\n\r\nexport class QuizApiClient {\r\n private baseUrl: string;\r\n private authToken?: string;\r\n\r\n constructor(config: ApiClientConfig) {\r\n this.baseUrl = config.baseUrl.replace(/\\/$/, ''); // Remove trailing slash\r\n this.authToken = config.authToken;\r\n }\r\n\r\n private async request<T>(\r\n method: string,\r\n endpoint: string,\r\n body?: unknown\r\n ): Promise<T> {\r\n const headers: HeadersInit = {\r\n 'Content-Type': 'application/json',\r\n };\r\n\r\n if (this.authToken) {\r\n headers['Authorization'] = `Bearer ${this.authToken}`;\r\n }\r\n\r\n const response = await fetch(`${this.baseUrl}${endpoint}`, {\r\n method,\r\n headers,\r\n body: body ? JSON.stringify(body) : undefined,\r\n });\r\n\r\n if (!response.ok) {\r\n const error = await response.json().catch(() => ({ error: 'Request failed' }));\r\n throw new Error(error.error || `HTTP ${response.status}`);\r\n }\r\n\r\n return response.json();\r\n }\r\n\r\n async getQuiz(quizId: string): Promise<Quiz> {\r\n return this.request<Quiz>('GET', `/api/external/quizzes/${quizId}`);\r\n }\r\n\r\n async createAttempt(params: {\r\n quizId: string;\r\n lessonId: string;\r\n assignLessonId: string;\r\n courseId: string;\r\n childId: string;\r\n parentId: string;\r\n }): Promise<ExternalQuizAttempt> {\r\n return this.request<ExternalQuizAttempt>('POST', '/api/external/quiz-attempts', params);\r\n }\r\n\r\n async updateAttempt(\r\n attemptId: string,\r\n data: {\r\n answers?: QuizAnswerDetail[];\r\n status?: 'in_progress' | 'completed' | 'abandoned';\r\n score?: number;\r\n correctAnswers?: number;\r\n timeSpentSeconds?: number;\r\n }\r\n ): Promise<ExternalQuizAttempt> {\r\n return this.request<ExternalQuizAttempt>(\r\n 'PATCH',\r\n `/api/external/quiz-attempts/${attemptId}`,\r\n data\r\n );\r\n }\r\n\r\n async getAttempt(attemptId: string): Promise<ExternalQuizAttempt> {\r\n return this.request<ExternalQuizAttempt>('GET', `/api/external/quiz-attempts/${attemptId}`);\r\n }\r\n\r\n async getAttempts(params: {\r\n assignLessonId?: string;\r\n childId?: string;\r\n quizId?: string;\r\n }): Promise<ExternalQuizAttempt[]> {\r\n const queryParams = new URLSearchParams();\r\n if (params.assignLessonId) queryParams.set('assignLessonId', params.assignLessonId);\r\n if (params.childId) queryParams.set('childId', params.childId);\r\n if (params.quizId) queryParams.set('quizId', params.quizId);\r\n\r\n return this.request<ExternalQuizAttempt[]>(\r\n 'GET',\r\n `/api/external/quiz-attempts?${queryParams.toString()}`\r\n );\r\n }\r\n}\r\n","import type { QuizQuestion, QuizAnswerDetail, QuestionType } from './types';\r\n\r\n// Check if an answer is correct based on question type\r\nexport function checkAnswer(\r\n question: QuizQuestion,\r\n selectedAnswer: unknown\r\n): { isCorrect: boolean; pointsEarned: number } {\r\n const { type, correctAnswer, points } = question;\r\n\r\n switch (type) {\r\n case 'single':\r\n case 'true-false': {\r\n const isCorrect = selectedAnswer === correctAnswer;\r\n return { isCorrect, pointsEarned: isCorrect ? points : 0 };\r\n }\r\n\r\n case 'multiple': {\r\n if (!Array.isArray(selectedAnswer) || !Array.isArray(correctAnswer)) {\r\n return { isCorrect: false, pointsEarned: 0 };\r\n }\r\n const sortedSelected = [...selectedAnswer].sort();\r\n const sortedCorrect = [...correctAnswer].sort();\r\n const isCorrect =\r\n sortedSelected.length === sortedCorrect.length &&\r\n sortedSelected.every((val, idx) => val === sortedCorrect[idx]);\r\n return { isCorrect, pointsEarned: isCorrect ? points : 0 };\r\n }\r\n\r\n case 'fill': {\r\n if (!Array.isArray(selectedAnswer) || !question.blanks) {\r\n return { isCorrect: false, pointsEarned: 0 };\r\n }\r\n const isCorrect = question.blanks.every((blank, idx) =>\r\n selectedAnswer[idx]?.toLowerCase().trim() === blank.toLowerCase().trim()\r\n );\r\n return { isCorrect, pointsEarned: isCorrect ? points : 0 };\r\n }\r\n\r\n case 'sorting': {\r\n if (!Array.isArray(selectedAnswer) || !question.correctOrder) {\r\n return { isCorrect: false, pointsEarned: 0 };\r\n }\r\n const isCorrect =\r\n selectedAnswer.length === question.correctOrder.length &&\r\n selectedAnswer.every((val, idx) => val === question.correctOrder![idx]);\r\n return { isCorrect, pointsEarned: isCorrect ? points : 0 };\r\n }\r\n\r\n case 'matrix': {\r\n if (typeof selectedAnswer !== 'object' || !question.correctMatches) {\r\n return { isCorrect: false, pointsEarned: 0 };\r\n }\r\n const selected = selectedAnswer as Record<string, string>;\r\n const correct = question.correctMatches;\r\n const isCorrect = Object.keys(correct).every(\r\n key => selected[key] === correct[key]\r\n );\r\n return { isCorrect, pointsEarned: isCorrect ? points : 0 };\r\n }\r\n\r\n case 'free': {\r\n // For free-form answers, do a simple case-insensitive comparison\r\n if (typeof selectedAnswer !== 'string' || typeof correctAnswer !== 'string') {\r\n return { isCorrect: false, pointsEarned: 0 };\r\n }\r\n const isCorrect = selectedAnswer.toLowerCase().trim() === correctAnswer.toLowerCase().trim();\r\n return { isCorrect, pointsEarned: isCorrect ? points : 0 };\r\n }\r\n\r\n case 'essay':\r\n case 'assessment':\r\n // These require manual grading or are opinion-based\r\n return { isCorrect: false, pointsEarned: 0 };\r\n\r\n default:\r\n return { isCorrect: false, pointsEarned: 0 };\r\n }\r\n}\r\n\r\n// Create an answer detail object\r\nexport function createAnswerDetail(\r\n question: QuizQuestion,\r\n selectedAnswer: unknown\r\n): QuizAnswerDetail {\r\n const { isCorrect, pointsEarned } = checkAnswer(question, selectedAnswer);\r\n\r\n return {\r\n questionId: question.id,\r\n questionText: question.question,\r\n questionType: question.type,\r\n points: question.points,\r\n pointsEarned,\r\n selectedAnswer: selectedAnswer as QuizAnswerDetail['selectedAnswer'],\r\n correctAnswer: question.correctAnswer as QuizAnswerDetail['correctAnswer'],\r\n isCorrect,\r\n explanation: question.explanation,\r\n hint: question.hint,\r\n };\r\n}\r\n\r\n// Calculate total score percentage\r\nexport function calculateScore(answers: QuizAnswerDetail[]): {\r\n score: number;\r\n correctAnswers: number;\r\n totalPoints: number;\r\n earnedPoints: number;\r\n} {\r\n const totalPoints = answers.reduce((sum, a) => sum + a.points, 0);\r\n const earnedPoints = answers.reduce((sum, a) => sum + a.pointsEarned, 0);\r\n const correctAnswers = answers.filter(a => a.isCorrect).length;\r\n const score = totalPoints > 0 ? Math.round((earnedPoints / totalPoints) * 100) : 0;\r\n\r\n return { score, correctAnswers, totalPoints, earnedPoints };\r\n}\r\n\r\n// Format time in seconds to mm:ss\r\nexport function formatTime(seconds: number): string {\r\n const mins = Math.floor(seconds / 60);\r\n const secs = seconds % 60;\r\n return `${mins}:${secs.toString().padStart(2, '0')}`;\r\n}\r\n","import { useState, useEffect, useCallback, useRef } from 'react';\r\nimport type {\r\n QuizPlayerProps,\r\n Quiz,\r\n QuizQuestion,\r\n QuizAnswerDetail,\r\n ExternalQuizAttempt,\r\n QuizResult,\r\n} from './types';\r\nimport { QuizApiClient } from './api';\r\nimport { createAnswerDetail, calculateScore, formatTime } from './utils';\r\n\r\n// Default styles that can be overridden\r\nconst defaultStyles = {\r\n container: {\r\n fontFamily: 'system-ui, -apple-system, sans-serif',\r\n maxWidth: '800px',\r\n margin: '0 auto',\r\n padding: '20px',\r\n backgroundColor: '#ffffff',\r\n borderRadius: '12px',\r\n },\r\n header: {\r\n marginBottom: '20px',\r\n borderBottom: '1px solid #e5e7eb',\r\n paddingBottom: '16px',\r\n },\r\n title: {\r\n fontSize: '24px',\r\n fontWeight: '600',\r\n marginBottom: '8px',\r\n },\r\n progress: {\r\n fontSize: '14px',\r\n color: '#6b7280',\r\n },\r\n progressBar: {\r\n width: '100%',\r\n height: '8px',\r\n backgroundColor: '#e5e7eb',\r\n borderRadius: '4px',\r\n overflow: 'hidden' as const,\r\n marginTop: '8px',\r\n },\r\n progressFill: {\r\n height: '100%',\r\n backgroundColor: '#6721b0',\r\n transition: 'width 0.3s ease',\r\n },\r\n question: {\r\n marginBottom: '24px',\r\n },\r\n questionText: {\r\n fontSize: '18px',\r\n fontWeight: '500',\r\n marginBottom: '16px',\r\n },\r\n options: {\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n gap: '8px',\r\n },\r\n option: {\r\n padding: '12px 16px',\r\n border: '2px solid #e5e7eb',\r\n borderRadius: '8px',\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease',\r\n },\r\n optionSelected: {\r\n borderColor: '#6721b0',\r\n backgroundColor: '#f3e8ff',\r\n },\r\n optionCorrect: {\r\n borderColor: '#22c55e',\r\n backgroundColor: '#f0fdf4',\r\n },\r\n optionIncorrect: {\r\n borderColor: '#ef4444',\r\n backgroundColor: '#fef2f2',\r\n },\r\n input: {\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '2px solid #e5e7eb',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n },\r\n buttons: {\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n marginTop: '24px',\r\n },\r\n button: {\r\n padding: '12px 24px',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: '500',\r\n cursor: 'pointer',\r\n border: 'none',\r\n transition: 'all 0.2s ease',\r\n },\r\n buttonPrimary: {\r\n backgroundColor: '#6721b0',\r\n color: '#ffffff',\r\n },\r\n buttonSecondary: {\r\n backgroundColor: '#f3f4f6',\r\n color: '#374151',\r\n },\r\n buttonDisabled: {\r\n backgroundColor: '#e5e7eb',\r\n color: '#9ca3af',\r\n cursor: 'not-allowed',\r\n },\r\n timer: {\r\n fontSize: '14px',\r\n color: '#6b7280',\r\n marginLeft: '16px',\r\n },\r\n results: {\r\n textAlign: 'center' as const,\r\n padding: '40px 20px',\r\n },\r\n resultScore: {\r\n fontSize: '48px',\r\n fontWeight: '700',\r\n color: '#6721b0',\r\n marginBottom: '8px',\r\n },\r\n resultLabel: {\r\n fontSize: '18px',\r\n color: '#6b7280',\r\n },\r\n loading: {\r\n textAlign: 'center' as const,\r\n padding: '40px',\r\n color: '#6b7280',\r\n },\r\n error: {\r\n textAlign: 'center' as const,\r\n padding: '40px',\r\n color: '#ef4444',\r\n },\r\n};\r\n\r\n// Inline spinner component\r\nfunction Spinner({ size = 16, color = '#ffffff' }: { size?: number; color?: string }) {\r\n return (\r\n <span\r\n style={{\r\n display: 'inline-block',\r\n width: size,\r\n height: size,\r\n border: `2px solid ${color}`,\r\n borderTopColor: 'transparent',\r\n borderRadius: '50%',\r\n animation: 'spin 0.8s linear infinite',\r\n }}\r\n >\r\n <style>\r\n {`@keyframes spin { to { transform: rotate(360deg); } }`}\r\n </style>\r\n </span>\r\n );\r\n}\r\n\r\nexport function QuizPlayer({\r\n quizId,\r\n lessonId,\r\n assignLessonId,\r\n courseId,\r\n childId,\r\n parentId,\r\n apiBaseUrl,\r\n authToken,\r\n onComplete,\r\n onError,\r\n onProgress,\r\n className,\r\n}: QuizPlayerProps) {\r\n const [quiz, setQuiz] = useState<Quiz | null>(null);\r\n const [attempt, setAttempt] = useState<ExternalQuizAttempt | null>(null);\r\n const [currentQuestionIndex, setCurrentQuestionIndex] = useState(0);\r\n const [answers, setAnswers] = useState<Map<string, unknown>>(new Map());\r\n const [answersDetail, setAnswersDetail] = useState<QuizAnswerDetail[]>([]);\r\n const [isSubmitting, setIsSubmitting] = useState(false);\r\n const [isNavigating, setIsNavigating] = useState(false);\r\n const [isCompleted, setIsCompleted] = useState(false);\r\n const [result, setResult] = useState<QuizResult | null>(null);\r\n const [error, setError] = useState<string | null>(null);\r\n const [isLoading, setIsLoading] = useState(true);\r\n const [elapsedSeconds, setElapsedSeconds] = useState(0);\r\n\r\n const apiClient = useRef<QuizApiClient | null>(null);\r\n const timerRef = useRef<ReturnType<typeof setInterval> | null>(null);\r\n const startTimeRef = useRef<number>(Date.now());\r\n\r\n // Initialize API client\r\n useEffect(() => {\r\n apiClient.current = new QuizApiClient({ baseUrl: apiBaseUrl, authToken });\r\n }, [apiBaseUrl, authToken]);\r\n\r\n // Load quiz and create/resume attempt\r\n useEffect(() => {\r\n async function initialize() {\r\n if (!apiClient.current) return;\r\n\r\n try {\r\n setIsLoading(true);\r\n setError(null);\r\n\r\n // Fetch quiz\r\n const quizData = await apiClient.current.getQuiz(quizId);\r\n setQuiz(quizData);\r\n\r\n // Create or resume attempt\r\n const attemptData = await apiClient.current.createAttempt({\r\n quizId,\r\n lessonId,\r\n assignLessonId,\r\n courseId,\r\n childId,\r\n parentId,\r\n });\r\n setAttempt(attemptData);\r\n\r\n // Resume from existing answers if any\r\n if (attemptData.answers && attemptData.answers.length > 0) {\r\n setAnswersDetail(attemptData.answers);\r\n const answersMap = new Map<string, unknown>();\r\n attemptData.answers.forEach(a => {\r\n answersMap.set(a.questionId, a.selectedAnswer);\r\n });\r\n setAnswers(answersMap);\r\n }\r\n\r\n // Check if already completed\r\n if (attemptData.status === 'completed') {\r\n setIsCompleted(true);\r\n const scoreData = calculateScore(attemptData.answers);\r\n setResult({\r\n attemptId: attemptData.id,\r\n score: attemptData.score || scoreData.score,\r\n correctAnswers: attemptData.correctAnswers || scoreData.correctAnswers,\r\n totalQuestions: attemptData.totalQuestions,\r\n answers: attemptData.answers,\r\n timeSpentSeconds: attemptData.timeSpentSeconds || 0,\r\n });\r\n }\r\n\r\n setIsLoading(false);\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : 'Failed to load quiz';\r\n setError(message);\r\n setIsLoading(false);\r\n onError?.(err instanceof Error ? err : new Error(message));\r\n }\r\n }\r\n\r\n initialize();\r\n }, [quizId, lessonId, assignLessonId, courseId, childId, parentId, onError]);\r\n\r\n // Timer\r\n useEffect(() => {\r\n if (!isLoading && !isCompleted && !error) {\r\n startTimeRef.current = Date.now();\r\n timerRef.current = setInterval(() => {\r\n setElapsedSeconds(Math.floor((Date.now() - startTimeRef.current) / 1000));\r\n }, 1000);\r\n }\r\n\r\n return () => {\r\n if (timerRef.current) {\r\n clearInterval(timerRef.current);\r\n }\r\n };\r\n }, [isLoading, isCompleted, error]);\r\n\r\n // Report progress\r\n useEffect(() => {\r\n if (quiz && onProgress) {\r\n onProgress({\r\n currentQuestion: currentQuestionIndex + 1,\r\n totalQuestions: quiz.questions.length,\r\n answeredQuestions: answers.size,\r\n });\r\n }\r\n }, [currentQuestionIndex, answers.size, quiz, onProgress]);\r\n\r\n const currentQuestion = quiz?.questions[currentQuestionIndex];\r\n\r\n const handleAnswerChange = useCallback((value: unknown) => {\r\n if (!currentQuestion) return;\r\n setAnswers(prev => new Map(prev).set(currentQuestion.id, value));\r\n }, [currentQuestion]);\r\n\r\n const handleNext = useCallback(async () => {\r\n if (!quiz || !attempt || !currentQuestion || !apiClient.current) return;\r\n\r\n const selectedAnswer = answers.get(currentQuestion.id);\r\n if (selectedAnswer === undefined) return;\r\n\r\n setIsNavigating(true);\r\n\r\n // Create answer detail\r\n const answerDetail = createAnswerDetail(currentQuestion, selectedAnswer);\r\n \r\n // Update answers detail state\r\n const newAnswersDetail = [...answersDetail];\r\n const existingIdx = newAnswersDetail.findIndex(a => a.questionId === currentQuestion.id);\r\n if (existingIdx >= 0) {\r\n newAnswersDetail[existingIdx] = answerDetail;\r\n } else {\r\n newAnswersDetail.push(answerDetail);\r\n }\r\n setAnswersDetail(newAnswersDetail);\r\n\r\n // Save progress to server\r\n try {\r\n await apiClient.current.updateAttempt(attempt.id, {\r\n answers: newAnswersDetail,\r\n });\r\n } catch (err) {\r\n console.error('Failed to save progress:', err);\r\n } finally {\r\n setIsNavigating(false);\r\n }\r\n\r\n // Move to next question\r\n if (currentQuestionIndex < quiz.questions.length - 1) {\r\n setCurrentQuestionIndex(prev => prev + 1);\r\n }\r\n }, [quiz, attempt, currentQuestion, answers, answersDetail, currentQuestionIndex]);\r\n\r\n const handlePrevious = useCallback(() => {\r\n if (currentQuestionIndex > 0) {\r\n setCurrentQuestionIndex(prev => prev - 1);\r\n }\r\n }, [currentQuestionIndex]);\r\n\r\n const handleSubmit = useCallback(async () => {\r\n if (!quiz || !attempt || !apiClient.current) return;\r\n\r\n setIsSubmitting(true);\r\n\r\n try {\r\n // Ensure current answer is saved\r\n const currentAnswer = currentQuestion ? answers.get(currentQuestion.id) : undefined;\r\n let finalAnswersDetail = [...answersDetail];\r\n \r\n if (currentQuestion && currentAnswer !== undefined) {\r\n const answerDetail = createAnswerDetail(currentQuestion, currentAnswer);\r\n const existingIdx = finalAnswersDetail.findIndex(a => a.questionId === currentQuestion.id);\r\n if (existingIdx >= 0) {\r\n finalAnswersDetail[existingIdx] = answerDetail;\r\n } else {\r\n finalAnswersDetail.push(answerDetail);\r\n }\r\n }\r\n\r\n // Calculate final score\r\n const scoreData = calculateScore(finalAnswersDetail);\r\n const timeSpent = Math.floor((Date.now() - startTimeRef.current) / 1000);\r\n\r\n // Submit to server\r\n const updatedAttempt = await apiClient.current.updateAttempt(attempt.id, {\r\n answers: finalAnswersDetail,\r\n status: 'completed',\r\n score: scoreData.score,\r\n correctAnswers: scoreData.correctAnswers,\r\n timeSpentSeconds: timeSpent,\r\n });\r\n\r\n // Update state\r\n setIsCompleted(true);\r\n const quizResult: QuizResult = {\r\n attemptId: updatedAttempt.id,\r\n score: scoreData.score,\r\n correctAnswers: scoreData.correctAnswers,\r\n totalQuestions: quiz.questions.length,\r\n answers: finalAnswersDetail,\r\n timeSpentSeconds: timeSpent,\r\n };\r\n setResult(quizResult);\r\n\r\n // Stop timer\r\n if (timerRef.current) {\r\n clearInterval(timerRef.current);\r\n }\r\n\r\n // Callback\r\n onComplete?.(quizResult);\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : 'Failed to submit quiz';\r\n setError(message);\r\n onError?.(err instanceof Error ? err : new Error(message));\r\n } finally {\r\n setIsSubmitting(false);\r\n }\r\n }, [quiz, attempt, currentQuestion, answers, answersDetail, onComplete, onError]);\r\n\r\n // Render loading state\r\n if (isLoading) {\r\n return (\r\n <div className={className} style={defaultStyles.container}>\r\n <div style={defaultStyles.loading}>Loading quiz...</div>\r\n </div>\r\n );\r\n }\r\n\r\n // Render error state\r\n if (error) {\r\n return (\r\n <div className={className} style={defaultStyles.container}>\r\n <div style={defaultStyles.error}>\r\n <p>Error: {error}</p>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n // Render completed state\r\n if (isCompleted && result) {\r\n return (\r\n <div className={className} style={defaultStyles.container}>\r\n <div style={defaultStyles.results}>\r\n <div style={defaultStyles.resultScore}>{result.score}%</div>\r\n <div style={defaultStyles.resultLabel}>\r\n {result.correctAnswers} of {result.totalQuestions} correct\r\n </div>\r\n <div style={{ ...defaultStyles.resultLabel, marginTop: '8px' }}>\r\n Time: {formatTime(result.timeSpentSeconds)}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n // Render quiz\r\n if (!quiz || !currentQuestion) {\r\n return (\r\n <div className={className} style={defaultStyles.container}>\r\n <div style={defaultStyles.error}>No quiz data available</div>\r\n </div>\r\n );\r\n }\r\n\r\n const selectedAnswer = answers.get(currentQuestion.id);\r\n const isLastQuestion = currentQuestionIndex === quiz.questions.length - 1;\r\n const progressPercent = ((currentQuestionIndex + 1) / quiz.questions.length) * 100;\r\n\r\n return (\r\n <div className={className} style={defaultStyles.container}>\r\n {/* Header */}\r\n <div style={defaultStyles.header}>\r\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\r\n <div style={defaultStyles.title}>{quiz.title}</div>\r\n <div style={defaultStyles.timer}>{formatTime(elapsedSeconds)}</div>\r\n </div>\r\n <div style={defaultStyles.progress}>\r\n Question {currentQuestionIndex + 1} of {quiz.questions.length}\r\n </div>\r\n <div style={defaultStyles.progressBar}>\r\n <div style={{ ...defaultStyles.progressFill, width: `${progressPercent}%` }} />\r\n </div>\r\n </div>\r\n\r\n {/* Question */}\r\n <div style={defaultStyles.question}>\r\n <div style={defaultStyles.questionText}>{currentQuestion.question}</div>\r\n\r\n {/* Render options based on question type */}\r\n {(currentQuestion.type === 'single' || currentQuestion.type === 'true-false') && (\r\n <div style={defaultStyles.options}>\r\n {currentQuestion.options?.map((option, idx) => (\r\n <div\r\n key={idx}\r\n style={{\r\n ...defaultStyles.option,\r\n ...(selectedAnswer === option ? defaultStyles.optionSelected : {}),\r\n }}\r\n onClick={() => handleAnswerChange(option)}\r\n >\r\n {option}\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n\r\n {currentQuestion.type === 'multiple' && (\r\n <div style={defaultStyles.options}>\r\n {currentQuestion.options?.map((option, idx) => {\r\n const selected = Array.isArray(selectedAnswer) && selectedAnswer.includes(option);\r\n return (\r\n <div\r\n key={idx}\r\n style={{\r\n ...defaultStyles.option,\r\n ...(selected ? defaultStyles.optionSelected : {}),\r\n }}\r\n onClick={() => {\r\n const current = Array.isArray(selectedAnswer) ? selectedAnswer : [];\r\n if (selected) {\r\n handleAnswerChange(current.filter(o => o !== option));\r\n } else {\r\n handleAnswerChange([...current, option]);\r\n }\r\n }}\r\n >\r\n {option}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n\r\n {(currentQuestion.type === 'free' || currentQuestion.type === 'essay') && (\r\n <textarea\r\n style={{ ...defaultStyles.input, minHeight: currentQuestion.type === 'essay' ? '150px' : '60px' }}\r\n value={(selectedAnswer as string) || ''}\r\n onChange={e => handleAnswerChange(e.target.value)}\r\n placeholder=\"Type your answer here...\"\r\n />\r\n )}\r\n\r\n {currentQuestion.type === 'fill' && (\r\n <div style={defaultStyles.options}>\r\n {currentQuestion.blanks?.map((_, idx) => (\r\n <input\r\n key={idx}\r\n style={defaultStyles.input}\r\n value={(Array.isArray(selectedAnswer) ? selectedAnswer[idx] : '') || ''}\r\n onChange={e => {\r\n const current = Array.isArray(selectedAnswer) ? [...selectedAnswer] : [];\r\n current[idx] = e.target.value;\r\n handleAnswerChange(current);\r\n }}\r\n placeholder={`Blank ${idx + 1}`}\r\n />\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Navigation buttons */}\r\n <div style={defaultStyles.buttons}>\r\n <button\r\n style={{\r\n ...defaultStyles.button,\r\n ...(currentQuestionIndex > 0 ? defaultStyles.buttonSecondary : defaultStyles.buttonDisabled),\r\n }}\r\n onClick={handlePrevious}\r\n disabled={currentQuestionIndex === 0}\r\n >\r\n Previous\r\n </button>\r\n\r\n {isLastQuestion ? (\r\n <button\r\n style={{\r\n ...defaultStyles.button,\r\n ...(isSubmitting ? defaultStyles.buttonDisabled : defaultStyles.buttonPrimary),\r\n }}\r\n onClick={handleSubmit}\r\n disabled={isSubmitting || selectedAnswer === undefined}\r\n >\r\n {isSubmitting ? <Spinner size={16} color=\"#9ca3af\" /> : 'Submit Quiz'}\r\n </button>\r\n ) : (\r\n <button\r\n style={{\r\n ...defaultStyles.button,\r\n ...(isNavigating || selectedAnswer === undefined ? defaultStyles.buttonDisabled : defaultStyles.buttonPrimary),\r\n }}\r\n onClick={handleNext}\r\n disabled={isNavigating || selectedAnswer === undefined}\r\n >\r\n {isNavigating ? <Spinner size={16} color=\"#9ca3af\" /> : 'Next'}\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { useState, useEffect } from 'react';\r\nimport type {\r\n AttemptViewerProps,\r\n ExternalQuizAttempt,\r\n QuizAnswerDetail,\r\n} from './types';\r\nimport { QuizApiClient } from './api';\r\nimport { formatTime } from './utils';\r\n\r\nconst defaultStyles = {\r\n container: {\r\n fontFamily: 'system-ui, -apple-system, sans-serif',\r\n width: '100%',\r\n padding: '20px',\r\n backgroundColor: '#ffffff',\r\n borderRadius: '12px',\r\n boxSizing: 'border-box' as const,\r\n },\r\n header: {\r\n marginBottom: '24px',\r\n borderBottom: '1px solid #e5e7eb',\r\n paddingBottom: '20px',\r\n },\r\n title: {\r\n fontSize: '24px',\r\n fontWeight: '600',\r\n marginBottom: '16px',\r\n color: '#111827',\r\n },\r\n summaryGrid: {\r\n display: 'grid',\r\n gridTemplateColumns: 'repeat(auto-fit, minmax(120px, 1fr))',\r\n gap: '16px',\r\n },\r\n summaryCard: {\r\n padding: '12px',\r\n backgroundColor: '#f9fafb',\r\n borderRadius: '8px',\r\n textAlign: 'center' as const,\r\n },\r\n summaryValue: {\r\n fontSize: '20px',\r\n fontWeight: '600',\r\n color: '#6721b0',\r\n marginBottom: '2px',\r\n },\r\n summaryLabel: {\r\n fontSize: '10px',\r\n color: '#6b7280',\r\n textTransform: 'uppercase' as const,\r\n letterSpacing: '0.05em',\r\n },\r\n questionsList: {\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n gap: '16px',\r\n },\r\n questionCard: {\r\n padding: '16px',\r\n border: '2px solid #e5e7eb',\r\n borderRadius: '8px',\r\n },\r\n questionCardCorrect: {\r\n borderColor: '#22c55e',\r\n backgroundColor: '#f0fdf4',\r\n },\r\n questionCardIncorrect: {\r\n borderColor: '#ef4444',\r\n backgroundColor: '#fef2f2',\r\n },\r\n questionHeader: {\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n alignItems: 'flex-start',\r\n marginBottom: '12px',\r\n },\r\n questionNumber: {\r\n fontSize: '12px',\r\n color: '#6b7280',\r\n fontWeight: '500',\r\n },\r\n questionBadge: {\r\n padding: '4px 8px',\r\n borderRadius: '4px',\r\n fontSize: '12px',\r\n fontWeight: '600',\r\n },\r\n badgeCorrect: {\r\n backgroundColor: '#dcfce7',\r\n color: '#166534',\r\n },\r\n badgeIncorrect: {\r\n backgroundColor: '#fee2e2',\r\n color: '#991b1b',\r\n },\r\n questionText: {\r\n fontSize: '16px',\r\n fontWeight: '500',\r\n marginBottom: '12px',\r\n color: '#111827',\r\n },\r\n answerSection: {\r\n fontSize: '14px',\r\n marginBottom: '8px',\r\n },\r\n answerLabel: {\r\n fontWeight: '600',\r\n color: '#6b7280',\r\n marginRight: '8px',\r\n },\r\n studentAnswer: {\r\n color: '#111827',\r\n },\r\n correctAnswer: {\r\n color: '#166534',\r\n },\r\n points: {\r\n fontSize: '13px',\r\n color: '#6b7280',\r\n marginTop: '8px',\r\n },\r\n explanation: {\r\n marginTop: '12px',\r\n padding: '12px',\r\n backgroundColor: '#f3e8ff',\r\n borderRadius: '6px',\r\n fontSize: '14px',\r\n color: '#581c87',\r\n },\r\n loading: {\r\n textAlign: 'center' as const,\r\n padding: '40px 20px',\r\n },\r\n spinner: {\r\n display: 'inline-block',\r\n width: '32px',\r\n height: '32px',\r\n border: '3px solid #e5e7eb',\r\n borderTopColor: '#6721b0',\r\n borderRadius: '50%',\r\n animation: 'spin 1s linear infinite',\r\n },\r\n error: {\r\n textAlign: 'center' as const,\r\n padding: '40px 20px',\r\n color: '#ef4444',\r\n },\r\n retryButton: {\r\n marginTop: '16px',\r\n padding: '12px 24px',\r\n backgroundColor: '#6721b0',\r\n color: '#ffffff',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: '500',\r\n cursor: 'pointer',\r\n },\r\n};\r\n\r\nconst spinnerKeyframes = `\r\n @keyframes spin {\r\n to { transform: rotate(360deg); }\r\n }\r\n`;\r\n\r\nfunction formatAnswer(answer: unknown): string {\r\n if (answer === null || answer === undefined) {\r\n return 'No answer';\r\n }\r\n if (typeof answer === 'string') {\r\n return answer;\r\n }\r\n if (Array.isArray(answer)) {\r\n return answer.join(', ');\r\n }\r\n if (typeof answer === 'object') {\r\n return Object.entries(answer as Record<string, string>)\r\n .map(([k, v]) => `${k} → ${v}`)\r\n .join(', ');\r\n }\r\n return String(answer);\r\n}\r\n\r\nexport function AttemptViewer({\r\n attemptId,\r\n apiBaseUrl,\r\n authToken,\r\n onError,\r\n className,\r\n showExplanations = true,\r\n title,\r\n}: AttemptViewerProps) {\r\n const [attempt, setAttempt] = useState<ExternalQuizAttempt | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n const apiClient = new QuizApiClient({\r\n baseUrl: apiBaseUrl,\r\n authToken,\r\n });\r\n\r\n async function fetchAttempt() {\r\n setLoading(true);\r\n setError(null);\r\n try {\r\n const response = await fetch(`${apiBaseUrl}/api/external/quiz-attempts/${attemptId}`, {\r\n headers: authToken ? { Authorization: `Bearer ${authToken}` } : {},\r\n });\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch attempt: ${response.statusText}`);\r\n }\r\n const data = await response.json();\r\n setAttempt(data);\r\n } catch (err) {\r\n const errorMessage = err instanceof Error ? err.message : 'Failed to load attempt';\r\n setError(errorMessage);\r\n onError?.(err instanceof Error ? err : new Error(errorMessage));\r\n } finally {\r\n setLoading(false);\r\n }\r\n }\r\n\r\n fetchAttempt();\r\n }, [attemptId, apiBaseUrl, authToken, onError]);\r\n\r\n const handleRetry = () => {\r\n setLoading(true);\r\n setError(null);\r\n window.location.reload();\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <div style={defaultStyles.container} className={className}>\r\n <style>{spinnerKeyframes}</style>\r\n <div style={defaultStyles.loading}>\r\n <div style={defaultStyles.spinner} />\r\n <p style={{ marginTop: '16px', color: '#6b7280' }}>Loading attempt...</p>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n if (error || !attempt) {\r\n return (\r\n <div style={defaultStyles.container} className={className}>\r\n <div style={defaultStyles.error}>\r\n <p style={{ fontSize: '18px', fontWeight: '500' }}>Failed to load attempt</p>\r\n <p style={{ marginTop: '8px', color: '#6b7280' }}>{error}</p>\r\n <button style={defaultStyles.retryButton} onClick={handleRetry}>\r\n Try Again\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n const scorePercentage = attempt.score ?? 0;\r\n const correctCount = attempt.correctAnswers ?? 0;\r\n const totalQuestions = attempt.totalQuestions;\r\n const timeSpent = attempt.timeSpentSeconds ?? 0;\r\n\r\n return (\r\n <div style={defaultStyles.container} className={className}>\r\n <style>{spinnerKeyframes}</style>\r\n \r\n <div style={defaultStyles.header}>\r\n <div style={defaultStyles.summaryGrid}>\r\n <div style={defaultStyles.summaryCard}>\r\n <div style={defaultStyles.summaryValue}>{scorePercentage}%</div>\r\n <div style={defaultStyles.summaryLabel}>Score</div>\r\n </div>\r\n <div style={defaultStyles.summaryCard}>\r\n <div style={defaultStyles.summaryValue}>{correctCount}/{totalQuestions}</div>\r\n <div style={defaultStyles.summaryLabel}>Correct</div>\r\n </div>\r\n <div style={defaultStyles.summaryCard}>\r\n <div style={defaultStyles.summaryValue}>{formatTime(timeSpent)}</div>\r\n <div style={defaultStyles.summaryLabel}>Time</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div style={defaultStyles.questionsList}>\r\n {attempt.answers.map((answer: QuizAnswerDetail, index: number) => (\r\n <div\r\n key={answer.questionId}\r\n style={{\r\n ...defaultStyles.questionCard,\r\n ...(answer.isCorrect ? defaultStyles.questionCardCorrect : defaultStyles.questionCardIncorrect),\r\n }}\r\n >\r\n <div style={defaultStyles.questionHeader}>\r\n <span style={defaultStyles.questionNumber}>Question {index + 1}</span>\r\n <span\r\n style={{\r\n ...defaultStyles.questionBadge,\r\n ...(answer.isCorrect ? defaultStyles.badgeCorrect : defaultStyles.badgeIncorrect),\r\n }}\r\n >\r\n {answer.isCorrect ? 'Correct' : 'Incorrect'}\r\n </span>\r\n </div>\r\n\r\n <div style={defaultStyles.questionText}>{answer.questionText}</div>\r\n\r\n <div style={defaultStyles.answerSection}>\r\n <span style={defaultStyles.answerLabel}>Your answer:</span>\r\n <span style={defaultStyles.studentAnswer}>\r\n {formatAnswer(answer.selectedAnswer)}\r\n </span>\r\n </div>\r\n\r\n {!answer.isCorrect && answer.correctAnswer && (\r\n <div style={defaultStyles.answerSection}>\r\n <span style={defaultStyles.answerLabel}>Correct answer:</span>\r\n <span style={defaultStyles.correctAnswer}>\r\n {formatAnswer(answer.correctAnswer)}\r\n </span>\r\n </div>\r\n )}\r\n\r\n <div style={defaultStyles.points}>\r\n {answer.pointsEarned} / {answer.points} points\r\n </div>\r\n\r\n {showExplanations && answer.explanation && (\r\n <div style={defaultStyles.explanation}>\r\n <strong>Explanation:</strong> {answer.explanation}\r\n </div>\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/QuizPlayer.tsx","../src/api.ts","../src/utils.ts","../src/AttemptViewer.tsx"],"sourcesContent":["// Main components\r\nexport { QuizPlayer } from './QuizPlayer';\r\nexport { AttemptViewer } from './AttemptViewer';\r\n\r\n// API client for custom implementations\r\nexport { QuizApiClient } from './api';\r\nexport type { ApiClientConfig } from './api';\r\n\r\n// Utility functions\r\nexport { checkAnswer, createAnswerDetail, calculateScore, formatTime } from './utils';\r\n\r\n// Types\r\nexport type {\r\n QuestionType,\r\n QuizQuestion,\r\n Quiz,\r\n QuizAnswerDetail,\r\n AttemptStatus,\r\n ExternalQuizAttempt,\r\n QuizPlayerProps,\r\n QuizResult,\r\n QuizProgress,\r\n QuizPlayerStyles,\r\n AttemptViewerProps,\r\n GenerateMoreQuestionsResult,\r\n} from './types';\r\n","import { useState, useEffect, useCallback, useRef } from 'react';\r\nimport type {\r\n QuizPlayerProps,\r\n Quiz,\r\n QuizQuestion,\r\n QuizAnswerDetail,\r\n ExternalQuizAttempt,\r\n QuizResult,\r\n} from './types';\r\nimport { QuizApiClient } from './api';\r\nimport { createAnswerDetail, calculateScore, formatTime } from './utils';\r\n\r\n// Default styles that can be overridden\r\nconst defaultStyles = {\r\n container: {\r\n fontFamily: 'system-ui, -apple-system, sans-serif',\r\n width: '100%',\r\n padding: '20px',\r\n backgroundColor: '#ffffff',\r\n borderRadius: '12px',\r\n boxSizing: 'border-box' as const,\r\n },\r\n header: {\r\n marginBottom: '20px',\r\n borderBottom: '1px solid #e5e7eb',\r\n paddingBottom: '16px',\r\n },\r\n title: {\r\n fontSize: '24px',\r\n fontWeight: '600',\r\n marginBottom: '8px',\r\n },\r\n progress: {\r\n fontSize: '14px',\r\n color: '#6b7280',\r\n },\r\n progressBar: {\r\n width: '100%',\r\n height: '8px',\r\n backgroundColor: '#e5e7eb',\r\n borderRadius: '4px',\r\n overflow: 'hidden' as const,\r\n marginTop: '8px',\r\n },\r\n progressFill: {\r\n height: '100%',\r\n backgroundColor: '#6721b0',\r\n transition: 'width 0.3s ease',\r\n },\r\n question: {\r\n marginBottom: '24px',\r\n minHeight: '280px',\r\n },\r\n questionText: {\r\n fontSize: '18px',\r\n fontWeight: '500',\r\n marginBottom: '16px',\r\n },\r\n options: {\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n gap: '8px',\r\n },\r\n option: {\r\n padding: '12px 16px',\r\n border: '2px solid #e5e7eb',\r\n borderRadius: '8px',\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease',\r\n outline: 'none',\r\n backgroundColor: '#ffffff',\r\n },\r\n optionSelected: {\r\n borderColor: '#6721b0',\r\n backgroundColor: '#f3e8ff',\r\n },\r\n optionCorrect: {\r\n borderColor: '#22c55e',\r\n backgroundColor: '#f0fdf4',\r\n },\r\n optionIncorrect: {\r\n borderColor: '#ef4444',\r\n backgroundColor: '#fef2f2',\r\n },\r\n input: {\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '2px solid #e5e7eb',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n outline: 'none',\r\n boxSizing: 'border-box' as const,\r\n backgroundColor: '#ffffff',\r\n },\r\n buttons: {\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n marginTop: '24px',\r\n },\r\n button: {\r\n padding: '12px 24px',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: '500',\r\n cursor: 'pointer',\r\n border: 'none',\r\n transition: 'all 0.2s ease',\r\n },\r\n buttonPrimary: {\r\n backgroundColor: '#6721b0',\r\n color: '#ffffff',\r\n },\r\n buttonSecondary: {\r\n backgroundColor: '#f3f4f6',\r\n color: '#374151',\r\n },\r\n buttonDisabled: {\r\n backgroundColor: '#e5e7eb',\r\n color: '#9ca3af',\r\n cursor: 'not-allowed',\r\n },\r\n buttonAddMore: {\r\n padding: '12px 24px',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: '500',\r\n cursor: 'pointer',\r\n border: '2px solid #6721b0',\r\n backgroundColor: 'transparent',\r\n color: '#6721b0',\r\n transition: 'all 0.2s ease',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: '8px',\r\n },\r\n buttonAddMoreDisabled: {\r\n border: '2px solid #e5e7eb',\r\n color: '#9ca3af',\r\n cursor: 'not-allowed',\r\n },\r\n buttonsColumn: {\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n gap: '12px',\r\n marginTop: '24px',\r\n },\r\n timer: {\r\n fontSize: '14px',\r\n color: '#6b7280',\r\n marginLeft: '16px',\r\n },\r\n results: {\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n padding: '48px 24px',\r\n textAlign: 'center' as const,\r\n minHeight: '400px',\r\n position: 'relative' as const,\r\n overflow: 'hidden' as const,\r\n },\r\n resultsBackground: {\r\n position: 'absolute' as const,\r\n inset: '0',\r\n borderRadius: '16px',\r\n zIndex: 0,\r\n },\r\n resultsContent: {\r\n position: 'relative' as const,\r\n zIndex: 1,\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n alignItems: 'center',\r\n },\r\n resultDetails: {\r\n fontSize: '18px',\r\n color: '#6b7280',\r\n marginBottom: '4px',\r\n },\r\n resultStars: {\r\n display: 'flex',\r\n justifyContent: 'center',\r\n gap: '8px',\r\n marginBottom: '20px',\r\n },\r\n resultStar: {\r\n fontSize: '32px',\r\n animation: 'starPop 0.5s ease-out forwards',\r\n opacity: 0,\r\n },\r\n confettiContainer: {\r\n position: 'absolute' as const,\r\n inset: '0',\r\n pointerEvents: 'none' as const,\r\n overflow: 'hidden' as const,\r\n zIndex: 0,\r\n },\r\n confettiPiece: {\r\n position: 'absolute' as const,\r\n width: '10px',\r\n height: '10px',\r\n top: '-10px',\r\n animation: 'confettiFall 3s ease-out forwards',\r\n },\r\n loading: {\r\n textAlign: 'center' as const,\r\n padding: '40px',\r\n color: '#6b7280',\r\n },\r\n error: {\r\n textAlign: 'center' as const,\r\n padding: '40px',\r\n color: '#ef4444',\r\n },\r\n intro: {\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n padding: '48px 24px',\r\n textAlign: 'center' as const,\r\n background: 'linear-gradient(135deg, #f3e8ff 0%, #e0e7ff 50%, #fce7f3 100%)',\r\n borderRadius: '16px',\r\n minHeight: '320px',\r\n },\r\n introTitle: {\r\n fontSize: '28px',\r\n fontWeight: '700',\r\n color: '#4c1d95',\r\n marginBottom: '12px',\r\n },\r\n introSubtitle: {\r\n fontSize: '16px',\r\n color: '#6b7280',\r\n marginBottom: '8px',\r\n },\r\n introQuestionCount: {\r\n fontSize: '14px',\r\n color: '#8b5cf6',\r\n marginBottom: '32px',\r\n fontWeight: '500',\r\n },\r\n startButton: {\r\n padding: '16px 48px',\r\n fontSize: '18px',\r\n fontWeight: '600',\r\n backgroundColor: '#7c3aed',\r\n color: '#ffffff',\r\n border: 'none',\r\n borderRadius: '12px',\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease',\r\n boxShadow: '0 4px 14px rgba(124, 58, 237, 0.4)',\r\n },\r\n feedback: {\r\n marginTop: '16px',\r\n padding: '16px',\r\n borderRadius: '8px',\r\n backgroundColor: '#f9fafb',\r\n border: '1px solid #e5e7eb',\r\n },\r\n feedbackCorrect: {\r\n backgroundColor: '#f0fdf4',\r\n borderColor: '#22c55e',\r\n },\r\n feedbackIncorrect: {\r\n backgroundColor: '#fef2f2',\r\n borderColor: '#ef4444',\r\n },\r\n feedbackTitle: {\r\n fontSize: '16px',\r\n fontWeight: '600',\r\n marginBottom: '8px',\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '8px',\r\n },\r\n feedbackTitleCorrect: {\r\n color: '#16a34a',\r\n },\r\n feedbackTitleIncorrect: {\r\n color: '#dc2626',\r\n },\r\n feedbackExplanation: {\r\n fontSize: '14px',\r\n color: '#4b5563',\r\n lineHeight: '1.5',\r\n },\r\n};\r\n\r\n// Inline spinner component\r\nfunction Spinner({ size = 16, color = '#ffffff' }: { size?: number; color?: string }) {\r\n return (\r\n <span\r\n style={{\r\n display: 'inline-block',\r\n width: size,\r\n height: size,\r\n border: `2px solid ${color}`,\r\n borderTopColor: 'transparent',\r\n borderRadius: '50%',\r\n animation: 'spin 0.8s linear infinite',\r\n }}\r\n >\r\n <style>\r\n {`@keyframes spin { to { transform: rotate(360deg); } }`}\r\n </style>\r\n </span>\r\n );\r\n}\r\n\r\nexport function QuizPlayer({\r\n quizId,\r\n lessonId,\r\n assignLessonId,\r\n courseId,\r\n childId,\r\n parentId,\r\n apiBaseUrl,\r\n authToken,\r\n onComplete,\r\n onError,\r\n onProgress,\r\n onGenerateMoreQuestions,\r\n className,\r\n}: QuizPlayerProps) {\r\n const [quiz, setQuiz] = useState<Quiz | null>(null);\r\n const [attempt, setAttempt] = useState<ExternalQuizAttempt | null>(null);\r\n const [currentQuestionIndex, setCurrentQuestionIndex] = useState(0);\r\n const [answers, setAnswers] = useState<Map<string, unknown>>(new Map());\r\n const [answersDetail, setAnswersDetail] = useState<QuizAnswerDetail[]>([]);\r\n const [isSubmitting, setIsSubmitting] = useState(false);\r\n const [isNavigating, setIsNavigating] = useState(false);\r\n const [isCompleted, setIsCompleted] = useState(false);\r\n const [result, setResult] = useState<QuizResult | null>(null);\r\n const [error, setError] = useState<string | null>(null);\r\n const [isLoading, setIsLoading] = useState(true);\r\n const [elapsedSeconds, setElapsedSeconds] = useState(0);\r\n const [showIntro, setShowIntro] = useState(true);\r\n const [timerStarted, setTimerStarted] = useState(false);\r\n const [showFeedback, setShowFeedback] = useState(false);\r\n const [currentAnswerDetail, setCurrentAnswerDetail] = useState<QuizAnswerDetail | null>(null);\r\n const [extraQuestions, setExtraQuestions] = useState<QuizQuestion[]>([]);\r\n const [isGeneratingExtra, setIsGeneratingExtra] = useState(false);\r\n\r\n const apiClient = useRef<QuizApiClient | null>(null);\r\n const timerRef = useRef<ReturnType<typeof setInterval> | null>(null);\r\n const startTimeRef = useRef<number>(0);\r\n\r\n // Initialize API client\r\n useEffect(() => {\r\n apiClient.current = new QuizApiClient({ baseUrl: apiBaseUrl, authToken });\r\n }, [apiBaseUrl, authToken]);\r\n\r\n // Load quiz and create/resume attempt\r\n useEffect(() => {\r\n async function initialize() {\r\n if (!apiClient.current) return;\r\n\r\n try {\r\n setIsLoading(true);\r\n setError(null);\r\n\r\n // Fetch quiz\r\n const quizData = await apiClient.current.getQuiz(quizId);\r\n setQuiz(quizData);\r\n\r\n // Create or resume attempt\r\n const attemptData = await apiClient.current.createAttempt({\r\n quizId,\r\n lessonId,\r\n assignLessonId,\r\n courseId,\r\n childId,\r\n parentId,\r\n });\r\n setAttempt(attemptData);\r\n\r\n // Resume from existing answers if any\r\n if (attemptData.answers && attemptData.answers.length > 0) {\r\n setAnswersDetail(attemptData.answers);\r\n const answersMap = new Map<string, unknown>();\r\n attemptData.answers.forEach(a => {\r\n answersMap.set(a.questionId, a.selectedAnswer);\r\n });\r\n setAnswers(answersMap);\r\n }\r\n\r\n // Check if already completed\r\n if (attemptData.status === 'completed') {\r\n setIsCompleted(true);\r\n const scoreData = calculateScore(attemptData.answers);\r\n setResult({\r\n attemptId: attemptData.id,\r\n score: attemptData.score || scoreData.score,\r\n correctAnswers: attemptData.correctAnswers || scoreData.correctAnswers,\r\n totalQuestions: attemptData.totalQuestions,\r\n answers: attemptData.answers,\r\n timeSpentSeconds: attemptData.timeSpentSeconds || 0,\r\n });\r\n }\r\n\r\n setIsLoading(false);\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : 'Failed to load quiz';\r\n setError(message);\r\n setIsLoading(false);\r\n onError?.(err instanceof Error ? err : new Error(message));\r\n }\r\n }\r\n\r\n initialize();\r\n }, [quizId, lessonId, assignLessonId, courseId, childId, parentId, onError]);\r\n\r\n // Timer - only starts when timerStarted is true (after clicking Start)\r\n useEffect(() => {\r\n if (timerStarted && !isCompleted && !error) {\r\n startTimeRef.current = Date.now();\r\n timerRef.current = setInterval(() => {\r\n setElapsedSeconds(Math.floor((Date.now() - startTimeRef.current) / 1000));\r\n }, 1000);\r\n }\r\n\r\n return () => {\r\n if (timerRef.current) {\r\n clearInterval(timerRef.current);\r\n }\r\n };\r\n }, [timerStarted, isCompleted, error]);\r\n\r\n // Handle start button click\r\n const handleStart = useCallback(() => {\r\n setShowIntro(false);\r\n setTimerStarted(true);\r\n }, []);\r\n\r\n // Reset feedback state when question changes\r\n useEffect(() => {\r\n setShowFeedback(false);\r\n setCurrentAnswerDetail(null);\r\n }, [currentQuestionIndex]);\r\n\r\n // Combine original questions with extra generated questions\r\n const allQuestions = quiz ? [...quiz.questions, ...extraQuestions] : [];\r\n const totalQuestions = allQuestions.length;\r\n const maxQuestions = 50;\r\n\r\n // Report progress\r\n useEffect(() => {\r\n if (quiz && onProgress) {\r\n onProgress({\r\n currentQuestion: currentQuestionIndex + 1,\r\n totalQuestions: totalQuestions,\r\n answeredQuestions: answers.size,\r\n });\r\n }\r\n }, [currentQuestionIndex, answers.size, quiz, onProgress, totalQuestions]);\r\n\r\n const currentQuestion = allQuestions[currentQuestionIndex];\r\n\r\n const handleAnswerChange = useCallback((value: unknown) => {\r\n if (!currentQuestion) return;\r\n setAnswers(prev => new Map(prev).set(currentQuestion.id, value));\r\n }, [currentQuestion]);\r\n\r\n // Check answer and show feedback\r\n const handleCheckAnswer = useCallback(async () => {\r\n if (!quiz || !attempt || !currentQuestion || !apiClient.current) return;\r\n\r\n const selectedAnswer = answers.get(currentQuestion.id);\r\n if (selectedAnswer === undefined) return;\r\n\r\n setIsNavigating(true);\r\n\r\n // Create answer detail\r\n const answerDetail = createAnswerDetail(currentQuestion, selectedAnswer);\r\n setCurrentAnswerDetail(answerDetail);\r\n \r\n // Update answers detail state\r\n const newAnswersDetail = [...answersDetail];\r\n const existingIdx = newAnswersDetail.findIndex(a => a.questionId === currentQuestion.id);\r\n if (existingIdx >= 0) {\r\n newAnswersDetail[existingIdx] = answerDetail;\r\n } else {\r\n newAnswersDetail.push(answerDetail);\r\n }\r\n setAnswersDetail(newAnswersDetail);\r\n\r\n // Save progress to server\r\n try {\r\n await apiClient.current.updateAttempt(attempt.id, {\r\n answers: newAnswersDetail,\r\n });\r\n } catch (err) {\r\n console.error('Failed to save progress:', err);\r\n } finally {\r\n setIsNavigating(false);\r\n }\r\n\r\n // Show feedback instead of moving to next question\r\n setShowFeedback(true);\r\n }, [quiz, attempt, currentQuestion, answers, answersDetail]);\r\n\r\n // Continue to next question after viewing feedback\r\n const handleContinue = useCallback(() => {\r\n if (!quiz) return;\r\n \r\n setShowFeedback(false);\r\n setCurrentAnswerDetail(null);\r\n \r\n // Move to next question (use totalQuestions which includes extras)\r\n if (currentQuestionIndex < totalQuestions - 1) {\r\n setCurrentQuestionIndex(prev => prev + 1);\r\n }\r\n }, [quiz, currentQuestionIndex, totalQuestions]);\r\n\r\n // Generate more questions handler\r\n const handleAddMoreQuestions = useCallback(async () => {\r\n if (!attempt || !onGenerateMoreQuestions || isGeneratingExtra) return;\r\n \r\n // Check if we've reached the limit\r\n if (totalQuestions >= maxQuestions) return;\r\n \r\n setIsGeneratingExtra(true);\r\n try {\r\n const result = await onGenerateMoreQuestions(attempt.id, totalQuestions);\r\n \r\n if (result.extraQuestions && result.extraQuestions.length > 0) {\r\n // Clamp new questions to not exceed 50 total\r\n const slotsAvailable = maxQuestions - totalQuestions;\r\n const questionsToAppend = result.extraQuestions.slice(0, slotsAvailable);\r\n \r\n if (questionsToAppend.length > 0) {\r\n setExtraQuestions(prev => [...prev, ...questionsToAppend]);\r\n \r\n // Move to the first new question\r\n setCurrentQuestionIndex(totalQuestions);\r\n setShowFeedback(false);\r\n setCurrentAnswerDetail(null);\r\n }\r\n }\r\n } catch (err) {\r\n console.error('Failed to generate extra questions:', err);\r\n onError?.(err instanceof Error ? err : new Error('Failed to generate extra questions'));\r\n } finally {\r\n setIsGeneratingExtra(false);\r\n }\r\n }, [attempt, onGenerateMoreQuestions, isGeneratingExtra, totalQuestions, maxQuestions, onError]);\r\n\r\n const handleSubmit = useCallback(async () => {\r\n if (!quiz || !attempt || !apiClient.current) return;\r\n\r\n setIsSubmitting(true);\r\n\r\n try {\r\n // Ensure current answer is saved\r\n const currentAnswer = currentQuestion ? answers.get(currentQuestion.id) : undefined;\r\n let finalAnswersDetail = [...answersDetail];\r\n \r\n if (currentQuestion && currentAnswer !== undefined) {\r\n const answerDetail = createAnswerDetail(currentQuestion, currentAnswer);\r\n const existingIdx = finalAnswersDetail.findIndex(a => a.questionId === currentQuestion.id);\r\n if (existingIdx >= 0) {\r\n finalAnswersDetail[existingIdx] = answerDetail;\r\n } else {\r\n finalAnswersDetail.push(answerDetail);\r\n }\r\n }\r\n\r\n // Calculate final score\r\n const scoreData = calculateScore(finalAnswersDetail);\r\n const timeSpent = timerStarted && startTimeRef.current > 0 \r\n ? Math.floor((Date.now() - startTimeRef.current) / 1000) \r\n : elapsedSeconds;\r\n\r\n // Submit to server\r\n const updatedAttempt = await apiClient.current.updateAttempt(attempt.id, {\r\n answers: finalAnswersDetail,\r\n status: 'completed',\r\n score: scoreData.score,\r\n correctAnswers: scoreData.correctAnswers,\r\n timeSpentSeconds: timeSpent,\r\n });\r\n\r\n // Update state\r\n setIsCompleted(true);\r\n const quizResult: QuizResult = {\r\n attemptId: updatedAttempt.id,\r\n score: scoreData.score,\r\n correctAnswers: scoreData.correctAnswers,\r\n totalQuestions: totalQuestions,\r\n answers: finalAnswersDetail,\r\n timeSpentSeconds: timeSpent,\r\n };\r\n setResult(quizResult);\r\n\r\n // Stop timer\r\n if (timerRef.current) {\r\n clearInterval(timerRef.current);\r\n }\r\n\r\n // Callback\r\n onComplete?.(quizResult);\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : 'Failed to submit quiz';\r\n setError(message);\r\n onError?.(err instanceof Error ? err : new Error(message));\r\n } finally {\r\n setIsSubmitting(false);\r\n }\r\n }, [quiz, attempt, currentQuestion, answers, answersDetail, onComplete, onError, totalQuestions, timerStarted, elapsedSeconds]);\r\n\r\n // Render loading state\r\n if (isLoading) {\r\n return (\r\n <div className={className} style={defaultStyles.container}>\r\n <div style={defaultStyles.loading}>Loading quiz...</div>\r\n </div>\r\n );\r\n }\r\n\r\n // Render error state\r\n if (error) {\r\n return (\r\n <div className={className} style={defaultStyles.container}>\r\n <div style={defaultStyles.error}>\r\n <p>Error: {error}</p>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n // Render completed state\r\n if (isCompleted && result) {\r\n // Calculate percentage based on correct answers (not points)\r\n const percentage = Math.round((result.correctAnswers / result.totalQuestions) * 100);\r\n \r\n // Determine theme based on percentage\r\n const getScoreTheme = (pct: number) => {\r\n if (pct >= 80) {\r\n return {\r\n color: '#22c55e',\r\n bgGradient: 'linear-gradient(135deg, #dcfce7 0%, #bbf7d0 50%, #86efac 100%)',\r\n badge: 'Quiz Champion!',\r\n badgeColor: '#fbbf24',\r\n badgeBg: 'linear-gradient(135deg, #fef3c7 0%, #fde68a 100%)',\r\n mascotMood: 'celebrating',\r\n stars: 3,\r\n };\r\n } else if (pct >= 60) {\r\n return {\r\n color: '#f59e0b',\r\n bgGradient: 'linear-gradient(135deg, #fef3c7 0%, #fde68a 50%, #fcd34d 100%)',\r\n badge: 'Rising Star!',\r\n badgeColor: '#f59e0b',\r\n badgeBg: 'linear-gradient(135deg, #fed7aa 0%, #fdba74 100%)',\r\n mascotMood: 'happy',\r\n stars: 2,\r\n };\r\n } else if (pct >= 40) {\r\n return {\r\n color: '#3b82f6',\r\n bgGradient: 'linear-gradient(135deg, #dbeafe 0%, #bfdbfe 50%, #93c5fd 100%)',\r\n badge: 'Great Learner!',\r\n badgeColor: '#3b82f6',\r\n badgeBg: 'linear-gradient(135deg, #bfdbfe 0%, #93c5fd 100%)',\r\n mascotMood: 'encouraging',\r\n stars: 1,\r\n };\r\n } else {\r\n return {\r\n color: '#8b5cf6',\r\n bgGradient: 'linear-gradient(135deg, #f3e8ff 0%, #e9d5ff 50%, #d8b4fe 100%)',\r\n badge: 'Keep Growing!',\r\n badgeColor: '#8b5cf6',\r\n badgeBg: 'linear-gradient(135deg, #e9d5ff 0%, #d8b4fe 100%)',\r\n mascotMood: 'supportive',\r\n stars: 0,\r\n };\r\n }\r\n };\r\n\r\n const theme = getScoreTheme(percentage);\r\n\r\n // Generate confetti pieces\r\n const confettiColors = ['#f43f5e', '#ec4899', '#8b5cf6', '#3b82f6', '#22c55e', '#f59e0b', '#ef4444'];\r\n const confettiPieces = Array.from({ length: 50 }, (_, i) => ({\r\n id: i,\r\n left: `${Math.random() * 100}%`,\r\n delay: `${Math.random() * 2}s`,\r\n duration: `${2 + Math.random() * 2}s`,\r\n color: confettiColors[Math.floor(Math.random() * confettiColors.length)],\r\n rotation: Math.random() * 360,\r\n size: 6 + Math.random() * 8,\r\n }));\r\n\r\n // Star SVG component\r\n const StarIcon = ({ filled, delay }: { filled: boolean; delay: number }) => (\r\n <svg\r\n width=\"36\"\r\n height=\"36\"\r\n viewBox=\"0 0 24 24\"\r\n style={{\r\n animation: 'starPop 0.5s ease-out forwards',\r\n animationDelay: `${delay}s`,\r\n opacity: 0,\r\n }}\r\n >\r\n <path\r\n d=\"M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z\"\r\n fill={filled ? '#fbbf24' : '#e5e7eb'}\r\n stroke={filled ? '#f59e0b' : '#d1d5db'}\r\n strokeWidth=\"1\"\r\n />\r\n </svg>\r\n );\r\n\r\n // Mascot SVG component - a friendly owl character\r\n const MascotOwl = ({ mood }: { mood: string }) => {\r\n const getEyeExpression = () => {\r\n switch (mood) {\r\n case 'celebrating':\r\n return { leftEye: '>', rightEye: '<', pupilY: 42 }; // Squinting happy\r\n case 'happy':\r\n return { leftEye: null, rightEye: null, pupilY: 42 }; // Normal happy\r\n case 'encouraging':\r\n return { leftEye: null, rightEye: null, pupilY: 44 }; // Looking down warmly\r\n default:\r\n return { leftEye: null, rightEye: null, pupilY: 42 }; // Supportive\r\n }\r\n };\r\n const eyeExpr = getEyeExpression();\r\n\r\n return (\r\n <svg\r\n width=\"120\"\r\n height=\"120\"\r\n viewBox=\"0 0 100 100\"\r\n style={{\r\n animation: mood === 'celebrating' ? 'bounce 0.6s ease-in-out infinite' : 'gentleBob 2s ease-in-out infinite',\r\n }}\r\n >\r\n {/* Body */}\r\n <ellipse cx=\"50\" cy=\"60\" rx=\"35\" ry=\"30\" fill=\"#8b5cf6\" />\r\n {/* Belly */}\r\n <ellipse cx=\"50\" cy=\"65\" rx=\"25\" ry=\"20\" fill=\"#c4b5fd\" />\r\n {/* Head */}\r\n <circle cx=\"50\" cy=\"35\" r=\"28\" fill=\"#a78bfa\" />\r\n {/* Ear tufts */}\r\n <polygon points=\"28,15 35,30 22,28\" fill=\"#7c3aed\" />\r\n <polygon points=\"72,15 65,30 78,28\" fill=\"#7c3aed\" />\r\n {/* Eye whites */}\r\n <ellipse cx=\"38\" cy=\"38\" rx=\"10\" ry=\"12\" fill=\"white\" />\r\n <ellipse cx=\"62\" cy=\"38\" rx=\"10\" ry=\"12\" fill=\"white\" />\r\n {/* Pupils */}\r\n {eyeExpr.leftEye ? (\r\n <text x=\"38\" y=\"44\" textAnchor=\"middle\" fontSize=\"16\" fill=\"#1f2937\">{eyeExpr.leftEye}</text>\r\n ) : (\r\n <circle cx=\"38\" cy={eyeExpr.pupilY} r=\"5\" fill=\"#1f2937\" />\r\n )}\r\n {eyeExpr.rightEye ? (\r\n <text x=\"62\" y=\"44\" textAnchor=\"middle\" fontSize=\"16\" fill=\"#1f2937\">{eyeExpr.rightEye}</text>\r\n ) : (\r\n <circle cx=\"62\" cy={eyeExpr.pupilY} r=\"5\" fill=\"#1f2937\" />\r\n )}\r\n {/* Beak */}\r\n <polygon points=\"50,45 45,52 55,52\" fill=\"#fbbf24\" />\r\n {/* Blush for happy moods */}\r\n {(mood === 'celebrating' || mood === 'happy') && (\r\n <>\r\n <ellipse cx=\"28\" cy=\"45\" rx=\"5\" ry=\"3\" fill=\"#fda4af\" opacity=\"0.6\" />\r\n <ellipse cx=\"72\" cy=\"45\" rx=\"5\" ry=\"3\" fill=\"#fda4af\" opacity=\"0.6\" />\r\n </>\r\n )}\r\n {/* Wings */}\r\n {mood === 'celebrating' ? (\r\n <>\r\n <ellipse cx=\"18\" cy=\"55\" rx=\"8\" ry=\"15\" fill=\"#7c3aed\" transform=\"rotate(-30 18 55)\" />\r\n <ellipse cx=\"82\" cy=\"55\" rx=\"8\" ry=\"15\" fill=\"#7c3aed\" transform=\"rotate(30 82 55)\" />\r\n </>\r\n ) : (\r\n <>\r\n <ellipse cx=\"20\" cy=\"60\" rx=\"8\" ry=\"15\" fill=\"#7c3aed\" />\r\n <ellipse cx=\"80\" cy=\"60\" rx=\"8\" ry=\"15\" fill=\"#7c3aed\" />\r\n </>\r\n )}\r\n {/* Feet */}\r\n <ellipse cx=\"40\" cy=\"88\" rx=\"8\" ry=\"4\" fill=\"#fbbf24\" />\r\n <ellipse cx=\"60\" cy=\"88\" rx=\"8\" ry=\"4\" fill=\"#fbbf24\" />\r\n </svg>\r\n );\r\n };\r\n\r\n return (\r\n <div className={className} style={defaultStyles.container}>\r\n <style>\r\n {`\r\n @keyframes confettiFall {\r\n 0% {\r\n transform: translateY(-10px) rotate(0deg);\r\n opacity: 1;\r\n }\r\n 100% {\r\n transform: translateY(500px) rotate(720deg);\r\n opacity: 0;\r\n }\r\n }\r\n @keyframes starPop {\r\n 0% {\r\n transform: scale(0);\r\n opacity: 0;\r\n }\r\n 50% {\r\n transform: scale(1.3);\r\n }\r\n 100% {\r\n transform: scale(1);\r\n opacity: 1;\r\n }\r\n }\r\n @keyframes bounce {\r\n 0%, 100% {\r\n transform: translateY(0);\r\n }\r\n 50% {\r\n transform: translateY(-10px);\r\n }\r\n }\r\n @keyframes gentleBob {\r\n 0%, 100% {\r\n transform: translateY(0);\r\n }\r\n 50% {\r\n transform: translateY(-5px);\r\n }\r\n }\r\n @keyframes badgePop {\r\n 0% {\r\n transform: scale(0) rotate(-10deg);\r\n opacity: 0;\r\n }\r\n 60% {\r\n transform: scale(1.1) rotate(5deg);\r\n }\r\n 100% {\r\n transform: scale(1) rotate(0deg);\r\n opacity: 1;\r\n }\r\n }\r\n @keyframes scoreSlideIn {\r\n 0% {\r\n transform: translateY(20px);\r\n opacity: 0;\r\n }\r\n 100% {\r\n transform: translateY(0);\r\n opacity: 1;\r\n }\r\n }\r\n `}\r\n </style>\r\n <div style={defaultStyles.results}>\r\n {/* Confetti animation for high scores */}\r\n {percentage >= 60 && (\r\n <div style={defaultStyles.confettiContainer}>\r\n {confettiPieces.map((piece) => (\r\n <div\r\n key={piece.id}\r\n style={{\r\n ...defaultStyles.confettiPiece,\r\n left: piece.left,\r\n width: `${piece.size}px`,\r\n height: `${piece.size}px`,\r\n backgroundColor: piece.color,\r\n borderRadius: Math.random() > 0.5 ? '50%' : '2px',\r\n animationDelay: piece.delay,\r\n animationDuration: piece.duration,\r\n transform: `rotate(${piece.rotation}deg)`,\r\n }}\r\n />\r\n ))}\r\n </div>\r\n )}\r\n\r\n {/* Background gradient */}\r\n <div style={{ ...defaultStyles.resultsBackground, background: theme.bgGradient }} />\r\n\r\n {/* Content */}\r\n <div style={defaultStyles.resultsContent}>\r\n {/* Stars */}\r\n <div style={defaultStyles.resultStars}>\r\n <StarIcon filled={theme.stars >= 1} delay={0.3} />\r\n <StarIcon filled={theme.stars >= 2} delay={0.5} />\r\n <StarIcon filled={theme.stars >= 3} delay={0.7} />\r\n </div>\r\n\r\n {/* Mascot Character */}\r\n <div style={{ marginBottom: '16px' }}>\r\n <MascotOwl mood={theme.mascotMood} />\r\n </div>\r\n\r\n {/* Achievement Badge */}\r\n <div\r\n style={{\r\n background: theme.badgeBg,\r\n padding: '12px 28px',\r\n borderRadius: '50px',\r\n boxShadow: '0 4px 12px rgba(0,0,0,0.15)',\r\n marginBottom: '20px',\r\n animation: 'badgePop 0.6s ease-out 0.2s forwards',\r\n opacity: 0,\r\n border: `3px solid ${theme.badgeColor}`,\r\n }}\r\n >\r\n <span\r\n style={{\r\n fontSize: '22px',\r\n fontWeight: '700',\r\n color: '#1f2937',\r\n textShadow: '0 1px 2px rgba(255,255,255,0.5)',\r\n }}\r\n >\r\n {theme.badge}\r\n </span>\r\n </div>\r\n\r\n {/* Big Score Display */}\r\n <div\r\n style={{\r\n animation: 'scoreSlideIn 0.5s ease-out 0.4s forwards',\r\n opacity: 0,\r\n }}\r\n >\r\n <div\r\n style={{\r\n fontSize: '48px',\r\n fontWeight: '800',\r\n color: theme.color,\r\n lineHeight: '1',\r\n marginBottom: '4px',\r\n }}\r\n >\r\n {result.correctAnswers} of {result.totalQuestions}\r\n </div>\r\n <div\r\n style={{\r\n fontSize: '20px',\r\n fontWeight: '600',\r\n color: '#6b7280',\r\n marginBottom: '12px',\r\n }}\r\n >\r\n correct answers\r\n </div>\r\n </div>\r\n\r\n {/* Time */}\r\n <div style={{ ...defaultStyles.resultDetails, marginTop: '8px' }}>\r\n Time: {formatTime(result.timeSpentSeconds)}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n // Render intro screen (after quiz is loaded but before requiring currentQuestion)\r\n if (quiz && showIntro) {\r\n return (\r\n <div className={className} style={defaultStyles.container}>\r\n <div style={defaultStyles.intro}>\r\n <div style={defaultStyles.introTitle}>{quiz.title}</div>\r\n <div style={defaultStyles.introSubtitle}>Ready to test your knowledge?</div>\r\n <div style={defaultStyles.introQuestionCount}>\r\n {quiz.questions.length} question{quiz.questions.length !== 1 ? 's' : ''} to answer\r\n </div>\r\n <button\r\n style={defaultStyles.startButton}\r\n onClick={handleStart}\r\n onMouseOver={(e) => {\r\n e.currentTarget.style.transform = 'translateY(-2px)';\r\n e.currentTarget.style.boxShadow = '0 6px 20px rgba(124, 58, 237, 0.5)';\r\n }}\r\n onMouseOut={(e) => {\r\n e.currentTarget.style.transform = 'translateY(0)';\r\n e.currentTarget.style.boxShadow = '0 4px 14px rgba(124, 58, 237, 0.4)';\r\n }}\r\n data-testid=\"button-start-quiz\"\r\n >\r\n Let's Start!\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n // Render quiz - guard for missing data\r\n if (!quiz || !currentQuestion) {\r\n return (\r\n <div className={className} style={defaultStyles.container}>\r\n <div style={defaultStyles.error}>No quiz data available</div>\r\n </div>\r\n );\r\n }\r\n\r\n const selectedAnswer = answers.get(currentQuestion.id);\r\n const isLastQuestion = currentQuestionIndex === totalQuestions - 1;\r\n const progressPercent = ((currentQuestionIndex + 1) / totalQuestions) * 100;\r\n const remainingSlots = maxQuestions - totalQuestions;\r\n const questionsToAdd = Math.min(5, remainingSlots);\r\n const canAddMore = onGenerateMoreQuestions && remainingSlots > 0;\r\n\r\n return (\r\n <div className={className} style={defaultStyles.container}>\r\n {/* Header - timer hidden to avoid exam pressure */}\r\n <div style={defaultStyles.header}>\r\n <div style={defaultStyles.title}>{quiz.title}</div>\r\n <div style={defaultStyles.progress}>\r\n Question {currentQuestionIndex + 1} of {totalQuestions}\r\n </div>\r\n <div style={defaultStyles.progressBar}>\r\n <div style={{ ...defaultStyles.progressFill, width: `${progressPercent}%` }} />\r\n </div>\r\n </div>\r\n\r\n {/* Question */}\r\n <div style={defaultStyles.question}>\r\n <div style={defaultStyles.questionText}>{currentQuestion.question}</div>\r\n\r\n {/* Render options based on question type */}\r\n {(currentQuestion.type === 'single' || currentQuestion.type === 'true-false') && (\r\n <div style={defaultStyles.options}>\r\n {currentQuestion.options?.map((option, idx) => {\r\n const isSelected = selectedAnswer === option;\r\n const isCorrectOption = currentQuestion.correctAnswer === option;\r\n \r\n let optionStyle = { ...defaultStyles.option };\r\n if (showFeedback) {\r\n if (isCorrectOption) {\r\n optionStyle = { ...optionStyle, ...defaultStyles.optionCorrect };\r\n } else if (isSelected && !isCorrectOption) {\r\n optionStyle = { ...optionStyle, ...defaultStyles.optionIncorrect };\r\n }\r\n } else if (isSelected) {\r\n optionStyle = { ...optionStyle, ...defaultStyles.optionSelected };\r\n }\r\n \r\n return (\r\n <div\r\n key={idx}\r\n style={{\r\n ...optionStyle,\r\n cursor: showFeedback ? 'default' : 'pointer',\r\n }}\r\n onClick={() => !showFeedback && handleAnswerChange(option)}\r\n >\r\n {option}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n\r\n {currentQuestion.type === 'multiple' && (\r\n <div style={defaultStyles.options}>\r\n {currentQuestion.options?.map((option, idx) => {\r\n const selected = Array.isArray(selectedAnswer) && selectedAnswer.includes(option);\r\n // Normalize correctAnswer to array (handle both string and array cases)\r\n const correctAnswers = Array.isArray(currentQuestion.correctAnswer) \r\n ? currentQuestion.correctAnswer \r\n : (currentQuestion.correctAnswer ? [currentQuestion.correctAnswer] : []);\r\n const isCorrectOption = correctAnswers.includes(option);\r\n \r\n let optionStyle = { ...defaultStyles.option };\r\n if (showFeedback) {\r\n if (isCorrectOption) {\r\n optionStyle = { ...optionStyle, ...defaultStyles.optionCorrect };\r\n } else if (selected && !isCorrectOption) {\r\n optionStyle = { ...optionStyle, ...defaultStyles.optionIncorrect };\r\n }\r\n } else if (selected) {\r\n optionStyle = { ...optionStyle, ...defaultStyles.optionSelected };\r\n }\r\n \r\n return (\r\n <div\r\n key={idx}\r\n style={{\r\n ...optionStyle,\r\n cursor: showFeedback ? 'default' : 'pointer',\r\n }}\r\n onClick={() => {\r\n if (showFeedback) return;\r\n const current = Array.isArray(selectedAnswer) ? selectedAnswer : [];\r\n if (selected) {\r\n handleAnswerChange(current.filter(o => o !== option));\r\n } else {\r\n handleAnswerChange([...current, option]);\r\n }\r\n }}\r\n >\r\n {option}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n\r\n {(currentQuestion.type === 'free' || currentQuestion.type === 'essay') && (\r\n <textarea\r\n style={{ ...defaultStyles.input, minHeight: currentQuestion.type === 'essay' ? '150px' : '60px' }}\r\n value={(selectedAnswer as string) || ''}\r\n onChange={e => handleAnswerChange(e.target.value)}\r\n placeholder=\"Type your answer here...\"\r\n disabled={showFeedback}\r\n />\r\n )}\r\n\r\n {currentQuestion.type === 'fill' && (\r\n <div style={defaultStyles.options}>\r\n {currentQuestion.blanks?.map((_, idx) => (\r\n <input\r\n key={idx}\r\n style={defaultStyles.input}\r\n value={(Array.isArray(selectedAnswer) ? selectedAnswer[idx] : '') || ''}\r\n onChange={e => {\r\n const current = Array.isArray(selectedAnswer) ? [...selectedAnswer] : [];\r\n current[idx] = e.target.value;\r\n handleAnswerChange(current);\r\n }}\r\n placeholder={`Blank ${idx + 1}`}\r\n disabled={showFeedback}\r\n />\r\n ))}\r\n </div>\r\n )}\r\n\r\n {/* Feedback section */}\r\n {showFeedback && currentAnswerDetail && (\r\n <div style={{\r\n ...defaultStyles.feedback,\r\n ...(currentAnswerDetail.isCorrect ? defaultStyles.feedbackCorrect : defaultStyles.feedbackIncorrect),\r\n }}>\r\n <div style={{\r\n ...defaultStyles.feedbackTitle,\r\n ...(currentAnswerDetail.isCorrect ? defaultStyles.feedbackTitleCorrect : defaultStyles.feedbackTitleIncorrect),\r\n }}>\r\n {currentAnswerDetail.isCorrect ? '✓ Correct!' : '✗ Incorrect'}\r\n </div>\r\n {currentQuestion.explanation && (\r\n <div style={defaultStyles.feedbackExplanation}>\r\n {currentQuestion.explanation}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Navigation buttons */}\r\n <div style={defaultStyles.buttonsColumn}>\r\n {/* Add More Questions button - shown on last question after feedback, if under 50 questions */}\r\n {showFeedback && isLastQuestion && canAddMore && (\r\n <button\r\n style={{\r\n ...defaultStyles.buttonAddMore,\r\n ...(isGeneratingExtra ? defaultStyles.buttonAddMoreDisabled : {}),\r\n }}\r\n onClick={handleAddMoreQuestions}\r\n disabled={isGeneratingExtra}\r\n data-testid=\"button-add-more-questions\"\r\n >\r\n {isGeneratingExtra ? (\r\n <>\r\n <Spinner size={16} color=\"#9ca3af\" />\r\n Generating Questions...\r\n </>\r\n ) : (\r\n <>+ Add {questionsToAdd} More Question{questionsToAdd !== 1 ? 's' : ''}</>\r\n )}\r\n </button>\r\n )}\r\n\r\n <div style={{ ...defaultStyles.buttons, justifyContent: 'flex-end' }}>\r\n {showFeedback ? (\r\n // After viewing feedback\r\n isLastQuestion ? (\r\n <button\r\n style={{\r\n ...defaultStyles.button,\r\n ...(isSubmitting || isGeneratingExtra ? defaultStyles.buttonDisabled : defaultStyles.buttonPrimary),\r\n }}\r\n onClick={handleSubmit}\r\n disabled={isSubmitting || isGeneratingExtra}\r\n data-testid=\"button-submit-quiz\"\r\n >\r\n {isSubmitting ? <Spinner size={16} color=\"#9ca3af\" /> : 'Submit Quiz'}\r\n </button>\r\n ) : (\r\n <button\r\n style={{\r\n ...defaultStyles.button,\r\n ...defaultStyles.buttonPrimary,\r\n }}\r\n onClick={handleContinue}\r\n data-testid=\"button-continue\"\r\n >\r\n Continue\r\n </button>\r\n )\r\n ) : (\r\n // Before checking answer\r\n <button\r\n style={{\r\n ...defaultStyles.button,\r\n ...(isNavigating || selectedAnswer === undefined ? defaultStyles.buttonDisabled : defaultStyles.buttonPrimary),\r\n }}\r\n onClick={handleCheckAnswer}\r\n disabled={isNavigating || selectedAnswer === undefined}\r\n data-testid=\"button-check-answer\"\r\n >\r\n {isNavigating ? <Spinner size={16} color=\"#9ca3af\" /> : 'Check Answer'}\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import type { Quiz, ExternalQuizAttempt, QuizAnswerDetail } from './types';\r\n\r\nexport interface ApiClientConfig {\r\n baseUrl: string;\r\n authToken?: string;\r\n}\r\n\r\nexport class QuizApiClient {\r\n private baseUrl: string;\r\n private authToken?: string;\r\n\r\n constructor(config: ApiClientConfig) {\r\n this.baseUrl = config.baseUrl.replace(/\\/$/, ''); // Remove trailing slash\r\n this.authToken = config.authToken;\r\n }\r\n\r\n private async request<T>(\r\n method: string,\r\n endpoint: string,\r\n body?: unknown\r\n ): Promise<T> {\r\n const headers: HeadersInit = {\r\n 'Content-Type': 'application/json',\r\n };\r\n\r\n if (this.authToken) {\r\n headers['Authorization'] = `Bearer ${this.authToken}`;\r\n }\r\n\r\n const response = await fetch(`${this.baseUrl}${endpoint}`, {\r\n method,\r\n headers,\r\n body: body ? JSON.stringify(body) : undefined,\r\n });\r\n\r\n if (!response.ok) {\r\n const error = await response.json().catch(() => ({ error: 'Request failed' }));\r\n throw new Error(error.error || `HTTP ${response.status}`);\r\n }\r\n\r\n return response.json();\r\n }\r\n\r\n async getQuiz(quizId: string): Promise<Quiz> {\r\n return this.request<Quiz>('GET', `/api/external/quizzes/${quizId}`);\r\n }\r\n\r\n async createAttempt(params: {\r\n quizId: string;\r\n lessonId: string;\r\n assignLessonId: string;\r\n courseId: string;\r\n childId: string;\r\n parentId: string;\r\n }): Promise<ExternalQuizAttempt> {\r\n return this.request<ExternalQuizAttempt>('POST', '/api/external/quiz-attempts', params);\r\n }\r\n\r\n async updateAttempt(\r\n attemptId: string,\r\n data: {\r\n answers?: QuizAnswerDetail[];\r\n status?: 'in_progress' | 'completed' | 'abandoned';\r\n score?: number;\r\n correctAnswers?: number;\r\n timeSpentSeconds?: number;\r\n }\r\n ): Promise<ExternalQuizAttempt> {\r\n return this.request<ExternalQuizAttempt>(\r\n 'PATCH',\r\n `/api/external/quiz-attempts/${attemptId}`,\r\n data\r\n );\r\n }\r\n\r\n async getAttempt(attemptId: string): Promise<ExternalQuizAttempt> {\r\n return this.request<ExternalQuizAttempt>('GET', `/api/external/quiz-attempts/${attemptId}`);\r\n }\r\n\r\n async getAttempts(params: {\r\n assignLessonId?: string;\r\n childId?: string;\r\n quizId?: string;\r\n }): Promise<ExternalQuizAttempt[]> {\r\n const queryParams = new URLSearchParams();\r\n if (params.assignLessonId) queryParams.set('assignLessonId', params.assignLessonId);\r\n if (params.childId) queryParams.set('childId', params.childId);\r\n if (params.quizId) queryParams.set('quizId', params.quizId);\r\n\r\n return this.request<ExternalQuizAttempt[]>(\r\n 'GET',\r\n `/api/external/quiz-attempts?${queryParams.toString()}`\r\n );\r\n }\r\n}\r\n","import type { QuizQuestion, QuizAnswerDetail, QuestionType } from './types';\r\n\r\n// Check if an answer is correct based on question type\r\nexport function checkAnswer(\r\n question: QuizQuestion,\r\n selectedAnswer: unknown\r\n): { isCorrect: boolean; pointsEarned: number } {\r\n const { type, correctAnswer, points } = question;\r\n\r\n switch (type) {\r\n case 'single':\r\n case 'true-false': {\r\n const isCorrect = selectedAnswer === correctAnswer;\r\n return { isCorrect, pointsEarned: isCorrect ? points : 0 };\r\n }\r\n\r\n case 'multiple': {\r\n if (!Array.isArray(selectedAnswer) || !Array.isArray(correctAnswer)) {\r\n return { isCorrect: false, pointsEarned: 0 };\r\n }\r\n const sortedSelected = [...selectedAnswer].sort();\r\n const sortedCorrect = [...correctAnswer].sort();\r\n const isCorrect =\r\n sortedSelected.length === sortedCorrect.length &&\r\n sortedSelected.every((val, idx) => val === sortedCorrect[idx]);\r\n return { isCorrect, pointsEarned: isCorrect ? points : 0 };\r\n }\r\n\r\n case 'fill': {\r\n if (!Array.isArray(selectedAnswer) || !question.blanks) {\r\n return { isCorrect: false, pointsEarned: 0 };\r\n }\r\n const isCorrect = question.blanks.every((blank, idx) =>\r\n selectedAnswer[idx]?.toLowerCase().trim() === blank.toLowerCase().trim()\r\n );\r\n return { isCorrect, pointsEarned: isCorrect ? points : 0 };\r\n }\r\n\r\n case 'sorting': {\r\n if (!Array.isArray(selectedAnswer) || !question.correctOrder) {\r\n return { isCorrect: false, pointsEarned: 0 };\r\n }\r\n const isCorrect =\r\n selectedAnswer.length === question.correctOrder.length &&\r\n selectedAnswer.every((val, idx) => val === question.correctOrder![idx]);\r\n return { isCorrect, pointsEarned: isCorrect ? points : 0 };\r\n }\r\n\r\n case 'matrix': {\r\n if (typeof selectedAnswer !== 'object' || !question.correctMatches) {\r\n return { isCorrect: false, pointsEarned: 0 };\r\n }\r\n const selected = selectedAnswer as Record<string, string>;\r\n const correct = question.correctMatches;\r\n const isCorrect = Object.keys(correct).every(\r\n key => selected[key] === correct[key]\r\n );\r\n return { isCorrect, pointsEarned: isCorrect ? points : 0 };\r\n }\r\n\r\n case 'free': {\r\n // For free-form answers, do a simple case-insensitive comparison\r\n if (typeof selectedAnswer !== 'string' || typeof correctAnswer !== 'string') {\r\n return { isCorrect: false, pointsEarned: 0 };\r\n }\r\n const isCorrect = selectedAnswer.toLowerCase().trim() === correctAnswer.toLowerCase().trim();\r\n return { isCorrect, pointsEarned: isCorrect ? points : 0 };\r\n }\r\n\r\n case 'essay':\r\n case 'assessment':\r\n // These require manual grading or are opinion-based\r\n return { isCorrect: false, pointsEarned: 0 };\r\n\r\n default:\r\n return { isCorrect: false, pointsEarned: 0 };\r\n }\r\n}\r\n\r\n// Create an answer detail object\r\nexport function createAnswerDetail(\r\n question: QuizQuestion,\r\n selectedAnswer: unknown\r\n): QuizAnswerDetail {\r\n const { isCorrect, pointsEarned } = checkAnswer(question, selectedAnswer);\r\n\r\n return {\r\n questionId: question.id,\r\n questionText: question.question,\r\n questionType: question.type,\r\n points: question.points,\r\n pointsEarned,\r\n selectedAnswer: selectedAnswer as QuizAnswerDetail['selectedAnswer'],\r\n correctAnswer: question.correctAnswer as QuizAnswerDetail['correctAnswer'],\r\n isCorrect,\r\n explanation: question.explanation,\r\n hint: question.hint,\r\n };\r\n}\r\n\r\n// Calculate total score percentage\r\nexport function calculateScore(answers: QuizAnswerDetail[]): {\r\n score: number;\r\n correctAnswers: number;\r\n totalPoints: number;\r\n earnedPoints: number;\r\n} {\r\n const totalPoints = answers.reduce((sum, a) => sum + a.points, 0);\r\n const earnedPoints = answers.reduce((sum, a) => sum + a.pointsEarned, 0);\r\n const correctAnswers = answers.filter(a => a.isCorrect).length;\r\n const score = totalPoints > 0 ? Math.round((earnedPoints / totalPoints) * 100) : 0;\r\n\r\n return { score, correctAnswers, totalPoints, earnedPoints };\r\n}\r\n\r\n// Format time in seconds to mm:ss\r\nexport function formatTime(seconds: number): string {\r\n const mins = Math.floor(seconds / 60);\r\n const secs = seconds % 60;\r\n return `${mins}:${secs.toString().padStart(2, '0')}`;\r\n}\r\n","import { useState, useEffect } from 'react';\r\nimport type {\r\n AttemptViewerProps,\r\n ExternalQuizAttempt,\r\n QuizAnswerDetail,\r\n} from './types';\r\nimport { QuizApiClient } from './api';\r\nimport { formatTime } from './utils';\r\n\r\nconst defaultStyles = {\r\n container: {\r\n fontFamily: 'system-ui, -apple-system, sans-serif',\r\n width: '100%',\r\n padding: '20px',\r\n backgroundColor: '#ffffff',\r\n borderRadius: '12px',\r\n boxSizing: 'border-box' as const,\r\n },\r\n header: {\r\n marginBottom: '24px',\r\n borderBottom: '1px solid #e5e7eb',\r\n paddingBottom: '20px',\r\n },\r\n title: {\r\n fontSize: '24px',\r\n fontWeight: '600',\r\n marginBottom: '16px',\r\n color: '#111827',\r\n },\r\n summaryGrid: {\r\n display: 'grid',\r\n gridTemplateColumns: 'repeat(auto-fit, minmax(120px, 1fr))',\r\n gap: '16px',\r\n },\r\n summaryCard: {\r\n padding: '12px',\r\n backgroundColor: '#f9fafb',\r\n borderRadius: '8px',\r\n textAlign: 'center' as const,\r\n },\r\n summaryValue: {\r\n fontSize: '20px',\r\n fontWeight: '600',\r\n color: '#6721b0',\r\n marginBottom: '2px',\r\n },\r\n summaryLabel: {\r\n fontSize: '10px',\r\n color: '#6b7280',\r\n textTransform: 'uppercase' as const,\r\n letterSpacing: '0.05em',\r\n },\r\n questionsList: {\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n gap: '16px',\r\n },\r\n questionCard: {\r\n padding: '16px',\r\n border: '2px solid #e5e7eb',\r\n borderRadius: '8px',\r\n },\r\n questionCardCorrect: {\r\n borderColor: '#22c55e',\r\n backgroundColor: '#f0fdf4',\r\n },\r\n questionCardIncorrect: {\r\n borderColor: '#ef4444',\r\n backgroundColor: '#fef2f2',\r\n },\r\n questionHeader: {\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n alignItems: 'flex-start',\r\n marginBottom: '12px',\r\n },\r\n questionNumber: {\r\n fontSize: '12px',\r\n color: '#6b7280',\r\n fontWeight: '500',\r\n },\r\n questionBadge: {\r\n padding: '4px 8px',\r\n borderRadius: '4px',\r\n fontSize: '12px',\r\n fontWeight: '600',\r\n },\r\n badgeCorrect: {\r\n backgroundColor: '#dcfce7',\r\n color: '#166534',\r\n },\r\n badgeIncorrect: {\r\n backgroundColor: '#fee2e2',\r\n color: '#991b1b',\r\n },\r\n questionText: {\r\n fontSize: '16px',\r\n fontWeight: '500',\r\n marginBottom: '12px',\r\n color: '#111827',\r\n },\r\n answerSection: {\r\n fontSize: '14px',\r\n marginBottom: '8px',\r\n },\r\n answerLabel: {\r\n fontWeight: '600',\r\n color: '#6b7280',\r\n marginRight: '8px',\r\n },\r\n studentAnswer: {\r\n color: '#111827',\r\n },\r\n correctAnswer: {\r\n color: '#166534',\r\n },\r\n points: {\r\n fontSize: '13px',\r\n color: '#6b7280',\r\n marginTop: '8px',\r\n },\r\n explanation: {\r\n marginTop: '12px',\r\n padding: '12px',\r\n backgroundColor: '#f3e8ff',\r\n borderRadius: '6px',\r\n fontSize: '14px',\r\n color: '#581c87',\r\n },\r\n loading: {\r\n textAlign: 'center' as const,\r\n padding: '40px 20px',\r\n },\r\n spinner: {\r\n display: 'inline-block',\r\n width: '32px',\r\n height: '32px',\r\n border: '3px solid #e5e7eb',\r\n borderTopColor: '#6721b0',\r\n borderRadius: '50%',\r\n animation: 'spin 1s linear infinite',\r\n },\r\n error: {\r\n textAlign: 'center' as const,\r\n padding: '40px 20px',\r\n color: '#ef4444',\r\n },\r\n retryButton: {\r\n marginTop: '16px',\r\n padding: '12px 24px',\r\n backgroundColor: '#6721b0',\r\n color: '#ffffff',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: '500',\r\n cursor: 'pointer',\r\n },\r\n};\r\n\r\nconst spinnerKeyframes = `\r\n @keyframes spin {\r\n to { transform: rotate(360deg); }\r\n }\r\n`;\r\n\r\nfunction formatAnswer(answer: unknown): string {\r\n if (answer === null || answer === undefined) {\r\n return 'No answer';\r\n }\r\n if (typeof answer === 'string') {\r\n return answer;\r\n }\r\n if (Array.isArray(answer)) {\r\n return answer.join(', ');\r\n }\r\n if (typeof answer === 'object') {\r\n return Object.entries(answer as Record<string, string>)\r\n .map(([k, v]) => `${k} → ${v}`)\r\n .join(', ');\r\n }\r\n return String(answer);\r\n}\r\n\r\nexport function AttemptViewer({\r\n attemptId,\r\n apiBaseUrl,\r\n authToken,\r\n onError,\r\n className,\r\n showExplanations = true,\r\n title,\r\n}: AttemptViewerProps) {\r\n const [attempt, setAttempt] = useState<ExternalQuizAttempt | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n const apiClient = new QuizApiClient({\r\n baseUrl: apiBaseUrl,\r\n authToken,\r\n });\r\n\r\n async function fetchAttempt() {\r\n setLoading(true);\r\n setError(null);\r\n try {\r\n const response = await fetch(`${apiBaseUrl}/api/external/quiz-attempts/${attemptId}`, {\r\n headers: authToken ? { Authorization: `Bearer ${authToken}` } : {},\r\n });\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch attempt: ${response.statusText}`);\r\n }\r\n const data = await response.json();\r\n setAttempt(data);\r\n } catch (err) {\r\n const errorMessage = err instanceof Error ? err.message : 'Failed to load attempt';\r\n setError(errorMessage);\r\n onError?.(err instanceof Error ? err : new Error(errorMessage));\r\n } finally {\r\n setLoading(false);\r\n }\r\n }\r\n\r\n fetchAttempt();\r\n }, [attemptId, apiBaseUrl, authToken, onError]);\r\n\r\n const handleRetry = () => {\r\n setLoading(true);\r\n setError(null);\r\n window.location.reload();\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <div style={defaultStyles.container} className={className}>\r\n <style>{spinnerKeyframes}</style>\r\n <div style={defaultStyles.loading}>\r\n <div style={defaultStyles.spinner} />\r\n <p style={{ marginTop: '16px', color: '#6b7280' }}>Loading attempt...</p>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n if (error || !attempt) {\r\n return (\r\n <div style={defaultStyles.container} className={className}>\r\n <div style={defaultStyles.error}>\r\n <p style={{ fontSize: '18px', fontWeight: '500' }}>Failed to load attempt</p>\r\n <p style={{ marginTop: '8px', color: '#6b7280' }}>{error}</p>\r\n <button style={defaultStyles.retryButton} onClick={handleRetry}>\r\n Try Again\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n const scorePercentage = attempt.score ?? 0;\r\n const correctCount = attempt.correctAnswers ?? 0;\r\n const totalQuestions = attempt.totalQuestions;\r\n const timeSpent = attempt.timeSpentSeconds ?? 0;\r\n\r\n return (\r\n <div style={defaultStyles.container} className={className}>\r\n <style>{spinnerKeyframes}</style>\r\n \r\n <div style={defaultStyles.header}>\r\n <div style={defaultStyles.summaryGrid}>\r\n <div style={defaultStyles.summaryCard}>\r\n <div style={defaultStyles.summaryValue}>{scorePercentage}%</div>\r\n <div style={defaultStyles.summaryLabel}>Score</div>\r\n </div>\r\n <div style={defaultStyles.summaryCard}>\r\n <div style={defaultStyles.summaryValue}>{correctCount}/{totalQuestions}</div>\r\n <div style={defaultStyles.summaryLabel}>Correct</div>\r\n </div>\r\n <div style={defaultStyles.summaryCard}>\r\n <div style={defaultStyles.summaryValue}>{formatTime(timeSpent)}</div>\r\n <div style={defaultStyles.summaryLabel}>Time</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div style={defaultStyles.questionsList}>\r\n {attempt.answers.map((answer: QuizAnswerDetail, index: number) => (\r\n <div\r\n key={answer.questionId}\r\n style={{\r\n ...defaultStyles.questionCard,\r\n ...(answer.isCorrect ? defaultStyles.questionCardCorrect : defaultStyles.questionCardIncorrect),\r\n }}\r\n >\r\n <div style={defaultStyles.questionHeader}>\r\n <span style={defaultStyles.questionNumber}>Question {index + 1}</span>\r\n <span\r\n style={{\r\n ...defaultStyles.questionBadge,\r\n ...(answer.isCorrect ? defaultStyles.badgeCorrect : defaultStyles.badgeIncorrect),\r\n }}\r\n >\r\n {answer.isCorrect ? 'Correct' : 'Incorrect'}\r\n </span>\r\n </div>\r\n\r\n <div style={defaultStyles.questionText}>{answer.questionText}</div>\r\n\r\n <div style={defaultStyles.answerSection}>\r\n <span style={defaultStyles.answerLabel}>Your answer:</span>\r\n <span style={defaultStyles.studentAnswer}>\r\n {formatAnswer(answer.selectedAnswer)}\r\n </span>\r\n </div>\r\n\r\n {!answer.isCorrect && answer.correctAnswer && (\r\n <div style={defaultStyles.answerSection}>\r\n <span style={defaultStyles.answerLabel}>Correct answer:</span>\r\n <span style={defaultStyles.correctAnswer}>\r\n {formatAnswer(answer.correctAnswer)}\r\n </span>\r\n </div>\r\n )}\r\n\r\n <div style={defaultStyles.points}>\r\n {answer.pointsEarned} / {answer.points} points\r\n </div>\r\n\r\n {showExplanations && answer.explanation && (\r\n <div style={defaultStyles.explanation}>\r\n <strong>Explanation:</strong> {answer.explanation}\r\n </div>\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"mappings":"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","names":["selectedAnswer","result","import_react","import_jsx_runtime","defaultStyles"]}