From 169ae2c959e0dc73d88bb4dbcdfeb07dcac641cc Mon Sep 17 00:00:00 2001 From: Tiago Ribeiro Date: Thu, 28 Sep 2023 14:43:43 +0100 Subject: [PATCH] Updated the reading to a new format --- src/components/Solutions/FillBlanks.tsx | 4 +- src/exams/Finish.tsx | 13 +++++- src/exams/Reading.tsx | 61 +++++++++++++++++++------ src/interfaces/exam.ts | 12 +++-- src/pages/(admin)/Lists/ExamList.tsx | 11 ++++- src/pages/api/exam/[module]/index.ts | 2 +- src/pages/exam.tsx | 12 +++-- src/pages/exercises.tsx | 10 +++- src/utils/evaluation.ts | 6 +-- 9 files changed, 100 insertions(+), 31 deletions(-) diff --git a/src/components/Solutions/FillBlanks.tsx b/src/components/Solutions/FillBlanks.tsx index 77c7aa40..4c84f387 100644 --- a/src/components/Solutions/FillBlanks.tsx +++ b/src/components/Solutions/FillBlanks.tsx @@ -19,11 +19,13 @@ export default function FillBlanksSolutions({id, type, prompt, solutions, text, const renderLines = (line: string) => { return ( - {reactStringReplace(line, /({{\d}})/g, (match) => { + {reactStringReplace(line, /({{\d+}})/g, (match) => { const id = match.replaceAll(/[\{\}]/g, ""); const userSolution = userSolutions.find((x) => x.id === id); const solution = solutions.find((x) => x.id === id)!; + console.log(id, match); + if (!userSolution) { return ( + + + + )} + {exerciseIndex === -1 && partIndex === 0 && ( diff --git a/src/interfaces/exam.ts b/src/interfaces/exam.ts index 5a277d43..df626ed5 100644 --- a/src/interfaces/exam.ts +++ b/src/interfaces/exam.ts @@ -3,12 +3,14 @@ import {Module} from "."; export type Exam = ReadingExam | ListeningExam | WritingExam | SpeakingExam; export interface ReadingExam { - text: { - title: string; - content: string; - }; + parts: { + text: { + title: string; + content: string; + }; + exercises: Exercise[]; + }[]; id: string; - exercises: Exercise[]; module: "reading"; minTimer: number; type: "academic" | "general"; diff --git a/src/pages/(admin)/Lists/ExamList.tsx b/src/pages/(admin)/Lists/ExamList.tsx index eb50a165..c850d01d 100644 --- a/src/pages/(admin)/Lists/ExamList.tsx +++ b/src/pages/(admin)/Lists/ExamList.tsx @@ -45,6 +45,15 @@ export default function ExamList() { router.push("/exercises"); }; + const getTotalExercises = (module: Module) => { + const exam = exams.find((x) => x.module === module)!; + if (exam.module === "reading") { + return exam.parts.flatMap((x) => x.exercises).length; + } + + return exam.exercises.length; + }; + const defaultColumns = [ columnHelper.accessor("id", { header: "ID", @@ -54,7 +63,7 @@ export default function ExamList() { header: "Module", cell: (info) => {capitalize(info.getValue())}, }), - columnHelper.accessor((x) => x.exercises.length, { + columnHelper.accessor((x) => getTotalExercises(x.module), { header: "Exercises", cell: (info) => info.getValue(), }), diff --git a/src/pages/api/exam/[module]/index.ts b/src/pages/api/exam/[module]/index.ts index 820cab53..162f6700 100644 --- a/src/pages/api/exam/[module]/index.ts +++ b/src/pages/api/exam/[module]/index.ts @@ -21,7 +21,7 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { const {module, avoidRepeated} = req.query as {module: string; avoidRepeated: string}; const moduleRef = collection(db, module); - const q = query(moduleRef, where("isDiagnostic", "==", false)); + const q = query(moduleRef, where("isDiagnostic", "==", true)); const snapshot = await getDocs(q); const exams: Exam[] = shuffle( diff --git a/src/pages/exam.tsx b/src/pages/exam.tsx index 0effc768..ac413475 100644 --- a/src/pages/exam.tsx +++ b/src/pages/exam.tsx @@ -137,10 +137,16 @@ export default function Page() { }; const updateExamWithUserSolutions = (exam: Exam): Exam => { - const exercises = exam.exercises.map((x) => - Object.assign(x, !x.userSolutions ? {userSolutions: userSolutions.find((y) => x.id === y.exercise)?.solutions} : x.userSolutions), - ); + if (exam.module === "reading") { + const parts = exam.parts.map((p) => + Object.assign(p, { + exercises: p.exercises.map((x) => Object.assign(x, {userSolutions: userSolutions.find((y) => x.id === y.exercise)?.solutions})), + }), + ); + return Object.assign(exam, {parts}); + } + const exercises = exam.exercises.map((x) => Object.assign(x, {userSolutions: userSolutions.find((y) => x.id === y.exercise)?.solutions})); return Object.assign(exam, {exercises}); }; diff --git a/src/pages/exercises.tsx b/src/pages/exercises.tsx index 85a0102c..0377178d 100644 --- a/src/pages/exercises.tsx +++ b/src/pages/exercises.tsx @@ -141,8 +141,16 @@ export default function Page() { }; const updateExamWithUserSolutions = (exam: Exam): Exam => { - const exercises = exam.exercises.map((x) => Object.assign(x, {userSolutions: userSolutions.find((y) => x.id === y.exercise)?.solutions})); + if (exam.module === "reading") { + const parts = exam.parts.map((p) => + Object.assign(p, { + exercises: p.exercises.map((x) => Object.assign(x, {userSolutions: userSolutions.find((y) => x.id === y.exercise)?.solutions})), + }), + ); + return Object.assign(exam, {parts}); + } + const exercises = exam.exercises.map((x) => Object.assign(x, {userSolutions: userSolutions.find((y) => x.id === y.exercise)?.solutions})); return Object.assign(exam, {exercises}); }; diff --git a/src/utils/evaluation.ts b/src/utils/evaluation.ts index 06421b08..5a1c1507 100644 --- a/src/utils/evaluation.ts +++ b/src/utils/evaluation.ts @@ -1,9 +1,9 @@ -import {Evaluation, Exam, InteractiveSpeakingExercise, SpeakingExercise, UserSolution, WritingExercise} from "@/interfaces/exam"; +import {Evaluation, Exam, 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)!; + const writingExam = exams.find((x) => x.id === examId)! as WritingExam; const exercise = writingExam.exercises.find((x) => x.id === exerciseId)! as WritingExercise; const response = await axios.post("/api/evaluate/writing", { @@ -27,7 +27,7 @@ export const evaluateWritingAnswer = async (exams: Exam[], examId: string, exerc }; export const evaluateSpeakingAnswer = async (exams: Exam[], examId: string, exerciseId: string, solution: UserSolution) => { - const speakingExam = exams.find((x) => x.id === examId)!; + const speakingExam = exams.find((x) => x.id === examId)! as SpeakingExam; const exercise = speakingExam.exercises.find((x) => x.id === exerciseId); switch (exercise?.type) {