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; module: Module; label?: string; exerciseIndex: number; totalExercises: number; disableTimer?: boolean; } 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(() => { if (!disableTimer) { const timerInterval = setInterval(() => setTimer((prev) => prev - 1), 1000); return () => { clearInterval(timerInterval); }; } }, [disableTimer, minTimer]); useEffect(() => { if (timer <= 0) setShowModal(true); }, [timer]); useEffect(() => { if (timer < 300 && !warningMode) setWarningMode(true); }, [timer, warningMode]); const moduleIcon: {[key in Module]: ReactNode} = { reading: , listening: , writing: , speaking: , }; return ( <> { setHasExamEnded(true); setShowModal(false); }} /> {timer > 0 && ( <> {Math.floor(timer / 60) .toString(10) .padStart(2, "0")} : {Math.floor(timer % 60) .toString(10) .padStart(2, "0")} > )} {timer <= 0 && <>00:00>} {moduleIcon[module]} {moduleLabels[module]} exam {label && `- ${label}`} Question {exerciseIndex}/{totalExercises} > ); }