Files
encoach_frontend/src/interfaces/exam.ts
2023-04-17 17:35:26 +01:00

151 lines
3.6 KiB
TypeScript

import {Module} from ".";
export type Exam = ReadingExam | ListeningExam | WritingExam | SpeakingExam;
export interface ReadingExam {
text: {
title: string;
content: string;
};
id: string;
exercises: Exercise[];
module: "reading";
minTimer: number;
}
export interface ListeningExam {
audio: {
source: string;
repeatableTimes: number; // *The amount of times the user is allowed to repeat the audio, 0 for unlimited
};
id: string;
exercises: Exercise[];
module: "listening";
minTimer: number;
}
export interface UserSolution {
solutions: any[];
module?: Module;
exam?: string;
score: {
correct: number;
total: number;
};
id: string;
}
export interface WritingExam {
module: "writing";
id: string;
exercises: Exercise[];
minTimer: number;
}
interface WordCounter {
type: "min" | "max";
limit: number;
}
export interface SpeakingExam {
id: string;
module: "speaking";
exercises: Exercise[];
minTimer: number;
}
export type Exercise =
| FillBlanksExercise
| MatchSentencesExercise
| MultipleChoiceExercise
| WriteBlanksExercise
| WritingExercise
| SpeakingExercise;
export interface WritingExercise {
id: string;
type: "writing";
info: string; //* The information about the task, like the amount of time they should spend on it
prompt: string; //* The context given to the user containing what they should write about
wordCounter: WordCounter; //* The minimum or maximum amount of words that should be written
}
export interface SpeakingExercise {
id: string;
type: "speaking";
title: string;
text: string;
prompts: string[];
}
export interface FillBlanksExercise {
prompt: string; // *EXAMPLE: "Complete the summary below. Click a blank to select the corresponding word for it."
type: "fillBlanks";
id: string;
words: string[]; // *EXAMPLE: ["preserve", "unaware"]
text: string; // *EXAMPLE: "They tried to {{1}} burning"
allowRepetition: boolean;
solutions: {
id: string; // *EXAMPLE: "1"
solution: string; // *EXAMPLE: "preserve"
}[];
userSolutions: {
id: string; // *EXAMPLE: "1"
solution: string; // *EXAMPLE: "preserve"
}[];
}
export interface WriteBlanksExercise {
prompt: string; // *EXAMPLE: "Complete the notes below by writing NO MORE THAN THREE WORDS in the spaces provided."
maxWords: number; // *EXAMPLE: 3 - The maximum amount of words allowed per blank, 0 for unlimited
type: "writeBlanks";
id: string;
text: string; // *EXAMPLE: "The Government plans to give ${{14}}"
solutions: {
id: string; // *EXAMPLE: "14"
solution: string[]; // *EXAMPLE: ["Prescott"] - All possible solutions (case sensitive)
}[];
userSolutions: {
id: string;
solution: string;
}[];
}
export interface MatchSentencesExercise {
type: "matchSentences";
id: string;
prompt: string;
userSolutions: {question: string; option: string}[];
sentences: {
id: string;
sentence: string;
solution: string;
color: string;
}[];
allowRepetition: boolean;
options: {
id: string;
sentence: string;
}[];
}
export interface MultipleChoiceExercise {
type: "multipleChoice";
id: string;
prompt: string; // *EXAMPLE: "Select the appropriate option."
questions: MultipleChoiceQuestion[];
userSolutions: {question: string; option: string}[];
}
export interface MultipleChoiceQuestion {
variant: "image" | "text";
id: string; // *EXAMPLE: "1"
prompt: string; // *EXAMPLE: "What does her briefcase look like?"
solution: string; // *EXAMPLE: "A"
options: {
id: string; // *EXAMPLE: "A"
src?: string; // *EXAMPLE: "https://i.imgur.com/rEbrSqA.png" (only used if the variant is "image")
text?: string; // *EXAMPLE: "wallet, pens and novel" (only used if the variant is "text")
}[];
}