You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
63 lines
1.6 KiB
63 lines
1.6 KiB
import { ReactNode, useEffect, useState } from 'react'
|
|
import { quiz } from '../data/QuizQuestions'
|
|
import { QuizContextTypes, Result, ScreenTypes } from '../types'
|
|
import { QuizContext, initialState } from './QuizContext'
|
|
|
|
type QuizProviderProps = {
|
|
children: ReactNode
|
|
}
|
|
|
|
const QuizProvider = ({ children }: QuizProviderProps) => {
|
|
const [timer, setTimer] = useState<number>(initialState.timer)
|
|
const [endTime, setEndTime] = useState<number>(initialState.endTime)
|
|
const [quizTopic, setQuizTopic] = useState<string>(initialState.quizTopic)
|
|
const [result, setResult] = useState<Result[]>(initialState.result)
|
|
const [currentScreen, setCurrentScreen] = useState<ScreenTypes>(
|
|
initialState.currentScreen
|
|
)
|
|
|
|
const [questions, setQuestions] = useState(quiz[initialState.quizTopic].questions)
|
|
|
|
const {
|
|
questions: quizQuestions,
|
|
totalQuestions,
|
|
totalTime,
|
|
totalScore,
|
|
} = quiz[quizTopic]
|
|
|
|
const selectQuizTopic = (topic: string) => {
|
|
setQuizTopic(topic)
|
|
}
|
|
|
|
useEffect(() => {
|
|
setTimer(totalTime)
|
|
setQuestions(quizQuestions)
|
|
}, [quizTopic])
|
|
|
|
const quizDetails = {
|
|
totalQuestions,
|
|
totalScore,
|
|
totalTime,
|
|
selectedQuizTopic: quizTopic,
|
|
}
|
|
|
|
const quizContextValue: QuizContextTypes = {
|
|
currentScreen,
|
|
setCurrentScreen,
|
|
quizTopic,
|
|
selectQuizTopic,
|
|
questions,
|
|
setQuestions,
|
|
result,
|
|
setResult,
|
|
quizDetails,
|
|
timer,
|
|
setTimer,
|
|
endTime,
|
|
setEndTime,
|
|
}
|
|
|
|
return <QuizContext.Provider value={quizContextValue}>{children}</QuizContext.Provider>
|
|
}
|
|
|
|
export default QuizProvider
|