Skip to content

Commit 39b6692

Browse files
authored
Merge pull request #13165 from TylerAPfledderer/feat/quiz-component-stories
feat(Quiz): create stories for Quiz components
2 parents 0b4f827 + 716719c commit 39b6692

16 files changed

+623
-162
lines changed

src/components/Quiz/QuizWidget/QuizButtonGroup.tsx

Lines changed: 43 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,55 @@
1-
import { useMemo } from "react"
1+
import { type Dispatch, type SetStateAction, useMemo } from "react"
22
import { FaTwitter } from "react-icons/fa"
33
import { Center, Icon } from "@chakra-ui/react"
44

5+
import type { AnswerChoice, Question, QuizKey, QuizStatus } from "@/lib/types"
6+
57
import { Button } from "@/components/Buttons"
68
import Translation from "@/components/Translation"
79

810
import { trackCustomEvent } from "@/lib/utils/matomo"
911

10-
import { useQuizWidgetContext } from "./context"
11-
12-
export const QuizButtonGroup = () => {
13-
const {
14-
showResults,
15-
initialize: handleReset,
16-
currentQuestionAnswerChoice,
17-
title,
18-
questions,
19-
currentQuestionIndex,
20-
quizPageProps,
21-
answerStatus,
22-
numberOfCorrectAnswers,
23-
userQuizProgress,
24-
quizScore,
25-
setCurrentQuestionAnswerChoice,
26-
setUserQuizProgress,
27-
setShowAnswer,
28-
} = useQuizWidgetContext()
12+
import type { AnswerStatus } from "./useQuizWidget"
13+
14+
type QuizButtonGroupProps = {
15+
showResults: boolean
16+
handleReset: () => void
17+
currentQuestionAnswerChoice: AnswerChoice | null
18+
title: string
19+
questions: Question[]
20+
currentQuestionIndex: number
21+
quizPageProps:
22+
| {
23+
currentHandler: (nextKey: QuizKey) => void
24+
statusHandler: (status: QuizStatus) => void
25+
nextQuiz: QuizKey | undefined
26+
}
27+
| false
28+
answerStatus: AnswerStatus
29+
numberOfCorrectAnswers: number
30+
userQuizProgress: AnswerChoice[]
31+
quizScore: number
32+
setCurrentQuestionAnswerChoice: (answer: AnswerChoice | null) => void
33+
setUserQuizProgress: Dispatch<SetStateAction<AnswerChoice[]>>
34+
setShowAnswer: (prev: boolean) => void
35+
}
2936

37+
export const QuizButtonGroup = ({
38+
showResults,
39+
handleReset,
40+
currentQuestionAnswerChoice,
41+
title,
42+
questions,
43+
currentQuestionIndex,
44+
quizPageProps,
45+
answerStatus,
46+
numberOfCorrectAnswers,
47+
userQuizProgress,
48+
quizScore,
49+
setCurrentQuestionAnswerChoice,
50+
setUserQuizProgress,
51+
setShowAnswer,
52+
}: QuizButtonGroupProps) => {
3053
const finishedQuiz = useMemo(
3154
() => userQuizProgress.length === questions.length! - 1,
3255
[questions.length, userQuizProgress.length]

src/components/Quiz/QuizWidget/QuizContent.tsx

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,19 @@
1-
import { useCallback } from "react"
1+
import { type ReactNode, useCallback } from "react"
22
import { Text, type TextProps, VStack } from "@chakra-ui/react"
33

4-
import { ChildOnlyProp } from "@/lib/types"
4+
import type { AnswerStatus } from "./useQuizWidget"
55

6-
import { useQuizWidgetContext } from "./context"
7-
8-
type QuizContentProps = ChildOnlyProp
9-
10-
export const QuizContent = ({ children }: QuizContentProps) => {
11-
const { answerStatus, title } = useQuizWidgetContext()
6+
type QuizContentProps = {
7+
answerStatus: AnswerStatus
8+
title: string
9+
children: ReactNode
10+
}
1211

12+
export const QuizContent = ({
13+
answerStatus,
14+
title,
15+
children,
16+
}: QuizContentProps) => {
1317
const getTitleContent = useCallback((): string => {
1418
if (!answerStatus) return title
1519

src/components/Quiz/QuizWidget/QuizProgressBar.tsx

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,25 @@
11
import { useCallback } from "react"
22
import { Center, ChakraProps, Container } from "@chakra-ui/react"
33

4+
import type { AnswerChoice, Question } from "@/lib/types"
5+
46
import { PROGRESS_BAR_GAP } from "@/lib/constants"
57

6-
import { useQuizWidgetContext } from "./context"
8+
import type { AnswerStatus } from "./useQuizWidget"
79

8-
export const QuizProgressBar = () => {
9-
const { questions, answerStatus, currentQuestionIndex, userQuizProgress } =
10-
useQuizWidgetContext()
10+
type QuizProgressBarProps = {
11+
questions: Question[]
12+
answerStatus: AnswerStatus
13+
currentQuestionIndex: number
14+
userQuizProgress: AnswerChoice[]
15+
}
1116

17+
export const QuizProgressBar = ({
18+
questions,
19+
answerStatus,
20+
currentQuestionIndex,
21+
userQuizProgress,
22+
}: QuizProgressBarProps) => {
1223
const progressBarBackground = useCallback(
1324
(index: number): ChakraProps["bg"] => {
1425
if (

src/components/Quiz/QuizWidget/QuizRadioGroup.tsx

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,28 @@ import {
1515
VisuallyHidden,
1616
} from "@chakra-ui/react"
1717

18-
import type { AnswerKey, TranslationKey } from "@/lib/types"
19-
20-
import { useQuizWidgetContext } from "./context"
18+
import type {
19+
AnswerChoice,
20+
AnswerKey,
21+
Question,
22+
TranslationKey,
23+
} from "@/lib/types"
24+
25+
import type { AnswerStatus } from "./useQuizWidget"
26+
27+
type QuizRadioGroupProps = {
28+
questions: Question[]
29+
currentQuestionIndex: number
30+
answerStatus: AnswerStatus
31+
setCurrentQuestionAnswerChoice: (answer: AnswerChoice | null) => void
32+
}
2133

22-
export const QuizRadioGroup = () => {
23-
const {
24-
questions,
25-
currentQuestionIndex,
26-
answerStatus,
27-
setCurrentQuestionAnswerChoice,
28-
} = useQuizWidgetContext()
34+
export const QuizRadioGroup = ({
35+
questions,
36+
currentQuestionIndex,
37+
answerStatus,
38+
setCurrentQuestionAnswerChoice,
39+
}: QuizRadioGroupProps) => {
2940
const { t } = useTranslation("learn-quizzes")
3041

3142
const handleSelection = (answerId: AnswerKey) => {

src/components/Quiz/QuizWidget/QuizSummary.tsx

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,19 @@ import {
1414

1515
import { numberToPercent } from "@/lib/utils/numberToPercent"
1616

17-
import { useQuizWidgetContext } from "./context"
18-
19-
export const QuizSummary = () => {
20-
const { numberOfCorrectAnswers, questions, ratioCorrect, isPassingScore } =
21-
useQuizWidgetContext()
17+
type QuizSummaryProps = {
18+
numberOfCorrectAnswers: number
19+
questionsLength: number
20+
ratioCorrect: number
21+
isPassingScore: boolean
22+
}
2223

24+
export const QuizSummary = ({
25+
numberOfCorrectAnswers,
26+
questionsLength,
27+
ratioCorrect,
28+
isPassingScore,
29+
}: QuizSummaryProps) => {
2330
const { locale } = useRouter()
2431
const { t } = useTranslation("learn-quizzes")
2532

@@ -78,7 +85,7 @@ export const QuizSummary = () => {
7885
{largerThanMobile && (
7986
<VStack>
8087
<Text size={commonTextSize} {...valueStyles}>
81-
{questions.length}
88+
{questionsLength}
8289
</Text>
8390
<Text size={commonTextSize} {...labelStyles}>
8491
{t("questions")}

src/components/Quiz/QuizWidget/context.ts

Lines changed: 0 additions & 44 deletions
This file was deleted.

src/components/Quiz/QuizWidget/index.tsx

Lines changed: 44 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import Translation from "@/components/Translation"
1616
import { useLocalQuizData } from "../useLocalQuizData"
1717

1818
import { AnswerIcon } from "./AnswerIcon"
19-
import { QuizWidgetProvider } from "./context"
2019
import { QuizButtonGroup } from "./QuizButtonGroup"
2120
import { QuizConfetti } from "./QuizConfetti"
2221
import { QuizContent } from "./QuizContent"
@@ -139,39 +138,57 @@ const QuizWidget = ({
139138
>
140139
<AnswerIcon answerStatus={answerStatus} />
141140
</Center>
142-
<Stack spacing="8" justifyContent="space-between">
141+
<Stack
142+
spacing="8"
143+
justifyContent="space-between"
144+
mt={{ base: 8, sm: 0 }}
145+
>
143146
{quizData ? (
144-
<QuizWidgetProvider
145-
value={{
146-
...quizData,
147-
answerStatus,
148-
currentQuestionIndex,
149-
userQuizProgress,
150-
showResults,
151-
currentQuestionAnswerChoice,
152-
quizPageProps: quizPageProps.current,
153-
numberOfCorrectAnswers,
154-
quizScore,
155-
ratioCorrect,
156-
isPassingScore,
157-
initialize,
158-
setUserQuizProgress,
159-
setShowAnswer,
160-
setCurrentQuestionAnswerChoice,
161-
}}
162-
>
163-
<QuizContent>
147+
<>
148+
<QuizContent answerStatus={answerStatus} title={quizData.title}>
164149
{!showResults ? (
165150
<>
166-
<QuizProgressBar />
167-
<QuizRadioGroup />
151+
<QuizProgressBar
152+
answerStatus={answerStatus}
153+
currentQuestionIndex={currentQuestionIndex}
154+
questions={quizData.questions}
155+
userQuizProgress={userQuizProgress}
156+
/>
157+
<QuizRadioGroup
158+
answerStatus={answerStatus}
159+
currentQuestionIndex={currentQuestionIndex}
160+
questions={quizData.questions}
161+
setCurrentQuestionAnswerChoice={
162+
setCurrentQuestionAnswerChoice
163+
}
164+
/>
168165
</>
169166
) : (
170-
<QuizSummary />
167+
<QuizSummary
168+
questionsLength={quizData.questions.length}
169+
isPassingScore={isPassingScore}
170+
numberOfCorrectAnswers={numberOfCorrectAnswers}
171+
ratioCorrect={ratioCorrect}
172+
/>
171173
)}
172174
</QuizContent>
173-
<QuizButtonGroup />
174-
</QuizWidgetProvider>
175+
<QuizButtonGroup
176+
answerStatus={answerStatus}
177+
currentQuestionAnswerChoice={currentQuestionAnswerChoice}
178+
currentQuestionIndex={currentQuestionIndex}
179+
handleReset={initialize}
180+
numberOfCorrectAnswers={numberOfCorrectAnswers}
181+
questions={quizData.questions}
182+
quizPageProps={quizPageProps.current}
183+
quizScore={quizScore}
184+
setCurrentQuestionAnswerChoice={setCurrentQuestionAnswerChoice}
185+
setShowAnswer={setShowAnswer}
186+
showResults={showResults}
187+
title={quizData.title}
188+
userQuizProgress={userQuizProgress}
189+
setUserQuizProgress={setUserQuizProgress}
190+
/>
191+
</>
175192
) : (
176193
<Center>
177194
<Spinner />

0 commit comments

Comments
 (0)