@nualang/nualang-ui-components 0.1.1133 → 0.1.1135

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -16,13 +16,9 @@ var _colors = require("@mui/material/colors");
16
16
  var _Checkbox = _interopRequireDefault(require("@mui/material/Checkbox"));
17
17
  var _reactBeautifulDnd = require("react-beautiful-dnd");
18
18
  var _DragHandle = _interopRequireDefault(require("@mui/icons-material/DragHandle"));
19
- var _material = require("@mui/material");
20
- var _iconsMaterial = require("@mui/icons-material");
21
19
  var _ResponsiveDialog = _interopRequireDefault(require("../ResponsiveDialog"));
22
20
  var _InputHelper = _interopRequireDefault(require("../../Forms/InputHelper"));
23
21
  var _debounce = _interopRequireDefault(require("lodash/debounce"));
24
- var _nualas = _interopRequireDefault(require("../../img/nualas.svg"));
25
- var _reactRouterDom = require("react-router-dom");
26
22
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
27
23
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
28
24
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
@@ -59,13 +55,12 @@ function CreateQuestion({
59
55
  script,
60
56
  makeChatGptApiRequest,
61
57
  values,
58
+ disableRestoreFocus,
62
59
  ...otherProps
63
60
  }) {
64
61
  const [question, setQuestion] = (0, _react.useState)(otherProps.question);
65
62
  const [answer, setAnswer] = (0, _react.useState)(initialAnswerState);
66
63
  const [answerList, setAnswerList] = (0, _react.useState)(otherProps.answers);
67
- const [isMessageGenerating, setIsMessageGenerating] = (0, _react.useState)(false);
68
- const [errorMessage, setErrorMessage] = (0, _react.useState)(null);
69
64
  const handleAnswerInputChange = event => {
70
65
  const target = event.target;
71
66
  const value = target.type === "checkbox" ? target.checked : target.value;
@@ -140,82 +135,6 @@ function CreateQuestion({
140
135
  handleAddAnswerDebounced();
141
136
  }
142
137
  };
143
- const extractJsonObject = response => {
144
- let stack = [];
145
- let startIndex = -1;
146
- let endIndex = -1;
147
- for (let i = 0; i < response.length; i++) {
148
- if (response[i] === "{") {
149
- if (stack.length === 0) {
150
- startIndex = i;
151
- }
152
- stack.push("{");
153
- } else if (response[i] === "}") {
154
- stack.pop();
155
- if (stack.length === 0) {
156
- endIndex = i;
157
- break;
158
- }
159
- }
160
- }
161
- if (startIndex !== -1 && endIndex !== -1) {
162
- return response.substring(startIndex, endIndex + 1);
163
- }
164
- return "";
165
- };
166
- function validateResponse(response) {
167
- if (typeof response !== "object" || response === null) {
168
- return false;
169
- }
170
- if (typeof response.question !== "string") {
171
- return false;
172
- }
173
- if (!Array.isArray(response.answers)) {
174
- return false;
175
- }
176
- if (response.answers.length === 0) {
177
- return false;
178
- }
179
- let hasCorrectAnswer = false;
180
- for (const answer of response.answers) {
181
- if (typeof answer !== "object" || answer === null) {
182
- return false;
183
- }
184
- if (typeof answer.text !== "string" || typeof answer.correct !== "boolean" || typeof answer.type !== "string") {
185
- return false;
186
- }
187
- if (answer.correct) {
188
- hasCorrectAnswer = true;
189
- }
190
- }
191
- return hasCorrectAnswer;
192
- }
193
- const handleGenerateAnswer = async () => {
194
- try {
195
- setIsMessageGenerating(true);
196
- setErrorMessage(null);
197
- const prompt = `Here is a script: ${JSON.stringify(script)}. Actor 1 is ${values.actor1} and Actor 2 is ${values.actor2} Please generate a new comprehension question based on the script that is completely unique to any existing questions, and provide it in JSON format with the keys 'question' and 'answers'. The 'question' key has the value of the string contraining the question text. The 'answers' key is an array of objects, where each answer object contains 'text', 'correct', and 'type' keys. The type should always be 'multichoice'. Ensure the new question is answered by the script, as the purpose of the question to the test the reader's understanding of the script.`;
198
- const chatGptResponse = await makeChatGptApiRequest({
199
- model: "gpt-3.5-turbo",
200
- prompt
201
- });
202
- const jsonResponse = extractJsonObject(chatGptResponse);
203
- const newQuestion = JSON.parse(jsonResponse);
204
- if (!validateResponse(newQuestion)) {
205
- throw new Error("Invalid response from GPT-3.5");
206
- }
207
- onSubmit({
208
- question: newQuestion.question.trim(),
209
- answers: newQuestion.answers
210
- });
211
- setIsMessageGenerating(false);
212
- handleClose();
213
- } catch (error) {
214
- console.error(error);
215
- setIsMessageGenerating(false);
216
- setErrorMessage("There was problem generating the roleplay, please try again.");
217
- }
218
- };
219
138
  const title = update ? t("update_question") : t("add_question");
220
139
  const desc = update ? t("update_question_desc") : t("add_question_desc");
221
140
  return /*#__PURE__*/_react.default.createElement(_ResponsiveDialog.default, {
@@ -223,49 +142,9 @@ function CreateQuestion({
223
142
  handleClose: handleClose,
224
143
  handleSubmit: handleSubmit,
225
144
  submitText: title,
226
- dialogTitle: isMessageGenerating ? t("generating_question") : title,
227
- isSubmitDisabled: isMessageGenerating
228
- }, /*#__PURE__*/_react.default.createElement(_Grid.default, {
229
- item: true,
230
- xs: 12,
231
- textAlign: "center",
232
- sx: {
233
- ...(!isMessageGenerating && {
234
- display: "none"
235
- })
236
- },
237
- mx: 2
238
- }, /*#__PURE__*/_react.default.createElement("img", {
239
- src: _nualas.default,
240
- style: {
241
- maxHeight: 230
242
- },
243
- alt: ""
244
- })), /*#__PURE__*/_react.default.createElement(_Grid.default, {
245
- item: true,
246
- xs: 12,
247
- sx: {
248
- ...(!isMessageGenerating && {
249
- display: "none"
250
- })
251
- },
252
- mt: 2
253
- }, /*#__PURE__*/_react.default.createElement(_material.LinearProgress, null)), !isMessageGenerating && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_Grid.default, {
254
- item: true,
255
- xs: 12,
256
- mb: 2
257
- }, /*#__PURE__*/_react.default.createElement(_material.Alert, {
258
- severity: "info"
259
- }, t("experimental_feature_desc_answer"), " -", " ", /*#__PURE__*/_react.default.createElement(_reactRouterDom.Link, {
260
- to: "/contact"
261
- }, t("contact_form"), "."))), /*#__PURE__*/_react.default.createElement(_material.Box, {
262
- mb: 2
263
- }, /*#__PURE__*/_react.default.createElement(_material.Button, {
264
- onClick: handleGenerateAnswer,
265
- color: "secondary",
266
- variant: "contained",
267
- startIcon: /*#__PURE__*/_react.default.createElement(_iconsMaterial.AutoFixHigh, null)
268
- }, t("generate_question"))), /*#__PURE__*/_react.default.createElement(_DialogContentText.default, null, desc), /*#__PURE__*/_react.default.createElement(_Grid.default, {
145
+ dialogTitle: title,
146
+ disableRestoreFocus: disableRestoreFocus
147
+ }, /*#__PURE__*/_react.default.createElement(_DialogContentText.default, null, desc), /*#__PURE__*/_react.default.createElement(_Grid.default, {
269
148
  container: true,
270
149
  direction: "row",
271
150
  justifyContent: "center",
@@ -305,13 +184,7 @@ function CreateQuestion({
305
184
  characters: forLangCharacters ? forLangCharacters : null,
306
185
  helperText: answer.text && answer.text.trim() !== "" ? t("answer_helper_text") : "",
307
186
  multiline: true
308
- })), errorMessage && /*#__PURE__*/_react.default.createElement(_Grid.default, {
309
- item: true,
310
- xs: 12,
311
- mt: 2
312
- }, /*#__PURE__*/_react.default.createElement(_material.Alert, {
313
- severity: "warning"
314
- }, errorMessage))), /*#__PURE__*/_react.default.createElement(_reactBeautifulDnd.DragDropContext, {
187
+ }))), /*#__PURE__*/_react.default.createElement(_reactBeautifulDnd.DragDropContext, {
315
188
  onDragEnd: handleOnDragEnd
316
189
  }, /*#__PURE__*/_react.default.createElement(_reactBeautifulDnd.Droppable, {
317
190
  droppableId: "answers"
@@ -372,7 +245,7 @@ function CreateQuestion({
372
245
  name: "correct"
373
246
  }),
374
247
  label: t("correct_answer")
375
- })))))), provided.placeholder)))));
248
+ })))))), provided.placeholder))));
376
249
  }
