generated from hamadsuniverse/codecatalyst-sst-app
-
Notifications
You must be signed in to change notification settings - Fork 13
/
Copy pathQuestionsComponent.tsx
144 lines (139 loc) · 4.06 KB
/
QuestionsComponent.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
import { ReadingQuestion } from '../../utilities/readingUtilities';
import { ListeningQuestion } from '../../utilities/ListeningUtilities';
import { ListSelectionQuestionComponent } from './ListSelectionQuestionComponent';
import { McqQuestionsComponent } from './McqQuestionsComponent';
import { TableCompletionQuestionComponent } from './TableCompletionQuestionComponent';
import { SummaryCompletionQuestionComponent } from './SummaryCompletionQuestionComponent';
import { MultipleAnswersQuestionComponent } from './MultipleAnswersQuestionComponent';
import { DiagramCompletionQuestionComponent } from './DiagramCompletionQuestionComponent';
export type Answer = string[] | string[][];
export type SetAnswer = (answer: Answer) => void;
export const QuestionsComponent = ({
questions,
answers,
setAnswers,
}: {
questions: ReadingQuestion[];
answers: Answer[];
setAnswers: (arg: Answer[]) => void;
}) => {
const indexSetAnswer = function (i: number): SetAnswer {
return (value: Answer) => {
// console.log('Triggered with', { i, value });
const arrCopy = [...answers];
arrCopy[i] = value;
setAnswers(arrCopy);
};
};
return (
<>
{questions.map((question, index) => (
<div key={index} className="mb-10">
<p className='mb-3'>
Question {index + 1}, {question.QuestionType}:
</p>
{renderQuestionComponent(
question,
answers[index],
indexSetAnswer(index),
)}
</div>
))}
</>
);
};
/** Returns the correct element for the given question type
*
* This requires `answer` and `setAnswer` to give children access to parent's
* state
*/
const renderQuestionComponent = (
question: ReadingQuestion | ListeningQuestion,
answer: Answer,
setAnswer: SetAnswer,
) => {
switch (question.QuestionType) {
case 'Table Completion':
return (
<TableCompletionQuestionComponent
question={question}
answer={answer}
set={setAnswer}
/>
);
case 'List Selection':
return (
<ListSelectionQuestionComponent
question={question}
answer={answer}
set={setAnswer}
/>
);
case 'Multiple Choice':
case 'Yes No Not Given':
case 'True False Not Given':
case 'Matching Paragraph Information':
case 'Matching Headings':
return (
<McqQuestionsComponent
question={question}
answer={answer}
set={setAnswer}
/>
);
case 'Summary Completion':
case 'Short Answers':
return (
<SummaryCompletionQuestionComponent
question={question}
answer={answer}
set={setAnswer}
/>
);
case 'Multiple Answers':
return (
<MultipleAnswersQuestionComponent
question={question}
answer={answer}
set={setAnswer}
/>
);
case 'Diagram Completion':
return (
<DiagramCompletionQuestionComponent
question={question}
answer={answer}
set={setAnswer}
/>
);
default:
return <p>Unsupported question type</p>;
}
};
/** Returns the correct initial answer array for each question */
export function initialAnswer(questions: ReadingQuestion[]): Answer[] {
return questions.map(q => {
switch (q.QuestionType) {
case 'Table Completion':
case 'Summary Completion':
case 'Short Answers':
case 'Diagram Completion':
return q.SubQuestions.map(subQuestion =>
(subQuestion.QuestionText.match(/-answer-/g) || []).map(() => ''),
);
case 'Multiple Answers':
return q.SubQuestions.map(subQuestion =>
Array(subQuestion.CorrectAnswers.length).fill(''),
);
case 'List Selection':
case 'Multiple Choice':
case 'Yes No Not Given':
case 'True False Not Given':
case 'Matching Paragraph Information':
case 'Matching Headings':
return Array(q.SubQuestions.length).fill('');
default:
throw Error('Invalid question');
}
});
}