Skip to content
Snippets Groups Projects
QuizQuestionContent.tsx 4.8 KiB
Newer Older
  • Learn to ignore specific revisions
  • import React, { Dispatch, SetStateAction, useCallback, useState } from 'react'
    
    import './quizQuestion.scss'
    import CloseIcon from 'assets/icons/ico/close.svg'
    import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton'
    
    Yoan VALLET's avatar
    Yoan VALLET committed
    import Button from '@material-ui/core/Button'
    
    import QuizExplanationModal from 'components/Quiz/QuizExplanationModal'
    import { useI18n } from 'cozy-ui/transpiled/react/I18n'
    import { Answer, UserChallenge, UserQuiz } from 'models'
    import ChallengeService from 'services/challenge.service'
    import QuizService from 'services/quiz.service'
    import { Client, useClient } from 'cozy-client'
    import { UserChallengeUpdateFlag } from 'enum/userChallenge.enum'
    import { updateUserChallengeList } from 'store/challenge/challenge.actions'
    import { useDispatch } from 'react-redux'
    
    interface QuizQuestionContent {
      userChallenge: UserChallenge
      setIsCustomQuest: Dispatch<SetStateAction<boolean>>
      goBack: () => void
    }
    
    const QuizQuestionContent: React.FC<QuizQuestionContent> = ({
      userChallenge,
      setIsCustomQuest,
      goBack,
    }: QuizQuestionContent) => {
      const { t } = useI18n()
      const questionIndexLocked = userChallenge.quiz.questions.findIndex(
        answer => answer.result == 0
      )
      const [userChoice, setUserChoice] = useState<string>('')
      const [openModal, setOpenModal] = useState<boolean>(false)
      const [answerIndex, setAnswerIndex] = useState<number>(0)
      const [questionIndex, setQuestionIndex] = useState<number>(
        questionIndexLocked
      )
    
      const client: Client = useClient()
      const dispatch = useDispatch()
    
      const quizService: QuizService = new QuizService(client)
      const challengeService: ChallengeService = new ChallengeService(client)
    
      const validateQuestion = async () => {
        const resultIndex: number = userChallenge.quiz.questions[
          questionIndex
        ].answers.findIndex(answer => answer.answerLabel === userChoice)
        const result: Answer[] = userChallenge.quiz.questions[
          questionIndex
        ].answers.filter(answer => answer.answerLabel === userChoice)
        setAnswerIndex(resultIndex)
        setOpenModal(true)
        const quizUpdated: UserQuiz = await quizService.updateUserQuiz(
          userChallenge.quiz,
          result[0].isTrue,
          questionIndex
        )
        const userChallengeUpdated: UserChallenge = await challengeService.updateUserChallenge(
          userChallenge,
          UserChallengeUpdateFlag.QUIZ_UPDATE,
          quizUpdated
        )
        dispatch(updateUserChallengeList(userChallengeUpdated))
      }
    
      const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
        setUserChoice(e.target.value)
      }
    
      const goNextQuestion = useCallback(() => {
        setUserChoice('')
    
        setOpenModal(false)
        if (questionIndex === userChallenge.quiz.questions.length - 1) {
          setIsCustomQuest(true)
        }
    
        if (questionIndex !== userChallenge.quiz.questions.length - 1) {
          setQuestionIndex(questionIndex + 1)
    
      }, [
        questionIndex,
        setIsCustomQuest,
        setQuestionIndex,
        setUserChoice,
        setOpenModal,
        userChallenge.quiz.questions.length,
      ])
    
    
      return (
        <div className="quiz-container">
          <div className="question-container">
            <StyledIconButton
              className="btn-back"
              icon={CloseIcon}
              onClick={goBack}
            />
            <p className="index-question">{questionIndex + 1}/5</p>
            <p className="question text-18-bold">
              {userChallenge.quiz.questions[questionIndex].questionLabel}
            </p>
            {userChallenge.quiz.questions[questionIndex].answers.map(
              (answer, index) => {
                return (
                  <div className="answer" key={index}>
                    <input
                      type="radio"
                      id={`answer${index}`}
                      value={answer.answerLabel}
                      onChange={handleChange}
                      checked={userChoice === answer.answerLabel}
                    />
                    <label htmlFor={`answer${index}`} className="text-16-bold">
                      {answer.answerLabel}
                    </label>
                  </div>
                )
              }
            )}
          </div>
          {userChoice && (
    
    Yoan VALLET's avatar
    Yoan VALLET committed
            <Button
              aria-label={t('quiz.accessibility.button_validate')}
    
              onClick={validateQuestion}
              classes={{
                root: 'btn-secondary-negative',
                label: 'text-16-normal',
              }}
            >
    
    Yoan VALLET's avatar
    Yoan VALLET committed
              {t('quiz.button_validate')}
            </Button>
    
          {openModal && (
            <QuizExplanationModal
              open={openModal}
              answerIndex={answerIndex}
              question={userChallenge.quiz.questions[questionIndex]}
              goNext={goNextQuestion}
              handleCloseClick={() => setOpenModal(false)}
            />
          )}
    
        </div>
      )
    }
    
    export default QuizQuestionContent