62 lines
1.5 KiB
TypeScript
62 lines
1.5 KiB
TypeScript
import { PartExam, SpeakingExam } from "@/interfaces/exam";
|
|
import { countCurrentExercises } from "@/utils/moduleUtils";
|
|
|
|
const calculateExerciseIndex = (
|
|
exam: PartExam,
|
|
partIndex: number,
|
|
exerciseIndex: number,
|
|
questionIndex: number
|
|
) => {
|
|
let total = 0;
|
|
// Count all exercises in previous parts
|
|
for (let i = 0; i < partIndex; i++) {
|
|
total += countCurrentExercises(
|
|
exam.parts[i].exercises,
|
|
exam.parts[i].exercises.length - 1
|
|
);
|
|
}
|
|
// Count previous exercises in current part
|
|
if (partIndex < exam.parts.length && exerciseIndex > 0) {
|
|
total += countCurrentExercises(
|
|
exam.parts[partIndex].exercises.slice(0, exerciseIndex),
|
|
exerciseIndex - 1
|
|
);
|
|
}
|
|
|
|
// Only pass questionIndex if current exercise is multiple choice
|
|
const currentExercise = exam.parts[partIndex].exercises[exerciseIndex];
|
|
if (currentExercise.type === "multipleChoice") {
|
|
total += countCurrentExercises(
|
|
[currentExercise],
|
|
0,
|
|
questionIndex
|
|
);
|
|
return total;
|
|
}
|
|
|
|
// Add 1 for non-MC exercises
|
|
total += 1;
|
|
return total;
|
|
};
|
|
|
|
const calculateExerciseIndexSpeaking = (
|
|
exam: SpeakingExam,
|
|
exerciseIndex: number,
|
|
questionIndex: number
|
|
) => {
|
|
let total = 0;
|
|
|
|
for (let i = 0; i < exerciseIndex; i++) {
|
|
total += exam.exercises[i].type === "speaking" ? 1 : exam.exercises[i].prompts.length;
|
|
}
|
|
|
|
total += exam.exercises[exerciseIndex].type === "speaking" ? 1 : questionIndex + 1;
|
|
|
|
return total;
|
|
};
|
|
|
|
export {
|
|
calculateExerciseIndex,
|
|
calculateExerciseIndexSpeaking
|
|
};
|