diff --git a/src/components/High/Layout.tsx b/src/components/High/Layout.tsx index 865deadd..81a6040e 100644 --- a/src/components/High/Layout.tsx +++ b/src/components/High/Layout.tsx @@ -37,7 +37,7 @@ export default function Layout({user, children, className, navDisabled = false, />
{children} diff --git a/src/pages/(exam)/ExamPage.tsx b/src/pages/(exam)/ExamPage.tsx index a4ae1c3f..83607752 100644 --- a/src/pages/(exam)/ExamPage.tsx +++ b/src/pages/(exam)/ExamPage.tsx @@ -5,7 +5,7 @@ import {Module} from "@/interfaces"; import Selection from "@/exams/Selection"; import Reading from "@/exams/Reading"; -import {Exam, UserSolution} from "@/interfaces/exam"; +import {Exam, InteractiveSpeakingExercise, SpeakingExercise, UserSolution, WritingExercise} from "@/interfaces/exam"; import Listening from "@/exams/Listening"; import Writing from "@/exams/Writing"; import {ToastContainer, toast} from "react-toastify"; @@ -134,16 +134,19 @@ export default function ExamPage({page}: Props) { Promise.all( exam.exercises.map(async (exercise) => { - return (exam.module === "writing" ? evaluateWritingAnswer : evaluateSpeakingAnswer)( - exams, - exam.id, - exercise.id, - solutions.find((x) => x.exercise === exercise.id)!, - ).then((response) => { - if (response) { - setUserSolutions([...userSolutions.filter((x) => x.exercise !== exercise.id), response]); - } - }); + if (exercise.type === "writing") + return evaluateWritingAnswer(exercise, solutions.find((x) => x.exercise === exercise.id)!).then((response) => { + if (response) { + setUserSolutions([...userSolutions.filter((x) => x.exercise !== exercise.id), response]); + } + }); + + if (exercise.type === "interactiveSpeaking" || exercise.type === "speaking") + return evaluateSpeakingAnswer(exercise, solutions.find((x) => x.exercise === exercise.id)!).then((response) => { + if (response) { + setUserSolutions([...userSolutions.filter((x) => x.exercise !== exercise.id), response]); + } + }); }), ).finally(() => { setIsEvaluationLoading(false); diff --git a/src/utils/evaluation.ts b/src/utils/evaluation.ts index b64b96ec..dd254cba 100644 --- a/src/utils/evaluation.ts +++ b/src/utils/evaluation.ts @@ -1,11 +1,17 @@ -import {Evaluation, Exam, SpeakingExam, SpeakingExercise, UserSolution, WritingExam, WritingExercise} from "@/interfaces/exam"; +import { + Evaluation, + Exam, + InteractiveSpeakingExercise, + SpeakingExam, + SpeakingExercise, + UserSolution, + WritingExam, + WritingExercise, +} from "@/interfaces/exam"; import axios from "axios"; import {speakingReverseMarking, writingReverseMarking} from "./score"; -export const evaluateWritingAnswer = async (exams: Exam[], examId: string, exerciseId: string, solution: UserSolution) => { - const writingExam = exams.find((x) => x.id === examId)! as WritingExam; - const exercise = writingExam.exercises.find((x) => x.id === exerciseId)! as WritingExercise; - +export const evaluateWritingAnswer = async (exercise: WritingExercise, solution: UserSolution) => { const response = await axios.post("/api/evaluate/writing", { question: `${exercise.prompt} ${exercise.attachment ? exercise.attachment.description : ""}`.replaceAll("\n", ""), answer: solution.solutions[0].solution.trim().replaceAll("\n", " "), @@ -19,22 +25,19 @@ export const evaluateWritingAnswer = async (exams: Exam[], examId: string, exerc missing: 0, total: 100, }, - solutions: [{id: exerciseId, solution: solution.solutions[0].solution, evaluation: response.data}], + solutions: [{id: exercise.id, solution: solution.solutions[0].solution, evaluation: response.data}], }; } return undefined; }; -export const evaluateSpeakingAnswer = async (exams: Exam[], examId: string, exerciseId: string, solution: UserSolution) => { - const speakingExam = exams.find((x) => x.id === examId)! as SpeakingExam; - const exercise = speakingExam.exercises.find((x) => x.id === exerciseId); - +export const evaluateSpeakingAnswer = async (exercise: SpeakingExercise | InteractiveSpeakingExercise, solution: UserSolution) => { switch (exercise?.type) { case "speaking": - return await evaluateSpeakingExercise(exercise, exerciseId, solution); + return await evaluateSpeakingExercise(exercise, exercise.id, solution); case "interactiveSpeaking": - return await evaluateInteractiveSpeakingExercise(exerciseId, solution); + return await evaluateInteractiveSpeakingExercise(exercise.id, solution); default: return undefined; }