import { useState } from 'react'; import { Circle, CircleCheck, CircleX } from 'lucide-react'; import { cn } from '../../lib/classname'; import type { LessonFileType } from '../../lib/course'; import { currentLesson } from '../../stores/course'; import { useStore } from '@nanostores/react'; type QuizViewProps = { lesson: LessonFileType; }; export function QuizView(props: QuizViewProps) { const { lesson } = props; const { frontmatter } = lesson; const { questions = [] } = frontmatter; const [selectedOptions, setSelectedOptions] = useState< Record >({}); const $currentLesson = useStore(currentLesson); const [isSubmitted, setIsSubmitted] = useState(false); const isAllAnswered = Object.keys(selectedOptions).length === questions.length; const correctAnswerCount = questions.filter((question) => { const selectedOptionId = selectedOptions?.[question.id]; const correctAnswerId = question.options.find( (option) => option.isCorrectOption, )?.id; return selectedOptionId === correctAnswerId; }).length; return (

{lesson.frontmatter.title}

{questions.map((question) => { return ( { const selectedOptionId = selectedOptions?.[question.id]; let optionStatus: QuizOptionStatus = 'default'; if (option.isCorrectOption && isSubmitted) { optionStatus = 'correct'; } else if (selectedOptionId === option.id) { optionStatus = isSubmitted ? 'wrong' : 'selected'; } return { ...option, status: optionStatus, }; })} onOptionSelectChange={(id, optionId) => { setSelectedOptions((prev) => ({ ...prev, [id]: optionId, })); }} selectedOptionId={selectedOptions?.[question.id]} /> ); })}
{isSubmitted && (
You got {correctAnswerCount} out of {questions.length} questions right
)}
); } type QuizItemProps = { id: number; title: string; options: QuizOptionProps[]; disabled?: boolean; selectedOptionId?: number; onOptionSelectChange?: (id: number, optionId: number) => void; }; export function QuizItem(props: QuizItemProps) { const { id, title, options, onOptionSelectChange, disabled } = props; const hasWrongAnswer = options.some((item) => item.status === 'wrong'); const hasCorrectAnswer = options.some((item) => item.status === 'correct'); return (
{(hasWrongAnswer || hasCorrectAnswer) && ( Correct )}

{title}

{options.map((option, index) => { return ( onOptionSelectChange?.(id, option.id)} disabled={disabled} /> ); })}
); } type QuizOptionStatus = 'selected' | 'wrong' | 'correct' | 'default'; type QuizOptionProps = { id: number; text: string; isCorrectOption?: boolean; status?: QuizOptionStatus; disabled?: boolean; onSelect?: () => void; }; export function QuizOption(props: QuizOptionProps) { const { text, status = 'default', onSelect, disabled } = props; return ( ); }