export interface ReadingExam { text: { title: string; content: string; }; exercises: Exercise[]; } export interface ListeningExam { audio: { title: string; source: string; transcript: string; repeatableTimes: number; // *The amount of times the user is allowed to repeat the audio, 0 for unlimited }; exercises: Exercise[]; } export type Exercise = FillBlanksExercise | MatchSentencesExercise | MultipleChoiceExercise; export interface FillBlanksExercise { prompt: string; // *EXAMPLE: "Complete the summary below. Click a blank to select the corresponding word for it." type: "fillBlanks"; words: string[]; // *EXAMPLE: ["preserve", "unaware"] text: string; // *EXAMPLE: "They tried to {{1}} burning" allowRepetition: boolean; solutions: { id: string; // *EXAMPLE: "1" solution: string; // *EXAMPLE: "preserve" }[]; } export interface MatchSentencesExercise { type: "matchSentences"; prompt: string; sentences: { id: string; sentence: string; solution: string; color: string; }[]; allowRepetition: boolean; options: { id: string; sentence: string; }[]; } export interface MultipleChoiceExercise { type: "multipleChoice"; prompt: string; // *EXAMPLE: "Select the appropriate option." questions: MultipleChoiceQuestion[]; } 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") }[]; }