Rev 3563 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
import React, { useState } from 'react'import { connect } from 'react-redux'import { startQuiz } from '@app/services/micro-learning'import { addNotification } from '@app/redux/notification/notification.actions'import Widget from '@app/components/UI/Widget'import QuizSimpleQuestion from './quiz-simple-question'import QuizMultipleQuestion from './quiz-multiple-question'import SlideProgress from './slide-progress'import SlideSuccessFeedback from './slide-success-feedback'import SlideQuizStart from './slide-quiz-start'import QuizFailureFeedback from './quiz-failure-feedback'function SlideQuiz({quiz,slide,onSync,startUrl,completed,addNotification}) {const [currentQuestion, setCurrentQuestion] = useState(0)const [showQuestions, setShowQuestions] = useState(false)const [completedQuiz, setCompletedQuiz] = useState(false)const [failureQuiz, setFailureQuiz] = useState(false)const [totalPoints, setTotalPoints] = useState(0)const [answer, setAnswers] = useState([])const { name, questions, minimum_points_required } = quizconst handleStart = async () => {try {const start = await startQuiz(startUrl)if (start) setShowQuestions(true)} catch (error) {addNotification({ style: 'danger', msg: error.message })}}const onError = () => {setFailureQuiz(true)}const restartQuiz = () => {setCurrentQuestion(0)setTotalPoints(0)setFailureQuiz(false)setCompletedQuiz(false)setShowQuestions(false)}const onSimpleConfirm = (question, answerId) => {const answer = question.answers.find((q) => q.uuid === answerId)const newAnswer = {question: question.uuid,answers: [answer]}setAnswers((prevAnswers) => [...prevAnswers, newAnswer])const isCorrect = answer.correct === 'y'isCorrect && setTotalPoints(totalPoints + parseInt(question.points))if (currentQuestion !== questions.length - 1) {setCurrentQuestion(currentQuestion + 1)return}if (totalPoints >= parseInt(minimum_points_required)) {setCompletedQuiz(true)} else {onError()}}const onMultipleConfirm = (question, answersIds) => {const answers = question.answers.filter((answer) =>answersIds.includes(answer.uuid))const newAnswer = {question: question.uuid,answers}setAnswers((prevAnswers) => [...prevAnswers, newAnswer])const points = answers.reduce((acc, answer) => acc + parseInt(answer.points),0)setTotalPoints(totalPoints + points)if (currentQuestion !== questions.length - 1) {setCurrentQuestion(currentQuestion + 1)return}if (totalPoints >= parseInt(minimum_points_required)) {setCompletedQuiz(true)} else {onError()}}if (completedQuiz) {return <SlideSuccessFeedback onConfirm={onSync} />}if (failureQuiz) {return <QuizFailureFeedback onConfirm={restartQuiz} />}if (!showQuestions) {return (<SlideQuizStartonStart={handleStart}completed={completed}slide={slide}/>)}return (<Widget><SlideProgresspoints={totalPoints}time={quiz.max_time}currentQuestion={currentQuestion + 1}totalQuestions={questions.length}onTimeEnd={onError}/><Widget.Header title={`Cuestionario sobre: ${name}`} /><Widget.Body>{questions.map((question, index) => {const isLastQuestion = index === questions.length - 1const buttonLabel = isLastQuestion ? 'Finalizar' : 'Siguiente'if (question.type === 's') {return (<QuizSimpleQuestionkey={question.uuid}question={question}onConfirm={(answer) => onSimpleConfirm(question, answer)}buttonLabel={buttonLabel}isCurrent={currentQuestion === index}/>)}if (question.type === 'm') {return (<QuizMultipleQuestionkey={question.uuid}question={question}onConfirm={(answers) => onMultipleConfirm(question, answers)}buttonLabel={buttonLabel}isCurrent={currentQuestion === index}/>)}return null})}</Widget.Body></Widget>)}const mapDispatchToProps = {addNotification: (notification) => addNotification(notification)}export default connect(null, mapDispatchToProps)(SlideQuiz)