import LoadingButton from '@/components/loading-button'; import Tabs from '@/components/tabs'; import { Button } from '@/components/ui/button'; import { Card } from '@/components/ui/card'; import { Checkbox } from '@/components/ui/checkbox'; import { Label } from '@/components/ui/label'; import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group'; import { Separator } from '@/components/ui/separator'; import { TabsContent } from '@/components/ui/tabs'; import { CoursePlayerProps } from '@/types/page'; import { useForm, usePage } from '@inertiajs/react'; import { useState } from 'react'; import { Renderer } from 'richtor'; import 'richtor/styles'; import LessonControl from './lesson-control'; type QuizAnswer = { question_id: string; answer: string[]; }; interface QuizViewerProps { quiz: SectionQuiz; } const QuizViewer = ({ quiz }: QuizViewerProps) => { const { auth, translate } = usePage().props; const { frontend } = translate; const [finished, setFinished] = useState(false); const [currentTab, setCurrentTab] = useState('summary'); const submissions = quiz.quiz_submissions; const attemptsUsed = submissions[0]?.attempts || 0; const hasAttemptLimit = quiz.retake > 0; const { data, setData, post, reset, processing } = useForm({ submission_id: submissions.length > 0 ? submissions[0].id : null, section_quiz_id: quiz.id, user_id: auth.user.id, answers: [] as QuizAnswer[], }); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); post(route('quiz-submissions.store'), { onSuccess: () => { reset(); setFinished(false); setCurrentTab('summary'); }, }); }; const handleCheckboxChange = (questionId: string, option: string, checked: boolean) => { if (checked) { const existingAnswer = data.answers.find((ans) => ans.question_id === questionId); if (existingAnswer) { setData( 'answers', data.answers.map((ans) => ans.question_id === questionId ? { ...ans, answer: [...ans.answer, option], } : ans, ), ); } else { setData('answers', [ ...data.answers, { question_id: questionId, answer: [option], }, ]); } } else { setData( 'answers', data.answers .map((ans) => ans.question_id === questionId ? { ...ans, answer: ans.answer.filter((a) => a !== option), } : ans, ) .filter((ans) => ans.answer.length > 0), ); } }; const handleRadioChange = (questionId: string, value: string) => { const existingAnswerIndex = data.answers.findIndex((ans) => ans.question_id === questionId); if (existingAnswerIndex >= 0) { setData( 'answers', data.answers.map((ans, index) => (index === existingAnswerIndex ? { ...ans, answer: [value] } : ans)), ); } else { setData('answers', [ ...data.answers, { question_id: questionId, answer: [value], }, ]); } }; const quizBack = (index: number) => { const previousQuestion = index - 1; if (previousQuestion < 0) { setCurrentTab('summary'); } else { setCurrentTab(quiz.quiz_questions[previousQuestion].id.toString()); } setFinished(false); }; const quizNext = (index: number) => { const totalQuestions = quiz.quiz_questions.length; const currentQuestion = index + 1; if (currentQuestion === totalQuestions) { setFinished(true); } else { setCurrentTab(quiz.quiz_questions[currentQuestion].id.toString()); } }; // Add this helper function to check if current question has an answer const hasAnswerForCurrentQuestion = (questionId: string) => { return data.answers.some((ans) => ans.question_id === questionId && ans.answer.length > 0); }; // Function to start/restart the quiz const startQuiz = () => { // Reset all form data setData({ submission_id: submissions.length > 0 ? submissions[0].id : null, section_quiz_id: quiz.id, user_id: auth.user.id, answers: [] as QuizAnswer[], }); // Reset state setFinished(false); // Start from first question setCurrentTab(quiz.quiz_questions[0].id.toString()); }; return (

{quiz.title}

{frontend.summery}

{frontend.duration}

:{` ${quiz.hours} ${frontend.hours} ${quiz.minutes} ${frontend.minutes} ${quiz.seconds} ${frontend.seconds}`}

{frontend.total_questions}

: {quiz.quiz_questions.length}

{frontend.total_marks}

: {quiz.total_mark}

{frontend.pass_marks}

: {quiz.pass_mark}

{frontend.retake}

: {hasAttemptLimit ? quiz.retake : 'Unlimited'}

{frontend.result}

{frontend.retake_attempts}

: {attemptsUsed}

{frontend.correct_answers}

: {submissions[0]?.correct_answers || 0}

{frontend.incorrect_answers}

: {submissions[0]?.incorrect_answers || 0}

{frontend.total_marks}

: {submissions[0]?.total_marks || 0}

Status

: {submissions[0]?.is_passed ? frontend.passed : frontend.not_passed}

{hasAttemptLimit && attemptsUsed >= quiz.retake ? ( ) : ( )}
{quiz.quiz_questions.map((question, index) => { // Parse the options and answers if they're strings const options = question?.options ? (typeof question.options === 'string' ? JSON.parse(question.options) : question.options) : []; return ( {question.type === 'boolean' ? ( ans.question_id === question.id.toString())?.answer[0] || undefined} onValueChange={(value) => handleRadioChange(question.id.toString(), value)} >
) : (
{options.map((option: string) => (
ans.question_id === question.id.toString() && ans.answer.includes(option))} onCheckedChange={(checked) => handleCheckboxChange(question.id.toString(), option, checked as boolean)} />
))}
)}
{finished ? ( Finish ) : ( )}
); })}
); }; export default QuizViewer;