377
250
  CreateQuestion.defaultProps = {
378
251
  t: text => text,
@@ -0,0 +1,198 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _react = _interopRequireWildcard(require("react"));
8
+ var _material = require("@mui/material");
9
+ var _reactRouterDom = require("react-router-dom");
10
+ var _iconsMaterial = require("@mui/icons-material");
11
+ var _ResponsiveDialog = _interopRequireDefault(require("../ResponsiveDialog/ResponsiveDialog"));
12
+ var _nualas = _interopRequireDefault(require("../../img/nualas.svg"));
13
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
14
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
15
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
16
+ // Components
17
+
18
+ function GenerateQuestion({
19
+ t,
20
+ open,
21
+ handleClose,
22
+ script,
23
+ values,
24
+ makeChatGptApiRequest,
25
+ onSubmit,
26
+ learnLang,
27
+ forLang,
28
+ siteLanguage,
29
+ disableRestoreFocus
30
+ }) {
31
+ const finalLearnLang = learnLang.charAt(0).toUpperCase() + learnLang.slice(1);
32
+ const finalForLang = forLang ? forLang.charAt(0).toUpperCase() + forLang.slice(1) : siteLanguage;
33
+ const [isMessageGenerating, setIsMessageGenerating] = (0, _react.useState)(false);
34
+ const [errorMessage, setErrorMessage] = (0, _react.useState)(null);
35
+ const [questionType, setQuestionType] = (0, _react.useState)("factual");
36
+ const [questionLanguage, setQuestionLanguage] = (0, _react.useState)(finalLearnLang);
37
+ const extractJsonObject = response => {
38
+ let stack = [];
39
+ let startIndex = -1;
40
+ let endIndex = -1;
41
+ for (let i = 0; i < response.length; i++) {
42
+ if (response[i] === "{") {
43
+ if (stack.length === 0) {
44
+ startIndex = i;
45
+ }
46
+ stack.push("{");
47
+ } else if (response[i] === "}") {
48
+ stack.pop();
49
+ if (stack.length === 0) {
50
+ endIndex = i;
51
+ break;
52
+ }
53
+ }
54
+ }
55
+ if (startIndex !== -1 && endIndex !== -1) {
56
+ return response.substring(startIndex, endIndex + 1);
57
+ }
58
+ return "";
59
+ };
60
+ function validateResponse(response) {
61
+ if (typeof response !== "object" || response === null) {
62
+ return false;
63
+ }
64
+ if (typeof response.question !== "string") {
65
+ return false;
66
+ }
67
+ if (!Array.isArray(response.answers)) {
68
+ return false;
69
+ }
70
+ if (response.answers.length === 0) {
71
+ return false;
72
+ }
73
+ let hasCorrectAnswer = false;
74
+ for (const answer of response.answers) {
75
+ if (typeof answer !== "object" || answer === null) {
76
+ return false;
77
+ }
78
+ if (typeof answer.text !== "string" || typeof answer.correct !== "boolean" || typeof answer.type !== "string") {
79
+ return false;
80
+ }
81
+ if (answer.correct) {
82
+ hasCorrectAnswer = true;
83
+ }
84
+ }
85
+ return hasCorrectAnswer;
86
+ }
87
+ const handleGenerateAnswer = async () => {
88
+ try {
89
+ setIsMessageGenerating(true);
90
+ setErrorMessage(null);
91
+ const prompt = `Here is a script: ${JSON.stringify(script)}. Refer to Actor 1 as ${values.actor1.name} and Actor 2 as ${values.actor2.name} in the question and the answers. The purpose of this script is to test the reader's ability to read in ${finalLearnLang}. The reader's native language is ${finalForLang}. Please generate a new comprehension question based on the script that is completely unique to any existing questions, preferably referring to a unique part of the script if possible, and provide it in JSON format with the keys 'question' and 'answers'. The 'question' key has the value of the string contraining the question text. The 'answers' key is an array of objects, where each answer object contains 'text', 'correct', and 'type' keys. The type should always be 'multichoice'. There are four possible question types, 'factual', 'inference', 'truefalse' and 'vocabulary'. For factual questions, ensure the new question is explicitly answered by the script, to test the reader's understanding of the script. For inference questions, ensure the new question requires the reader to make an assumption based on the script. For true/false questions, ensure the new question can be answered with a true or false response. For vocabulary questions, ensure the new question tests the reader's understanding of a specific ${finalLearnLang} word or phrase used in the script, to test whether the reader can understand it. Vocabulary questions do not necessarily have to take the context of the conversation into account, they are merely to test the reader's ${finalLearnLang} vocabulary. The question type for this particular question to generate is ${questionType}. The question and answers should be generated in ${questionLanguage}.`;
92
+ const chatGptResponse = await makeChatGptApiRequest({
93
+ model: "gpt-3.5-turbo",
94
+ prompt
95
+ });
96
+ const jsonResponse = extractJsonObject(chatGptResponse);
97
+ const newQuestion = JSON.parse(jsonResponse);
98
+ if (!validateResponse(newQuestion)) {
99
+ throw new Error("Invalid response from GPT-3.5");
100
+ }
101
+ onSubmit({
102
+ question: newQuestion.question.trim(),
103
+ answers: newQuestion.answers
104
+ });
105
+ setIsMessageGenerating(false);
106
+ handleClose();
107
+ } catch (error) {
108
+ console.error(error);
109
+ setIsMessageGenerating(false);
110
+ setErrorMessage("There was problem generating the roleplay, please try again.");
111
+ }
112
+ };
113
+ return /*#__PURE__*/_react.default.createElement(_ResponsiveDialog.default, {
114
+ open: open,
115
+ handleClose: handleClose,
116
+ handleSubmit: handleGenerateAnswer,
117
+ submitText: t("generate_question"),
118
+ dialogTitle: isMessageGenerating ? t("generating_question") : t("generate_question"),
119
+ isSubmitDisabled: isMessageGenerating || !questionType,
120
+ isExperimentalFeature: true,
121
+ startIcon: /*#__PURE__*/_react.default.createElement(_iconsMaterial.AutoFixHigh, null),
122
+ disableRestoreFocus: disableRestoreFocus
123
+ }, /*#__PURE__*/_react.default.createElement(_material.Grid, {
124
+ item: true,
125
+ xs: 12,
126
+ textAlign: "center",
127
+ sx: {
128
+ ...(!isMessageGenerating && {
129
+ display: "none"
130
+ })
131
+ },
132
+ mx: 2
133
+ }, /*#__PURE__*/_react.default.createElement("img", {
134
+ src: _nualas.default,
135
+ style: {
136
+ maxHeight: 230
137
+ },
138
+ alt: ""
139
+ })), /*#__PURE__*/_react.default.createElement(_material.Grid, {
140
+ item: true,
141
+ xs: 12,
142
+ sx: {
143
+ ...(!isMessageGenerating && {
144
+ display: "none"
145
+ })
146
+ },
147
+ mt: 2
148
+ }, /*#__PURE__*/_react.default.createElement(_material.LinearProgress, null)), !isMessageGenerating && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_material.Grid, {
149
+ item: true,
150
+ xs: 12,
151
+ mb: 2
152
+ }, /*#__PURE__*/_react.default.createElement(_material.Alert, {
153
+ severity: "info"
154
+ }, t("experimental_feature_desc_answer"), " -", " ", /*#__PURE__*/_react.default.createElement(_reactRouterDom.Link, {
155
+ to: "/contact"
156
+ }, t("contact_form"), "."))), /*#__PURE__*/_react.default.createElement(_material.Grid, {
157
+ item: true,
158
+ xs: 12,
159
+ mb: 2
160
+ }, /*#__PURE__*/_react.default.createElement(_material.TextField, {
161
+ select: true,
162
+ label: t("question_type"),
163
+ value: questionType,
164
+ onChange: e => setQuestionType(e.target.value),
165
+ fullWidth: true,
166
+ variant: "outlined"
167
+ }, /*#__PURE__*/_react.default.createElement(_material.MenuItem, {
168
+ value: "factual"
169
+ }, t("multiple_choice_factual")), /*#__PURE__*/_react.default.createElement(_material.MenuItem, {
170
+ value: "inference"
171
+ }, t("multiple_choice_inference")), /*#__PURE__*/_react.default.createElement(_material.MenuItem, {
172
+ value: "truefalse"
173
+ }, t("true_false")), /*#__PURE__*/_react.default.createElement(_material.MenuItem, {
174
+ value: "vocabulary"
175
+ }, t("vocabulary")))), finalForLang !== finalLearnLang && /*#__PURE__*/_react.default.createElement(_material.Grid, {
176
+ item: true,
177
+ xs: 12,
178
+ mb: 2
179
+ }, /*#__PURE__*/_react.default.createElement(_material.TextField, {
180
+ select: true,
181
+ label: t("language"),
182
+ value: questionLanguage,
183
+ onChange: e => setQuestionLanguage(e.target.value),
184
+ fullWidth: true,
185
+ variant: "outlined"
186
+ }, /*#__PURE__*/_react.default.createElement(_material.MenuItem, {
187
+ value: finalForLang
188
+ }, finalForLang), /*#__PURE__*/_react.default.createElement(_material.MenuItem, {
189
+ value: finalLearnLang
190
+ }, finalLearnLang))), errorMessage && /*#__PURE__*/_react.default.createElement(_material.Grid, {
191
+ item: true,
192
+ xs: 12,
193
+ mt: 2
194
+ }, /*#__PURE__*/_react.default.createElement(_material.Alert, {
195
+ severity: "warning"
196
+ }, errorMessage))));
197
+ }
198
+ var _default = exports.default = GenerateQuestion;
@@ -0,0 +1,6 @@
1
+ {
2
+ "name": "GenerateQuestion",
3
+ "version": "0.0.0",
4
+ "private": true,
5
+ "main": "./GenerateQuestion.js"
6
+ }
@@ -50,7 +50,10 @@ function ResponsiveDialog({
50
50
  TransitionComponent,
51
51
  className,
52
52
  transitionDuration,
53
- keepDialogMounted = false
53
+ keepDialogMounted = false,
54
+ isExperimentalFeature = false,
55
+ startIcon,
56
+ disableRestoreFocus
54
57
  }) {
55
58
  const {
56
59
  classes
@@ -73,7 +76,8 @@ function ResponsiveDialog({
73
76
  style: {
74
77
  ...style
75
78
  },
76
- className: className
79
+ className: className,
80
+ disableRestoreFocus: disableRestoreFocus ? disableRestoreFocus : false
77
81
  }, dialogTitle && /*#__PURE__*/_react.default.createElement(_DialogTitle.default, null, dialogTitle), /*#__PURE__*/_react.default.createElement(_DialogContent.default, {
78
82
  className: dialogContentClassName
79
83
  }, children), (handleClose || handleSubmit) && /*#__PURE__*/_react.default.createElement(_DialogActions.default, null, handleClose && /*#__PURE__*/_react.default.createElement(_Button.default, {
@@ -81,11 +85,12 @@ function ResponsiveDialog({
81
85
  onClick: handleClose,
82
86
  color: "primary"
83
87
  }, closeText ? closeText : t("close")), handleSubmit && /*#__PURE__*/_react.default.createElement(_Button.default, {
84
- color: "primary",
88
+ color: isExperimentalFeature ? "secondary" : "primary",
85
89
  variant: "contained",
86
90
  "data-cy": "submit-dialog",
87
91
  onClick: handleSubmit,
88
- disabled: isSubmitDisabled
92
+ disabled: isSubmitDisabled,
93
+ startIcon: startIcon ? startIcon : null
89
94
  }, submitText ? submitText : "Submit")));
90
95
  }
91
96
  ResponsiveDialog.defaultProps = {
@@ -11,7 +11,6 @@ var _mui = require("tss-react/mui");
11
11
  var _material = require("@mui/material");
12
12
  var _Close = _interopRequireDefault(require("@mui/icons-material/Close"));
13
13
  var _Person = _interopRequireDefault(require("@mui/icons-material/Person"));
14
- var _Add = _interopRequireDefault(require("@mui/icons-material/Add"));
15
14
  var _ArrowDropDown = _interopRequireDefault(require("@mui/icons-material/ArrowDropDown"));
16
15
  var _ArrowDropUp = _interopRequireDefault(require("@mui/icons-material/ArrowDropUp"));
17
16
  var _PlayCircleFilled = _interopRequireDefault(require("@mui/icons-material/PlayCircleFilled"));
@@ -19,7 +18,7 @@ var _Share = _interopRequireDefault(require("@mui/icons-material/Share"));
19
18
  var _Publish = _interopRequireDefault(require("@mui/icons-material/Publish"));
20
19
  var _GetApp = _interopRequireDefault(require("@mui/icons-material/GetApp"));
21
20
  var _AutoFixHigh = _interopRequireDefault(require("@mui/icons-material/AutoFixHigh"));
22
- var _UploadRoleplayScript = _interopRequireDefault(require("../../Dialogs/UploadRoleplayScript/UploadRoleplayScript"));
21
+ var _Create = _interopRequireDefault(require("@mui/icons-material/Create"));
23
22
  var _Chat = _interopRequireDefault(require("../../Chat"));
24
23
  var _UpdateRoleplay = _interopRequireDefault(require("../../Forms/UpdateRoleplay"));
25
24
  var _CreateQuestion = _interopRequireDefault(require("../../Dialogs/CreateQuestion"));
@@ -32,6 +31,8 @@ var _handleScriptDownload = require("../../hooks/handleScriptDownload");
32
31
  var _utils = require("../../utils");
33
32
  var _DefaultColourButton = _interopRequireDefault(require("../../Misc/DefaultColourButton/DefaultColourButton"));
34
33
  var _index = require("../../utils/index");
34
+ var _GenerateQuestion = _interopRequireDefault(require("../../Dialogs/GenerateQuestion/GenerateQuestion"));
35
+ var _UploadRoleplayScript = _interopRequireDefault(require("../../Dialogs/UploadRoleplayScript/UploadRoleplayScript"));
35
36
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
36
37
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
37
38
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
@@ -102,6 +103,20 @@ const useStyles = (0, _mui.makeStyles)()((theme, {
102
103
  option2Avatar: {
103
104
  color: option === 2 ? theme.palette.primary.main : null,
104
105
  boxShadow: option === 2 ? "rgb(255, 255, 255) 0px 0px 0px 2.5px, 0px 0px 0px 4.5px" : "none"
106
+ },
107
+ createQuestion: {
108
+ backgroundColor: theme.palette.primary.main,
109
+ color: theme.palette.mode === "dark" ? "black" : "white",
110
+ "&:hover": {
111
+ backgroundColor: theme.palette.primary.dark
112
+ }
113
+ },
114
+ generateQuestion: {
115
+ backgroundColor: theme.palette.secondary.main,
116
+ color: theme.palette.mode === "dark" ? "black" : "white",
117
+ "&:hover": {
118
+ backgroundColor: theme.palette.secondary.dark
119
+ }
105
120
  }
106
121
  }));
107
122
  function Transition(props) {
@@ -115,8 +130,29 @@ function CreationOptions({
115
130
  handleSelectOption,
116
131
  roleplay,
117
132
  option,
118
- handleClickOpenCreateQuestion
133
+ handleClickOpenCreateQuestion,
134
+ setIsGenerateQuestionDialogOpen,
135
+ handleClose
119
136
  }) {
137
+ const handleClickOpenGenerateQuestion = () => {
138
+ setIsGenerateQuestionDialogOpen(true);
139
+ handleClose();
140
+ };
141
+ const handleClickCreateQuestion = () => {
142
+ handleClickOpenCreateQuestion();
143
+ handleClose();
144
+ };
145
+ const actions = [{
146
+ icon: /*#__PURE__*/_react.default.createElement(_Create.default, null),
147
+ name: "Create Question",
148
+ onClick: handleClickCreateQuestion,
149
+ class: classes.createQuestion
150
+ }, {
151
+ icon: /*#__PURE__*/_react.default.createElement(_AutoFixHigh.default, null),
152
+ name: "Generate Question",
153
+ onClick: handleClickOpenGenerateQuestion,
154
+ class: classes.generateQuestion
155
+ }];
120
156
  return /*#__PURE__*/_react.default.createElement("div", {
121
157
  className: classes.creationOptions,
122
158
  id: "creationOptions"
@@ -172,12 +208,27 @@ function CreationOptions({
172
208
  number: "2"
173
209
  }))), /*#__PURE__*/_react.default.createElement("div", {
174
210
  className: `${classes.option}`
175
- }, /*#__PURE__*/_react.default.createElement(_material.Fab, {
211
+ }, /*#__PURE__*/_react.default.createElement(_material.SpeedDial, {
176
212
  className: `${classes.avatar}`,
177
- onClick: handleClickOpenCreateQuestion,
178
- color: "primary",
179
- "aria-label": "add question"
180
- }, /*#__PURE__*/_react.default.createElement(_Add.default, null)), /*#__PURE__*/_react.default.createElement(_material.Typography, {
213
+ FabProps: {
214
+ color: "primary",
215
+ sx: {
216
+ minWidth: 60,
217
+ minHeight: 60
218
+ }
219
+ },
220
+ ariaLabel: "Add question",
221
+ icon: /*#__PURE__*/_react.default.createElement(_material.SpeedDialIcon, null)
222
+ }, actions.map(action => /*#__PURE__*/_react.default.createElement(_material.SpeedDialAction, {
223
+ key: action.name,
224
+ icon: action.icon,
225
+ tooltipTitle: action.name,
226
+ onClick: action.onClick,
227
+ classes: {
228
+ fab: action.class
229
+ },
230
+ tooltipPlacement: "right"
231
+ }))), /*#__PURE__*/_react.default.createElement(_material.Typography, {
181
232
  variant: "h6",
182
233
  color: option === 3 ? "primary" : ""
183
234
  }, t("question")))));
@@ -217,6 +268,7 @@ function Roleplay({
217
268
  siteLanguage
218
269
  }) {
219
270
  const [isGenerateRoleplayDialogOpen, setIsGenerateRoleplayDialogOpen] = (0, _react.useState)(false);
271
+ const [isGenerateQuestionDialogOpen, setIsGenerateQuestionDialogOpen] = (0, _react.useState)(false);
220
272
  const {
221
273
  recognitionState,
222
274
  toggleListen,
@@ -565,7 +617,8 @@ function Roleplay({
565
617
  roleplay: roleplay,
566
618
  handleSelectOption: handleSelectOption,
567
619
  option: option,
568
- handleClickOpenCreateQuestion: handleClickOpenCreateQuestion
620
+ handleClickOpenCreateQuestion: handleClickOpenCreateQuestion,
621
+ setIsGenerateQuestionDialogOpen: setIsGenerateQuestionDialogOpen
569
622
  }));
570
623
  const tabs = [{
571
624
  label: t("editor")
@@ -729,7 +782,8 @@ function Roleplay({
729
782
  values: {
730
783
  actor1: roleplay.actor1,
731
784
  actor2: roleplay.actor2
732
- }
785
+ },
786
+ disableRestoreFocus: true
733
787
  }), isUpdatingQuestion.status && /*#__PURE__*/_react.default.createElement(_CreateQuestion.default, {
734
788
  t: t,
735
789
  learnLang: learnLang,
@@ -743,6 +797,23 @@ function Roleplay({
743
797
  question: roleplay.script[isUpdatingQuestion.index]?.question,
744
798
  answers: roleplay.script[isUpdatingQuestion.index].answers,
745
799
  update: true
800
+ }), /*#__PURE__*/_react.default.createElement(_GenerateQuestion.default, {
801
+ t: t,
802
+ open: isGenerateQuestionDialogOpen,
803
+ handleClose: () => {
804
+ setIsGenerateQuestionDialogOpen(false);
805
+ },
806
+ script: roleplay.script,
807
+ values: {
808
+ actor1: roleplay.actor1,
809
+ actor2: roleplay.actor2
810
+ },
811
+ makeChatGptApiRequest: makeChatGptApiRequest,
812
+ onSubmit: handleAddQuestion,
813
+ learnLang: learnLang,
814
+ forLang: forLang,
815
+ siteLanguage: siteLanguage,
816
+ disableRestoreFocus: true
746
817
  }), isGenerateRoleplayDialogOpen && /*#__PURE__*/_react.default.createElement(_GenerateRoleplay.default, {
747
818
  t: t,
748
819
  isGenerateRoleplayDialogOpen: isGenerateRoleplayDialogOpen,
@@ -297,6 +297,15 @@ function RoleplayGame({
297
297
  formatUnderscores: false,
298
298
  hideBottomBar: true,
299
299
  muteSound: muteSound
300
+ }), /*#__PURE__*/_react.default.createElement(_InProgressExercise.default, {
301
+ t: t,
302
+ open: isInProgressModalOpen,
303
+ close: closeInProgressModal,
304
+ onClose: closeInProgressModal,
305
+ continueExercise: handleContinueExercise,
306
+ restartExercise: handleRestartExercise,
307
+ goBack: handleCloseExercise,
308
+ inTopic: courseId && sectionId && topicId
300
309
  }), /*#__PURE__*/_react.default.createElement(_CompletedExcercise.default, {
301
310
  open: isCompletionModalOpen,
302
311
  restartExcercise: () => {
@@ -327,15 +336,6 @@ function RoleplayGame({
327
336
  goBack: handleCloseExercise,
328
337
  inTopic: courseId && sectionId && topicId,
329
338
  isFinishExerciseDisabled: true
330
- }), /*#__PURE__*/_react.default.createElement(_InProgressExercise.default, {
331
- t: t,
332
- open: isInProgressModalOpen,
333
- close: closeInProgressModal,
334
- onClose: closeInProgressModal,
335
- continueExercise: handleContinueExercise,
336
- restartExercise: handleRestartExercise,
337
- goBack: handleCloseExercise,
338
- inTopic: courseId && sectionId && topicId
339
339
  }));
340
340
  }
341
341
  RoleplayGame.defaultProps = {
@@ -460,7 +460,7 @@ function AnswerResult({
460
460
  onClick: handleNext,
461
461
  className: classes.nextButton,
462
462
  "data-cy": "answer-result-next-button",
463
- "aria-label": "Answer Result Drawer - Next Button",
463
+ "aria-label": "Next Button",
464
464
  ref: nextBtnRef,
465
465
  tabIndex: 1
466
466
  }, t("next")), (exercise === "pronunciation" || exercise === "roleplay") && handleTryAgain && /*#__PURE__*/_react.default.createElement(_DefaultColourButton.default, {
@@ -12,6 +12,7 @@ var _Close = _interopRequireDefault(require("@mui/icons-material/Close"));
12
12
  var _Error = _interopRequireDefault(require("@mui/icons-material/Error"));
13
13
  var _Done = _interopRequireDefault(require("@mui/icons-material/Done"));
14
14
  var _Info = _interopRequireDefault(require("@mui/icons-material/Info"));
15
+ var _material = require("@mui/material");
15
16
  var _mui = require("tss-react/mui");
16
17
  var _colors = require("@mui/material/colors");
17
18
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
@@ -82,13 +83,14 @@ function Snackbar({
82
83
  onClose: closeSnackbar,
83
84
  message: snackbarMessage,
84
85
  "aria-describedby": "client-snackbar-message",
85
- role: "dialog"
86
+ role: "none"
86
87
  }, /*#__PURE__*/_react.default.createElement(_SnackbarContent.default, {
87
88
  "data-cy": "snackbar",
88
89
  className: color,
89
90
  message: /*#__PURE__*/_react.default.createElement("span", {
90
91
  "aria-label": "client-snackbar-message",
91
- className: classes.message
92
+ className: classes.message,
93
+ role: "alert"
92
94
  }, icon, t(snackbarMessage)),
93
95
  action: [/*#__PURE__*/_react.default.createElement(_IconButton.default, {
94
96
  key: "close",
@@ -569,7 +569,8 @@ function Classroom({
569
569
  userImage,
570
570
  verificationStatus,
571
571
  gameAward,
572
- banner
572
+ banner,
573
+ bannerXs
573
574
  } = classroom;
574
575
  const handleJoin = () => {
575
576
  if (authenticated) {
@@ -854,7 +855,7 @@ function Classroom({
854
855
  marginBottom: theme.spacing(4)
855
856
  }),
856
857
  highQualitySrc: (banner ?? picture) || _index.default.classroom,
857
- lowQualitySrc: pictureXs,
858
+ lowQualitySrc: bannerXs ?? pictureXs,
858
859
  title: classroomName
859
860
  }), userImage ? /*#__PURE__*/_react.default.createElement(_CardElements.CardAvatar, {
860
861
  "aria-label": `Open ${classroomName} creator's profile`,
@@ -525,7 +525,8 @@ function Course({
525
525
  verificationStatus,
526
526
  createdBy,
527
527
  createdByName,
528
- gameAward
528
+ gameAward,
529
+ bannerXs
529
530
  } = course;
530
531
  const handleJoin = () => {
531
532
  if (creatorSubscription.isPaidUser || course.visibility === "public") {
@@ -702,7 +703,7 @@ function Course({
702
703
  marginBottom: theme.spacing(4)
703
704
  }),
704
705
  highQualitySrc: (banner ?? picture) || _index.default.course,
705
- lowQualitySrc: pictureXs,
706
+ lowQualitySrc: bannerXs ?? pictureXs,
706
707
  title: courseName
707
708
  }), userImage ? /*#__PURE__*/_react.default.createElement(_CardElements.CardAvatar, {
708
709
  "aria-label": `Open ${courseName} creator's profile`,
@@ -708,7 +708,8 @@ function Topic({
708
708
  createdByName,
709
709
  banner,
710
710
  gameAward,
711
- isKeyboardHiddenTranslation
711
+ isKeyboardHiddenTranslation,
712
+ bannerXs
712
713
  } = topic;
713
714
  const handleAddPhrase = async values => {
714
715
  try {
@@ -847,7 +848,7 @@ function Topic({
847
848
  marginBottom: theme.spacing(4)
848
849
  }),
849
850
  highQualitySrc: (banner ?? picture) || _index2.default.topic,
850
- lowQualitySrc: pictureXs,
851
+ lowQualitySrc: bannerXs ?? pictureXs,
851
852
  title: topicName
852
853
  }), userImage ? /*#__PURE__*/_react.default.createElement(_CardElements.CardAvatar, {
853
854
  "aria-label": `${t("go_to")} ${createdByName || `${topicName} ${t("creator")}`} ${t("profile")}`,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nualang/nualang-ui-components",
3
- "version": "0.1.1133",
3
+ "version": "0.1.1135",
4
4
  "main": "dist/index.js",
5
5
  "files": [
6
6
  "dist",
@@ -22,7 +22,7 @@
22
22
  "@mui/material": "^5.14.2",
23
23
  "@mui/system": "^5.14.1",
24
24
  "@mui/x-date-pickers": "^6.10.1",
25
- "@nualang/videochat-ui-components": "^0.0.167",
25
+ "@nualang/videochat-ui-components": "^0.0.168",
26
26
  "@storybook/theming": "^7.6.17",
27
27
  "@stripe/react-stripe-js": "^2.1.1",
28
28
  "@stripe/stripe-js": "^1.54.2",