@schoolio/player 1.0.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/api.ts","../src/utils.ts","../src/QuizPlayer.tsx"],"names":["selectedAnswer"],"mappings":"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","file":"index.mjs","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 },\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: '#3b82f6',\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: '#3b82f6',\r\n backgroundColor: '#eff6ff',\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: '#3b82f6',\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: '#3b82f6',\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\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 [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 // 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 }\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 ? 'Submitting...' : 'Submit Quiz'}\r\n </button>\r\n ) : (\r\n <button\r\n style={{\r\n ...defaultStyles.button,\r\n ...(selectedAnswer !== undefined ? defaultStyles.buttonPrimary : defaultStyles.buttonDisabled),\r\n }}\r\n onClick={handleNext}\r\n disabled={selectedAnswer === undefined}\r\n >\r\n Next\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n"]}
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "@schoolio/player",
3
+ "version": "1.0.0",
4
+ "description": "Quiz Player component for loading and playing quizzes from Quiz Engine",
5
+ "main": "./dist/index.js",
6
+ "module": "./dist/index.mjs",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.mjs",
11
+ "require": "./dist/index.js",
12
+ "types": "./dist/index.d.ts"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist"
17
+ ],
18
+ "scripts": {
19
+ "build": "tsup",
20
+ "dev": "tsup --watch",
21
+ "typecheck": "tsc --noEmit"
22
+ },
23
+ "peerDependencies": {
24
+ "react": ">=17.0.0",
25
+ "react-dom": ">=17.0.0"
26
+ },
27
+ "devDependencies": {
28
+ "@types/react": "^18.2.0",
29
+ "@types/react-dom": "^18.2.0",
30
+ "react": "^18.2.0",
31
+ "react-dom": "^18.2.0",
32
+ "tsup": "^8.0.0",
33
+ "typescript": "^5.0.0"
34
+ },
35
+ "keywords": [
36
+ "quiz",
37
+ "quiz-player",
38
+ "education",
39
+ "react",
40
+ "component"
41
+ ],
42
+ "license": "MIT",
43
+ "repository": {
44
+ "type": "git",
45
+ "url": "https://github.com/yourusername/quizengine-player"
46
+ }
47
+ }