(exam.exercises.map((x) => defaultUserSolutions(x, exam)));
const [hasExamEnded, setHasExamEnded] = useExamStore((state) => [state.hasExamEnded, state.setHasExamEnded]);
+ useEffect(() => {
+ setCurrentQuestionIndex(0);
+ }, [questionIndex]);
+
+ useEffect(() => {
+ if (hasExamEnded && exerciseIndex === -1) {
+ setExerciseIndex((prev) => prev + 1);
+ }
+ }, [hasExamEnded, exerciseIndex]);
+
const nextExercise = (solution?: UserSolution) => {
if (solution) {
setUserSolutions((prev) => [...prev.filter((x) => x.exercise !== solution.exercise), solution]);
}
+ setQuestionIndex((prev) => prev + currentQuestionIndex);
if (exerciseIndex + 1 < exam.exercises.length) {
setExerciseIndex((prev) => prev + 1);
@@ -70,7 +83,7 @@ export default function Level({exam, showSolutions = false, onFinish}: Props) {
-1 &&
exerciseIndex < exam.exercises.length &&
!showSolutions &&
- renderExercise(getExercise(), nextExercise, previousExercise)}
+ renderExercise(getExercise(), nextExercise, previousExercise, setCurrentQuestionIndex)}
{exerciseIndex > -1 &&
exerciseIndex < exam.exercises.length &&
showSolutions &&
- renderSolution(exam.exercises[exerciseIndex], nextExercise, previousExercise)}
+ renderSolution(exam.exercises[exerciseIndex], nextExercise, previousExercise, setCurrentQuestionIndex)}
>
);
diff --git a/src/exams/Listening.tsx b/src/exams/Listening.tsx
index e0b428ba..5534d09a 100644
--- a/src/exams/Listening.tsx
+++ b/src/exams/Listening.tsx
@@ -17,6 +17,8 @@ interface Props {
}
export default function Listening({exam, showSolutions = false, onFinish}: Props) {
+ const [questionIndex, setQuestionIndex] = useState(0);
+ const [currentQuestionIndex, setCurrentQuestionIndex] = useState(0);
const [exerciseIndex, setExerciseIndex] = useState(showSolutions ? 0 : -1);
const [partIndex, setPartIndex] = useState(0);
const [timesListened, setTimesListened] = useState(0);
@@ -33,6 +35,10 @@ export default function Listening({exam, showSolutions = false, onFinish}: Props
}
}, [hasExamEnded, exerciseIndex]);
+ useEffect(() => {
+ setCurrentQuestionIndex(0);
+ }, [questionIndex]);
+
const confirmFinishModule = (keepGoing?: boolean) => {
if (!keepGoing) {
setShowBlankModal(false);
@@ -46,6 +52,7 @@ export default function Listening({exam, showSolutions = false, onFinish}: Props
if (solution) {
setUserSolutions((prev) => [...prev.filter((x) => x.exercise !== solution.exercise), solution]);
}
+ setQuestionIndex((prev) => prev + currentQuestionIndex);
if (exerciseIndex + 1 < exam.parts[partIndex].exercises.length && !hasExamEnded) {
setExerciseIndex((prev) => prev + 1);
@@ -130,7 +137,10 @@ export default function Listening({exam, showSolutions = false, onFinish}: Props
.flatMap((x) => x.exercises)
.findIndex(
(x) => x.id === exam.parts[partIndex].exercises[exerciseIndex === -1 ? exerciseIndex + 1 : exerciseIndex]?.id,
- ) || 0) + (exerciseIndex === -1 ? 0 : 1)
+ ) || 0) +
+ (exerciseIndex === -1 ? 0 : 1) +
+ questionIndex +
+ currentQuestionIndex
}
minTimer={exam.minTimer}
module="listening"
@@ -141,11 +151,11 @@ export default function Listening({exam, showSolutions = false, onFinish}: Props
{exerciseIndex > -1 &&
exerciseIndex < exam.parts[partIndex].exercises.length &&
!showSolutions &&
- renderExercise(getExercise(), nextExercise, previousExercise)}
+ renderExercise(getExercise(), nextExercise, previousExercise, setCurrentQuestionIndex)}
{exerciseIndex > -1 &&
exerciseIndex < exam.parts[partIndex].exercises.length &&
showSolutions &&
- renderSolution(exam.parts[partIndex].exercises[exerciseIndex], nextExercise, previousExercise)}
+ renderSolution(exam.parts[partIndex].exercises[exerciseIndex], nextExercise, previousExercise, setCurrentQuestionIndex)}
{exerciseIndex === -1 && partIndex > 0 && (
diff --git a/src/exams/Reading.tsx b/src/exams/Reading.tsx
index 5c5e8919..7d0edff9 100644
--- a/src/exams/Reading.tsx
+++ b/src/exams/Reading.tsx
@@ -81,6 +81,8 @@ function TextModal({isOpen, title, content, onClose}: {isOpen: boolean; title: s
}
export default function Reading({exam, showSolutions = false, onFinish}: Props) {
+ const [questionIndex, setQuestionIndex] = useState(0);
+ const [currentQuestionIndex, setCurrentQuestionIndex] = useState(0);
const [exerciseIndex, setExerciseIndex] = useState(showSolutions ? 0 : -1);
const [partIndex, setPartIndex] = useState(0);
const [showTextModal, setShowTextModal] = useState(false);
@@ -105,6 +107,10 @@ export default function Reading({exam, showSolutions = false, onFinish}: Props)
};
}, []);
+ useEffect(() => {
+ setCurrentQuestionIndex(0);
+ }, [questionIndex]);
+
useEffect(() => {
if (hasExamEnded && exerciseIndex === -1) {
setExerciseIndex((prev) => prev + 1);
@@ -124,6 +130,7 @@ export default function Reading({exam, showSolutions = false, onFinish}: Props)
if (solution) {
setUserSolutions((prev) => [...prev.filter((x) => x.exercise !== solution.exercise), solution]);
}
+ setQuestionIndex((prev) => prev + currentQuestionIndex);
if (exerciseIndex + 1 < exam.parts[partIndex].exercises.length && !hasExamEnded) {
setExerciseIndex((prev) => prev + 1);
@@ -207,7 +214,10 @@ export default function Reading({exam, showSolutions = false, onFinish}: Props)
.flatMap((x) => x.exercises)
.findIndex(
(x) => x.id === exam.parts[partIndex].exercises[exerciseIndex === -1 ? exerciseIndex + 1 : exerciseIndex]?.id,
- ) || 0) + (exerciseIndex === -1 ? 0 : 1)
+ ) || 0) +
+ (exerciseIndex === -1 ? 0 : 1) +
+ questionIndex +
+ currentQuestionIndex
}
module="reading"
totalExercises={countExercises(exam.parts.flatMap((x) => x.exercises))}
@@ -219,11 +229,11 @@ export default function Reading({exam, showSolutions = false, onFinish}: Props)
{exerciseIndex > -1 &&
exerciseIndex < exam.parts[partIndex].exercises.length &&
!showSolutions &&
- renderExercise(getExercise(), nextExercise, previousExercise)}
+ renderExercise(getExercise(), nextExercise, previousExercise, setCurrentQuestionIndex)}
{exerciseIndex > -1 &&
exerciseIndex < exam.parts[partIndex].exercises.length &&
showSolutions &&
- renderSolution(exam.parts[partIndex].exercises[exerciseIndex], nextExercise, previousExercise)}
+ renderSolution(exam.parts[partIndex].exercises[exerciseIndex], nextExercise, previousExercise, setCurrentQuestionIndex)}
{exerciseIndex > -1 && exerciseIndex < exam.parts[partIndex].exercises.length && (