diff --git a/src/components/Exercises/MatchSentences.tsx b/src/components/Exercises/MatchSentences.tsx
index 731b3722..389da576 100644
--- a/src/components/Exercises/MatchSentences.tsx
+++ b/src/components/Exercises/MatchSentences.tsx
@@ -31,7 +31,6 @@ export default function MatchSentences({id, options, type, prompt, sentences, us
};
useEffect(() => {
- console.log({hasExamEnded});
if (hasExamEnded) onNext({exercise: id, solutions: answers, score: calculateScore(), type});
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [hasExamEnded]);
diff --git a/src/components/Medium/ModuleTitle.tsx b/src/components/Medium/ModuleTitle.tsx
index 4d64f6a4..ff18d589 100644
--- a/src/components/Medium/ModuleTitle.tsx
+++ b/src/components/Medium/ModuleTitle.tsx
@@ -1,9 +1,12 @@
import {Module} from "@/interfaces";
import useExamStore from "@/stores/examStore";
import {moduleLabels} from "@/utils/moduleUtils";
+import clsx from "clsx";
+import {motion} from "framer-motion";
import {ReactNode, useEffect, useState} from "react";
import {BsBook, BsHeadphones, BsMegaphone, BsPen, BsStopwatch} from "react-icons/bs";
import ProgressBar from "../Low/ProgressBar";
+import TimerEndedModal from "../TimerEndedModal";
interface Props {
minTimer: number;
@@ -16,6 +19,8 @@ interface Props {
export default function ModuleTitle({minTimer, module, label, exerciseIndex, totalExercises, disableTimer = false}: Props) {
const [timer, setTimer] = useState(minTimer * 60);
+ const [showModal, setShowModal] = useState(false);
+ const [warningMode, setWarningMode] = useState(false);
const setHasExamEnded = useExamStore((state) => state.setHasExamEnded);
useEffect(() => {
@@ -29,8 +34,12 @@ export default function ModuleTitle({minTimer, module, label, exerciseIndex, tot
}, [disableTimer, minTimer]);
useEffect(() => {
- if (timer <= 0) setHasExamEnded(true);
- }, [setHasExamEnded, timer]);
+ if (timer <= 0) setShowModal(true);
+ }, [timer]);
+
+ useEffect(() => {
+ if (timer < 300 && !warningMode) setWarningMode(true);
+ }, [timer, warningMode]);
const moduleIcon: {[key in Module]: ReactNode} = {
reading: ,
@@ -41,7 +50,21 @@ export default function ModuleTitle({minTimer, module, label, exerciseIndex, tot
return (
<>
-
+ {
+ setHasExamEnded(true);
+ setShowModal(false);
+ }}
+ />
+
{timer > 0 && (
@@ -57,7 +80,7 @@ export default function ModuleTitle({minTimer, module, label, exerciseIndex, tot
)}
{timer <= 0 && <>00:00>}
-
+
{moduleIcon[module]}
diff --git a/src/components/TimerEndedModal.tsx b/src/components/TimerEndedModal.tsx
new file mode 100644
index 00000000..98dc5f31
--- /dev/null
+++ b/src/components/TimerEndedModal.tsx
@@ -0,0 +1,49 @@
+import {Dialog, Transition} from "@headlessui/react";
+import {Fragment} from "react";
+import Button from "./Low/Button";
+
+interface Props {
+ isOpen: boolean;
+ onClose: () => void;
+}
+
+export default function TimerEndedModal({isOpen, onClose}: Props) {
+ return (
+
+
+
+ );
+}
diff --git a/src/exams/Finish.tsx b/src/exams/Finish.tsx
index 14d30595..37514577 100644
--- a/src/exams/Finish.tsx
+++ b/src/exams/Finish.tsx
@@ -53,10 +53,6 @@ export default function Finish({user, scores, modules, isLoading, onViewResults}
},
};
- useEffect(() => {
- console.log({selectedScore, selectedModule, scores});
- }, [scores, selectedModule, selectedScore]);
-
return (
<>
diff --git a/src/exams/Listening.tsx b/src/exams/Listening.tsx
index fdb257ad..b4771181 100644
--- a/src/exams/Listening.tsx
+++ b/src/exams/Listening.tsx
@@ -27,6 +27,12 @@ export default function Listening({exam, showSolutions = false, onFinish}: Props
const [hasExamEnded, setHasExamEnded] = useExamStore((state) => [state.hasExamEnded, state.setHasExamEnded]);
+ useEffect(() => {
+ if (hasExamEnded && exerciseIndex === -1) {
+ setExerciseIndex((prev) => prev + 1);
+ }
+ }, [hasExamEnded, exerciseIndex]);
+
const confirmFinishModule = (keepGoing?: boolean) => {
if (!keepGoing) {
setShowBlankModal(false);
diff --git a/src/exams/Reading.tsx b/src/exams/Reading.tsx
index 2e15ead7..bf9d80db 100644
--- a/src/exams/Reading.tsx
+++ b/src/exams/Reading.tsx
@@ -87,6 +87,12 @@ export default function Reading({exam, showSolutions = false, onFinish}: Props)
const [hasExamEnded, setHasExamEnded] = useExamStore((state) => [state.hasExamEnded, state.setHasExamEnded]);
+ useEffect(() => {
+ if (hasExamEnded && exerciseIndex === -1) {
+ setExerciseIndex((prev) => prev + 1);
+ }
+ }, [hasExamEnded, exerciseIndex]);
+
const confirmFinishModule = (keepGoing?: boolean) => {
if (!keepGoing) {
setShowBlankModal(false);
diff --git a/src/pages/exercises.tsx b/src/pages/exercises.tsx
index 01ab22a6..fcfc7e8a 100644
--- a/src/pages/exercises.tsx
+++ b/src/pages/exercises.tsx
@@ -203,8 +203,6 @@ export default function Page() {
const solutionIds = solutions.map((x) => x.exercise);
const solutionExams = solutions.map((x) => x.exam);
- console.log(solutionExams, exam?.id, moduleIndex, selectedModules);
-
if (exam && !solutionExams.includes(exam.id)) return;
if (exam && (exam.module === "writing" || exam.module === "speaking") && solutions.length > 0 && !showSolutions) {