@nualang/nualang-ui-components 0.1.1399 → 0.2.0

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.
Files changed (935) hide show
  1. package/package.json +7 -10
  2. package/dist/Assignments/AssignmentBotSelection/AssignmentBotSelection.js +0 -278
  3. package/dist/Assignments/AssignmentBotSelection/package.json +0 -6
  4. package/dist/Assignments/AssignmentCard/AssignmentCard.js +0 -297
  5. package/dist/Assignments/AssignmentCard/package.json +0 -6
  6. package/dist/Assignments/AssignmentCardsList/AssignmentCardsList.js +0 -389
  7. package/dist/Assignments/AssignmentCardsList/package.json +0 -6
  8. package/dist/Assignments/AssignmentCourseSelection/AssignmentCourseSelection.js +0 -280
  9. package/dist/Assignments/AssignmentCourseSelection/package.json +0 -6
  10. package/dist/Assignments/AssignmentExerciseSelection/AssignmentExerciseSelection.js +0 -1056
  11. package/dist/Assignments/AssignmentExerciseSelection/package.json +0 -6
  12. package/dist/Assignments/AssignmentExerciseSelector/AssignmentExerciseSelector.js +0 -53
  13. package/dist/Assignments/AssignmentExerciseSelector/package.json +0 -6
  14. package/dist/Assignments/AssignmentPhraseListSelection/AssignmentPhraseListSelection.js +0 -469
  15. package/dist/Assignments/AssignmentPhraseListSelection/package.json +0 -6
  16. package/dist/Assignments/AssignmentRoleplaySelection/AssignmentRoleplaySelection.js +0 -498
  17. package/dist/Assignments/AssignmentRoleplaySelection/package.json +0 -6
  18. package/dist/Assignments/AssignmentSelectExercise/AssignmentSelectExercise.js +0 -113
  19. package/dist/Assignments/CreateAssignmentDialog/CreateAssignmentDialog.js +0 -654
  20. package/dist/Assignments/CreateAssignmentDialog/package.json +0 -6
  21. package/dist/Assignments/SelectAssignmentTypeDialog/SelectAssignmentTypeDialog.js +0 -168
  22. package/dist/Assignments/SelectAssignmentTypeDialog/package.json +0 -6
  23. package/dist/Cards/Avatar/Avatar.js +0 -45
  24. package/dist/Cards/Bot/Bot.js +0 -349
  25. package/dist/Cards/Bot/Bot.test.js +0 -21
  26. package/dist/Cards/Bot/package.json +0 -6
  27. package/dist/Cards/CardElements/CardTitle/CardTitle.js +0 -28
  28. package/dist/Cards/CardElements/CardTitle/package.json +0 -6
  29. package/dist/Cards/CardElements/CardVisibility/CardVisibility.js +0 -80
  30. package/dist/Cards/CardElements/CardVisibility/package.json +0 -6
  31. package/dist/Cards/CardElements/index.js +0 -169
  32. package/dist/Cards/Category/Category.js +0 -92
  33. package/dist/Cards/Category/sample.png +0 -0
  34. package/dist/Cards/Classroom/Classroom.js +0 -379
  35. package/dist/Cards/Classroom/Classroom.test.js +0 -30
  36. package/dist/Cards/Classroom/package.json +0 -6
  37. package/dist/Cards/Course/Course.js +0 -666
  38. package/dist/Cards/Course/Course.test.js +0 -30
  39. package/dist/Cards/Course/package.json +0 -6
  40. package/dist/Cards/FeedbackCard/FeedbackCard.js +0 -624
  41. package/dist/Cards/LoadingCard/LoadingCard.js +0 -39
  42. package/dist/Cards/PreviewCard/PreviewCard.js +0 -63
  43. package/dist/Cards/PreviewCard/PreviewCard.test.js +0 -20
  44. package/dist/Cards/RecordingCard/RecordingCard.js +0 -250
  45. package/dist/Cards/Roleplay/Roleplay.js +0 -348
  46. package/dist/Cards/Roleplay/Roleplay.test.js +0 -21
  47. package/dist/Cards/Roleplay/package.json +0 -6
  48. package/dist/Cards/ScheduleCard/ScheduleCard.js +0 -152
  49. package/dist/Cards/SubmissionsCard/SubmissionsCard.js +0 -138
  50. package/dist/Cards/SubscriptionPlan/SubscriptionPlan.js +0 -395
  51. package/dist/Cards/SubscriptionPlan/SubscriptionPlan.test.js +0 -20
  52. package/dist/Cards/SubscriptionPlan/nuala.svg +0 -28
  53. package/dist/Cards/SubscriptionPlan/package.json +0 -6
  54. package/dist/Cards/SubscriptionPlan/plus.svg +0 -4
  55. package/dist/Cards/Topic/Topic.js +0 -219
  56. package/dist/Cards/Topic/Topic.test.js +0 -21
  57. package/dist/Cards/Topic/package.json +0 -6
  58. package/dist/Cards/index.js +0 -2
  59. package/dist/Charts/Bar/Exercises/Exercises.js +0 -118
  60. package/dist/Charts/Bar/Exercises/package.json +0 -6
  61. package/dist/Charts/Bar/TotalGrades/TotalGrades.js +0 -123
  62. package/dist/Charts/Bar/TotalGrades/package.json +0 -6
  63. package/dist/Charts/Doughnut/AnswerMethod/AnswerMethod.js +0 -97
  64. package/dist/Charts/Doughnut/AnswerMethod/package.json +0 -6
  65. package/dist/Charts/Doughnut/AnswersBreakdown/AnswersBreakdown.js +0 -105
  66. package/dist/Charts/Doughnut/AnswersBreakdown/package.json +0 -6
  67. package/dist/Charts/Doughnut/RecordingAttendance/RecordingAttendance.js +0 -100
  68. package/dist/Charts/Doughnut/SubmittedRecordings/SubmittedRecordings.js +0 -87
  69. package/dist/Chat/BottomBar/BottomBar.js +0 -375
  70. package/dist/Chat/BottomBar/package.json +0 -6
  71. package/dist/Chat/Chat.js +0 -205
  72. package/dist/Chat/ChatLoading/ChatLoading.js +0 -224
  73. package/dist/Chat/ChatLoading/package.json +0 -6
  74. package/dist/Chat/Messages/Message/Message.js +0 -710
  75. package/dist/Chat/Messages/Message/package.json +0 -6
  76. package/dist/Chat/Messages/Messages.js +0 -270
  77. package/dist/Chat/Messages/Question/Question.js +0 -485
  78. package/dist/Chat/Messages/Question/package.json +0 -6
  79. package/dist/Chat/Messages/package.json +0 -6
  80. package/dist/Chat/TopBar/TopBar.js +0 -123
  81. package/dist/Chat/TopBar/package.json +0 -6
  82. package/dist/Chat/VoiceMessage/VoiceMessage.js +0 -144
  83. package/dist/Chat/VoiceMessage/package.json +0 -6
  84. package/dist/Chat/package.json +0 -6
  85. package/dist/Containers/App/App.js +0 -536
  86. package/dist/Containers/App/package.json +0 -6
  87. package/dist/Dialogs/AddToClassroom/AddToClassroom.js +0 -117
  88. package/dist/Dialogs/AddToClassroom/AddToClassroom.test.js +0 -15
  89. package/dist/Dialogs/AddToClassroom/package.json +0 -6
  90. package/dist/Dialogs/AddToCourse/AddToCourse.js +0 -73
  91. package/dist/Dialogs/Alternatives/Alternatives.js +0 -67
  92. package/dist/Dialogs/Alternatives/package.json +0 -6
  93. package/dist/Dialogs/AvatarDialog/AvatarDialog.js +0 -585
  94. package/dist/Dialogs/AvatarDialog/options.js +0 -120
  95. package/dist/Dialogs/BotPreview/BotPreview.js +0 -350
  96. package/dist/Dialogs/BotPreview/package.json +0 -6
  97. package/dist/Dialogs/Code/Code.js +0 -147
  98. package/dist/Dialogs/Code/Code.test.js +0 -20
  99. package/dist/Dialogs/Code/package.json +0 -6
  100. package/dist/Dialogs/ConfirmDeleteDiscussion/ConfirmDeleteDiscussion.js +0 -46
  101. package/dist/Dialogs/ConfirmDialog/ConfirmDialog.js +0 -198
  102. package/dist/Dialogs/CourseOutline/CourseOutline.js +0 -27
  103. package/dist/Dialogs/CourseOutline/CourseOutline.test.js +0 -28
  104. package/dist/Dialogs/CourseOutline/package.json +0 -6
  105. package/dist/Dialogs/CreatePhrase/CreatePhrase.js +0 -733
  106. package/dist/Dialogs/CreatePhrase/CreatePhrase.test.js +0 -20
  107. package/dist/Dialogs/CreatePhrase/package.json +0 -6
  108. package/dist/Dialogs/CreatePhraseGroupDialog/CreatePhraseGroupDialog.js +0 -144
  109. package/dist/Dialogs/CreatePhraseListFromSelectionDialog/CreatePhraseListFromSelectionDialog.js +0 -49
  110. package/dist/Dialogs/CreateQuestion/CreateQuestion.js +0 -282
  111. package/dist/Dialogs/CreateQuestion/CreateQuestion.test.js +0 -15
  112. package/dist/Dialogs/CreateQuestion/package.json +0 -6
  113. package/dist/Dialogs/CreateSection/CreateSection.js +0 -51
  114. package/dist/Dialogs/CreateSection/CreateSection.test.js +0 -15
  115. package/dist/Dialogs/CreateSection/package.json +0 -6
  116. package/dist/Dialogs/CreateTopic/CreateTopic.js +0 -135
  117. package/dist/Dialogs/CreateTopic/CreateTopic.test.js +0 -15
  118. package/dist/Dialogs/CreateTopic/package.json +0 -6
  119. package/dist/Dialogs/CreatorNotSubscribed/CreatorNotSubscribed.js +0 -19
  120. package/dist/Dialogs/CreatorNotSubscribedUpgrade/CreatorNotSubscribedUpgrade.js +0 -50
  121. package/dist/Dialogs/DynamicAIWarning/DynamicAIWarning.js +0 -183
  122. package/dist/Dialogs/DynamicAIWarning/owl.png +0 -0
  123. package/dist/Dialogs/EnrollmentKeyDialog/EnrollmentKeyDialog.js +0 -47
  124. package/dist/Dialogs/ExerciseMenu/ExerciseMenu.js +0 -92
  125. package/dist/Dialogs/ExerciseMenu/Menus/CloseBotPreview/CloseBotPreview.js +0 -20
  126. package/dist/Dialogs/ExerciseMenu/Menus/CloseBotPreview/package.json +0 -6
  127. package/dist/Dialogs/ExerciseMenu/Menus/CloseExercise/CloseExercise.js +0 -52
  128. package/dist/Dialogs/ExerciseMenu/Menus/CloseExercise/package.json +0 -6
  129. package/dist/Dialogs/ExerciseMenu/Menus/CompletedExcercise/CompletedExcercise.js +0 -60
  130. package/dist/Dialogs/ExerciseMenu/Menus/CompletedExcercise/package.json +0 -6
  131. package/dist/Dialogs/ExerciseMenu/Menus/InProgressExercise/InProgressExercise.js +0 -43
  132. package/dist/Dialogs/ExerciseMenu/Menus/InProgressExercise/package.json +0 -6
  133. package/dist/Dialogs/ExerciseMenu/package.json +0 -6
  134. package/dist/Dialogs/Feedback/FeedbackDialog.js +0 -86
  135. package/dist/Dialogs/FeedbackDialog/FeedbackDialog.js +0 -123
  136. package/dist/Dialogs/FeedbackInfoDialog/FeedbackInfoDialog.js +0 -39
  137. package/dist/Dialogs/GenerateBot/GenerateBot.js +0 -429
  138. package/dist/Dialogs/GenerateBot/package.json +0 -6
  139. package/dist/Dialogs/GenerateDefinitions/GenerateDefinitions.js +0 -217
  140. package/dist/Dialogs/GenerateDefinitions/package.json +0 -6
  141. package/dist/Dialogs/GenerateDiscussion/GenerateDiscussion.js +0 -275
  142. package/dist/Dialogs/GeneratePhrases/GeneratePhrases.js +0 -379
  143. package/dist/Dialogs/GeneratePhrases/package.json +0 -6
  144. package/dist/Dialogs/GenerateQuestion/GenerateQuestion.js +0 -212
  145. package/dist/Dialogs/GenerateQuestion/package.json +0 -6
  146. package/dist/Dialogs/GenerateRoleplay/GenerateRoleplay.js +0 -735
  147. package/dist/Dialogs/GenerateRoleplay/package.json +0 -6
  148. package/dist/Dialogs/GroupedFeedbackDialog/GroupedFeedbackDialog.js +0 -711
  149. package/dist/Dialogs/GroupedFeedbackDialog/package.json +0 -6
  150. package/dist/Dialogs/Icons/Icons.js +0 -18
  151. package/dist/Dialogs/Icons/package.json +0 -6
  152. package/dist/Dialogs/ImageLibrary/ImageLibrary.js +0 -34
  153. package/dist/Dialogs/ImageLibrary/ImageLibrary.test.js +0 -20
  154. package/dist/Dialogs/ImageLibrary/package.json +0 -6
  155. package/dist/Dialogs/ImageLibraryDialog/ImageLibraryDialog.js +0 -33
  156. package/dist/Dialogs/InactivePopover/InactivePopover.js +0 -71
  157. package/dist/Dialogs/InviteDialog/InviteDialog.js +0 -695
  158. package/dist/Dialogs/InviteDialog/package.json +0 -6
  159. package/dist/Dialogs/InviteDialog/upload-emails-csv.png +0 -0
  160. package/dist/Dialogs/Listener/Listener.js +0 -87
  161. package/dist/Dialogs/Listener/Listener.test.js +0 -24
  162. package/dist/Dialogs/Listener/package.json +0 -6
  163. package/dist/Dialogs/LiveGameTutorial/LiveGameTutorial.js +0 -166
  164. package/dist/Dialogs/LiveGameTutorial/package.json +0 -6
  165. package/dist/Dialogs/Members/Members.js +0 -27
  166. package/dist/Dialogs/Members/Members.test.js +0 -20
  167. package/dist/Dialogs/Members/package.json +0 -6
  168. package/dist/Dialogs/ModeratedDialog/ModeratedDialog.js +0 -35
  169. package/dist/Dialogs/PDFViewer/PDFViewer.js +0 -252
  170. package/dist/Dialogs/PDFViewer/pdf24.pdf +0 -0
  171. package/dist/Dialogs/PDFViewer/rubrics/level1Rubric.pdf +0 -0
  172. package/dist/Dialogs/PDFViewer/rubrics/level2Rubric.pdf +0 -0
  173. package/dist/Dialogs/PDFViewer/rubrics/level3Rubric.pdf +0 -0
  174. package/dist/Dialogs/PDFViewer/rubrics/level4Rubric.pdf +0 -0
  175. package/dist/Dialogs/PhraseNameDialog/PhraseNameDialog.js +0 -30
  176. package/dist/Dialogs/QuickCreateClassroomDialog/QuickCreateClassroomDialog.js +0 -201
  177. package/dist/Dialogs/QuickCreateCourseDialog/QuickCreateCourseDialog.js +0 -215
  178. package/dist/Dialogs/RecordingDialog/RecordingDialog.js +0 -288
  179. package/dist/Dialogs/ReportProblem/ReportProblem.js +0 -287
  180. package/dist/Dialogs/ReportProblem/ReportProblem.test.js +0 -15
  181. package/dist/Dialogs/ReportProblem/package.json +0 -6
  182. package/dist/Dialogs/ResponsiveDialog/ResponsiveDialog.js +0 -105
  183. package/dist/Dialogs/ResponsiveDialog/ResponsiveDialog.test.js +0 -15
  184. package/dist/Dialogs/ResponsiveDialog/package.json +0 -6
  185. package/dist/Dialogs/RewardEarned/RewardEarned.js +0 -111
  186. package/dist/Dialogs/RewardEarned/package.json +0 -6
  187. package/dist/Dialogs/RoleplayPreview/RoleplayPreview.js +0 -87
  188. package/dist/Dialogs/SearchTopic/SearchTopic.js +0 -87
  189. package/dist/Dialogs/SelectActor/SelectActor.js +0 -157
  190. package/dist/Dialogs/SelectActor/package.json +0 -6
  191. package/dist/Dialogs/SelectClassroom/SelectClassroom.js +0 -81
  192. package/dist/Dialogs/SelectClassroom/package.json +0 -6
  193. package/dist/Dialogs/SelectExercise/SelectExercise.js +0 -47
  194. package/dist/Dialogs/SelectExercise/package.json +0 -6
  195. package/dist/Dialogs/Substitution/Substitution.js +0 -82
  196. package/dist/Dialogs/Substitution/package.json +0 -6
  197. package/dist/Dialogs/Topic/Topic.js +0 -69
  198. package/dist/Dialogs/Topic/package.json +0 -6
  199. package/dist/Dialogs/TopicPreview/TopicPreview.js +0 -39
  200. package/dist/Dialogs/TopicPreview/package.json +0 -6
  201. package/dist/Dialogs/TransferPhrase/TransferPhrase.js +0 -115
  202. package/dist/Dialogs/Trigger/Trigger.js +0 -213
  203. package/dist/Dialogs/Trigger/package.json +0 -6
  204. package/dist/Dialogs/UpgradeSubscription/UpgradeSubscription.js +0 -40
  205. package/dist/Dialogs/UploadBotVars/UploadBotVars.jpeg +0 -0
  206. package/dist/Dialogs/UploadBotVars/UploadBotVars.js +0 -186
  207. package/dist/Dialogs/UploadBotVars/UploadBotVars.test.js +0 -20
  208. package/dist/Dialogs/UploadBotVars/package.json +0 -6
  209. package/dist/Dialogs/UploadPhrases/UploadPhrases.js +0 -553
  210. package/dist/Dialogs/UploadPhrases/UploadPhrases.test.js +0 -20
  211. package/dist/Dialogs/UploadPhrases/package.json +0 -6
  212. package/dist/Dialogs/UploadPhrases/upload-phrases-csv.png +0 -0
  213. package/dist/Dialogs/UploadRoleplayScript/UploadRoleplayScript.js +0 -287
  214. package/dist/Dialogs/UploadRoleplayScript/UploadRoleplayScript.test.js +0 -20
  215. package/dist/Dialogs/UploadRoleplayScript/package.json +0 -6
  216. package/dist/Dialogs/UploadRoleplayScript/roleplay-script-csv.png +0 -0
  217. package/dist/Dialogs/UploadVideo/UploadVideo.js +0 -80
  218. package/dist/Dialogs/UploadVideo/UploadVideo.test.js +0 -20
  219. package/dist/Dialogs/UploadVideo/package.json +0 -6
  220. package/dist/Dialogs/Variable/Variable.js +0 -74
  221. package/dist/Dialogs/Variable/package.json +0 -6
  222. package/dist/Dialogs/VideoViewer/VideoViewer.js +0 -61
  223. package/dist/Dialogs/ViewImageDialog/ViewImageDialog.js +0 -24
  224. package/dist/Dialogs/WaveformDialog/WaveformDialog.js +0 -110
  225. package/dist/Editors/Bot/Bot.js +0 -843
  226. package/dist/Editors/Bot/Editor/BotDesigner/AddImageModal/AddImageModal.js +0 -98
  227. package/dist/Editors/Bot/Editor/BotDesigner/AddImageModal/AddImageModal.test.js +0 -12
  228. package/dist/Editors/Bot/Editor/BotDesigner/AddImageModal/package.json +0 -6
  229. package/dist/Editors/Bot/Editor/BotDesigner/AddLinkModal/AddLinkModal.js +0 -95
  230. package/dist/Editors/Bot/Editor/BotDesigner/AddLinkModal/AddLinkModal.test.js +0 -12
  231. package/dist/Editors/Bot/Editor/BotDesigner/AddLinkModal/package.json +0 -6
  232. package/dist/Editors/Bot/Editor/BotDesigner/AlternativesList.js +0 -88
  233. package/dist/Editors/Bot/Editor/BotDesigner/BotDesigner.js +0 -66
  234. package/dist/Editors/Bot/Editor/BotDesigner/BotDesigner.test.js +0 -34
  235. package/dist/Editors/Bot/Editor/BotDesigner/VarList.js +0 -324
  236. package/dist/Editors/Bot/Editor/BotDesigner/package.json +0 -6
  237. package/dist/Editors/Bot/Editor/Editor.js +0 -628
  238. package/dist/Editors/Bot/Editor/package.json +0 -6
  239. package/dist/Editors/Bot/Tutorial.js +0 -154
  240. package/dist/Editors/Bot/package.json +0 -6
  241. package/dist/Editors/PhraseList/PhraseList.js +0 -388
  242. package/dist/Editors/Phrases/Phrases.js +0 -617
  243. package/dist/Editors/Phrases/SpreadsheetEditor/SpreadsheetEditor.js +0 -146
  244. package/dist/Editors/Roleplay/Roleplay.js +0 -955
  245. package/dist/Editors/Roleplay/package.json +0 -6
  246. package/dist/Exercises/Bot/Bot.js +0 -716
  247. package/dist/Exercises/Bot/Bot.test.js +0 -25
  248. package/dist/Exercises/Bot/package.json +0 -6
  249. package/dist/Exercises/ListenAndSpeak/ListenAndSpeak.js +0 -963
  250. package/dist/Exercises/Listener/Listener.js +0 -1023
  251. package/dist/Exercises/Listener/Listener.test.js +0 -25
  252. package/dist/Exercises/Listener/package.json +0 -6
  253. package/dist/Exercises/Meaning/Meaning.js +0 -808
  254. package/dist/Exercises/MeaningReadWrite/MeaningReadWriteGame.js +0 -725
  255. package/dist/Exercises/PhraseGroup/Games/ListenAndSpeakGame/ListenAndSpeakGame.js +0 -95
  256. package/dist/Exercises/PhraseGroup/Games/ListeningGame/ListeningGame.js +0 -89
  257. package/dist/Exercises/PhraseGroup/Games/MeaningGame/MeaningGame.js +0 -88
  258. package/dist/Exercises/PhraseGroup/Games/MeaningReadWriteGame/MeaningReadWriteGame.js +0 -90
  259. package/dist/Exercises/PhraseGroup/Games/PronunciationGame/PronunciationGame.js +0 -85
  260. package/dist/Exercises/PhraseGroup/Games/TranslationGame/TranslationGame.js +0 -90
  261. package/dist/Exercises/PhraseGroup/Games/index.js +0 -7
  262. package/dist/Exercises/PhraseGroup/PhraseGroup.js +0 -269
  263. package/dist/Exercises/PhraseGroup/PhraseGroup.test.js +0 -28
  264. package/dist/Exercises/PhraseGroup/PhraseGroupGameOptions/PhraseGroupGame/PhraseGroupGame.js +0 -296
  265. package/dist/Exercises/PhraseGroup/PhraseGroupGameOptions/PhraseGroupGames.js +0 -70
  266. package/dist/Exercises/PhraseGroup/PhraseGroupInfo/PhraseGroupInfo.js +0 -135
  267. package/dist/Exercises/PhraseGroup/package.json +0 -7
  268. package/dist/Exercises/Pronouncer/Pronouncer.js +0 -981
  269. package/dist/Exercises/Pronouncer/Pronouncer.test.js +0 -23
  270. package/dist/Exercises/Pronouncer/package.json +0 -6
  271. package/dist/Exercises/Roleplay/Games/ActItOutGame/ActItOutGame.js +0 -502
  272. package/dist/Exercises/Roleplay/Games/ActItOutGame/package.json +0 -6
  273. package/dist/Exercises/Roleplay/Games/ActItOutGameListening/ActItOutGameListening.js +0 -505
  274. package/dist/Exercises/Roleplay/Games/ActItOutGameListening/package.json +0 -6
  275. package/dist/Exercises/Roleplay/Games/ActItOutGameListeningAndSpeaking/ActItOutGame.js +0 -748
  276. package/dist/Exercises/Roleplay/Games/ActItOutGameListeningAndSpeaking/package.json +0 -6
  277. package/dist/Exercises/Roleplay/Games/ActItOutGameSpeaking/ActItOutGame.js +0 -738
  278. package/dist/Exercises/Roleplay/Games/ActItOutGameSpeaking/package.json +0 -6
  279. package/dist/Exercises/Roleplay/Games/BeforeElements.js +0 -68
  280. package/dist/Exercises/Roleplay/Games/FillInTheBlanksGame/FillInBlanks.js +0 -264
  281. package/dist/Exercises/Roleplay/Games/FillInTheBlanksGame/FillInTheBlanksGame.js +0 -360
  282. package/dist/Exercises/Roleplay/Games/FillInTheBlanksGame/package.json +0 -6
  283. package/dist/Exercises/Roleplay/Games/StoryGame/StoryGame.js +0 -347
  284. package/dist/Exercises/Roleplay/Games/StoryGame/package.json +0 -6
  285. package/dist/Exercises/Roleplay/Games/TopBarActions.js +0 -336
  286. package/dist/Exercises/Roleplay/Games/Transition.js +0 -9
  287. package/dist/Exercises/Roleplay/Games/index.js +0 -7
  288. package/dist/Exercises/Roleplay/OriginalRoleplay.js +0 -946
  289. package/dist/Exercises/Roleplay/Roleplay.js +0 -399
  290. package/dist/Exercises/Roleplay/Roleplay.test.js +0 -30
  291. package/dist/Exercises/Roleplay/RoleplayGameOptions/RoleplayGame/RoleplayGame.js +0 -194
  292. package/dist/Exercises/Roleplay/RoleplayGameOptions/RoleplayGame/RoleplayGame.test.js +0 -23
  293. package/dist/Exercises/Roleplay/RoleplayGameOptions/RoleplayGame/package.json +0 -6
  294. package/dist/Exercises/Roleplay/RoleplayGameOptions/RoleplayGames.js +0 -61
  295. package/dist/Exercises/Roleplay/RoleplayGameOptions/RoleplayGames.test.js +0 -23
  296. package/dist/Exercises/Roleplay/RoleplayGameOptions/package.json +0 -6
  297. package/dist/Exercises/Roleplay/RoleplayInfo/RoleplayInfo.js +0 -153
  298. package/dist/Exercises/Roleplay/RoleplayInfo/RoleplayInfo.test.js +0 -23
  299. package/dist/Exercises/Roleplay/RoleplayInfo/package.json +0 -6
  300. package/dist/Exercises/Roleplay/package.json +0 -6
  301. package/dist/Exercises/Translator/Translator.js +0 -1031
  302. package/dist/Exercises/Translator/Translator.test.js +0 -29
  303. package/dist/Exercises/Translator/package.json +0 -6
  304. package/dist/Forms/AppContact/AppContact.js +0 -141
  305. package/dist/Forms/ChipInput/ChipInput.js +0 -74
  306. package/dist/Forms/ChipInput/package.json +0 -6
  307. package/dist/Forms/Contact/Contact.js +0 -363
  308. package/dist/Forms/CreateBot/CreateBot.js +0 -77
  309. package/dist/Forms/CreateBot/CreateBot.test.js +0 -20
  310. package/dist/Forms/CreateBot/Steps/BotInformation/BotInformation.js +0 -649
  311. package/dist/Forms/CreateBot/Steps/BotInformation/__mocks__/react-simplemde-editor.js +0 -8
  312. package/dist/Forms/CreateBot/Steps/BotInformation/package.json +0 -6
  313. package/dist/Forms/CreateBot/Steps/BotSettings/BotSettings.js +0 -199
  314. package/dist/Forms/CreateBot/Steps/BotSettings/package.json +0 -6
  315. package/dist/Forms/CreateBot/Steps/Confirmation/Confirmation.js +0 -237
  316. package/dist/Forms/CreateBot/Steps/Confirmation/package.json +0 -6
  317. package/dist/Forms/CreateBot/Steps/index.js +0 -4
  318. package/dist/Forms/CreateBot/package.json +0 -6
  319. package/dist/Forms/CreateClassroom/CreateClassroom.js +0 -53
  320. package/dist/Forms/CreateClassroom/CreateClassroom.test.js +0 -20
  321. package/dist/Forms/CreateClassroom/Steps/ClassroomInformation/ClassroomInformation.js +0 -168
  322. package/dist/Forms/CreateClassroom/Steps/ClassroomInformation/package.json +0 -6
  323. package/dist/Forms/CreateClassroom/Steps/ClassroomSettings/ClassroomSettings.js +0 -401
  324. package/dist/Forms/CreateClassroom/Steps/ClassroomSettings/package.json +0 -6
  325. package/dist/Forms/CreateClassroom/Steps/Confirmation/Confirmation.js +0 -117
  326. package/dist/Forms/CreateClassroom/Steps/Confirmation/package.json +0 -6
  327. package/dist/Forms/CreateClassroom/Steps/CourseSettings/CourseSettings.js +0 -340
  328. package/dist/Forms/CreateClassroom/Steps/CourseSettings/package.json +0 -6
  329. package/dist/Forms/CreateClassroom/Steps/Customization/Customization.js +0 -77
  330. package/dist/Forms/CreateClassroom/Steps/Customization/package.json +0 -6
  331. package/dist/Forms/CreateClassroom/Steps/index.js +0 -6
  332. package/dist/Forms/CreateClassroom/package.json +0 -6
  333. package/dist/Forms/CreateCourse/CreateCourse.js +0 -62
  334. package/dist/Forms/CreateCourse/CreateCourse.test.js +0 -20
  335. package/dist/Forms/CreateCourse/Steps/Confirmation/Confirmation.js +0 -117
  336. package/dist/Forms/CreateCourse/Steps/Confirmation/package.json +0 -6
  337. package/dist/Forms/CreateCourse/Steps/CourseInformation/CourseInformation.js +0 -194
  338. package/dist/Forms/CreateCourse/Steps/CourseInformation/package.json +0 -6
  339. package/dist/Forms/CreateCourse/Steps/CourseSettings/CourseSettings.js +0 -257
  340. package/dist/Forms/CreateCourse/Steps/CourseSettings/package.json +0 -6
  341. package/dist/Forms/CreateCourse/Steps/Customization/Customization.js +0 -77
  342. package/dist/Forms/CreateCourse/Steps/Customization/package.json +0 -6
  343. package/dist/Forms/CreateCourse/Steps/index.js +0 -5
  344. package/dist/Forms/CreateCourse/package.json +0 -6
  345. package/dist/Forms/CreateGroup/CreateGroup.js +0 -55
  346. package/dist/Forms/CreateGroup/CreateGroup.test.js +0 -20
  347. package/dist/Forms/CreateGroup/Steps/Confirmation/Confirmation.js +0 -172
  348. package/dist/Forms/CreateGroup/Steps/Confirmation/package.json +0 -6
  349. package/dist/Forms/CreateGroup/Steps/GroupInformation/GroupInformation.js +0 -130
  350. package/dist/Forms/CreateGroup/Steps/GroupInformation/package.json +0 -6
  351. package/dist/Forms/CreateGroup/Steps/GroupSettings/GroupSettings.js +0 -171
  352. package/dist/Forms/CreateGroup/Steps/GroupSettings/package.json +0 -6
  353. package/dist/Forms/CreateGroup/Steps/index.js +0 -4
  354. package/dist/Forms/CreateGroup/package.json +0 -6
  355. package/dist/Forms/CreateMeetingMultiStepForm/CreateMeetingMultiStepForm.js +0 -88
  356. package/dist/Forms/CreateMeetingMultiStepForm/GroupAssignment.js +0 -919
  357. package/dist/Forms/CreateMeetingMultiStepForm/MeetingForm.js +0 -501
  358. package/dist/Forms/CreateMeetingMultiStepForm/images/input1.js +0 -2
  359. package/dist/Forms/CreateMeetingMultiStepForm/images/input5.js +0 -2
  360. package/dist/Forms/CreateMeetingMultiStepForm/images/mode1.js +0 -2
  361. package/dist/Forms/CreateMeetingMultiStepForm/images/mode2.js +0 -2
  362. package/dist/Forms/CreateMeetingMultiStepForm/sampleTemplates.js +0 -44
  363. package/dist/Forms/CreateRoleplay/CreateRoleplay.js +0 -87
  364. package/dist/Forms/CreateRoleplay/CreateRoleplay.test.js +0 -20
  365. package/dist/Forms/CreateRoleplay/Steps/Confirmation/Confirmation.js +0 -166
  366. package/dist/Forms/CreateRoleplay/Steps/Confirmation/package.json +0 -6
  367. package/dist/Forms/CreateRoleplay/Steps/RoleplayInformation/RoleplayInformation.js +0 -501
  368. package/dist/Forms/CreateRoleplay/Steps/RoleplayInformation/package.json +0 -6
  369. package/dist/Forms/CreateRoleplay/Steps/RoleplaySettings/RoleplaySettings.js +0 -261
  370. package/dist/Forms/CreateRoleplay/Steps/RoleplaySettings/package.json +0 -6
  371. package/dist/Forms/CreateRoleplay/Steps/index.js +0 -4
  372. package/dist/Forms/CreateRoleplay/package.json +0 -6
  373. package/dist/Forms/CreateRoleplayHook/CreateRoleplayHook.js +0 -83
  374. package/dist/Forms/CreateRoleplayHook/CreateRoleplayHook.test.js +0 -20
  375. package/dist/Forms/CreateRoleplayHook/Steps/Confirmation/Confirmation.js +0 -174
  376. package/dist/Forms/CreateRoleplayHook/Steps/Confirmation/package.json +0 -6
  377. package/dist/Forms/CreateRoleplayHook/Steps/RoleplayInformation/RoleplayInformation.js +0 -487
  378. package/dist/Forms/CreateRoleplayHook/Steps/RoleplayInformation/package.json +0 -6
  379. package/dist/Forms/CreateRoleplayHook/Steps/RoleplaySettings/RoleplaySettings.js +0 -330
  380. package/dist/Forms/CreateRoleplayHook/Steps/RoleplaySettings/package.json +0 -6
  381. package/dist/Forms/CreateRoleplayHook/Steps/index.js +0 -4
  382. package/dist/Forms/CreateRoleplayHook/package.json +0 -6
  383. package/dist/Forms/CreateTopic/CreateTopic.js +0 -52
  384. package/dist/Forms/CreateTopic/CreateTopic.test.js +0 -20
  385. package/dist/Forms/CreateTopic/Steps/Confirmation/Confirmation.js +0 -111
  386. package/dist/Forms/CreateTopic/Steps/Confirmation/package.json +0 -6
  387. package/dist/Forms/CreateTopic/Steps/Customization/Customization.js +0 -77
  388. package/dist/Forms/CreateTopic/Steps/Customization/package.json +0 -6
  389. package/dist/Forms/CreateTopic/Steps/TopicInformation/TopicInformation.js +0 -190
  390. package/dist/Forms/CreateTopic/Steps/TopicInformation/package.json +0 -6
  391. package/dist/Forms/CreateTopic/Steps/TopicSettings/TopicSettings.js +0 -81
  392. package/dist/Forms/CreateTopic/Steps/TopicSettings/package.json +0 -6
  393. package/dist/Forms/CreateTopic/Steps/index.js +0 -4
  394. package/dist/Forms/CreateTopic/package.json +0 -6
  395. package/dist/Forms/CreateUser/CreateUser.js +0 -77
  396. package/dist/Forms/DiscussImageSelector/ImageSelector.js +0 -311
  397. package/dist/Forms/DiscussImageSelector/package.json +0 -6
  398. package/dist/Forms/DiscussMultiStepFormDialog/MultiStepFormDialog.js +0 -402
  399. package/dist/Forms/DiscussMultiStepFormDialog/package.json +0 -6
  400. package/dist/Forms/FeedbackForm/FeedbackForm.js +0 -1036
  401. package/dist/Forms/FeedbackInfo/FeedbackInfo.js +0 -233
  402. package/dist/Forms/ImageSelector/ImageSelector.js +0 -516
  403. package/dist/Forms/ImageSelector/package.json +0 -6
  404. package/dist/Forms/InputHelper/InputHelper.js +0 -277
  405. package/dist/Forms/InputHelper/package.json +0 -6
  406. package/dist/Forms/LanguageSelector/LanguageSelector.js +0 -49
  407. package/dist/Forms/LanguageSelector/LanguageSelector.test.js +0 -15
  408. package/dist/Forms/MarkdownEditor/MarkdownEditor.js +0 -72
  409. package/dist/Forms/MarkdownEditor/MarkdownEditor.test.js +0 -35
  410. package/dist/Forms/MarkdownEditor/package.json +0 -6
  411. package/dist/Forms/MultiStepForm/Debug.js +0 -38
  412. package/dist/Forms/MultiStepForm/MultiStepForm.js +0 -278
  413. package/dist/Forms/MultiStepForm/MultiStepForm.test.js +0 -20
  414. package/dist/Forms/MultiStepForm/package.json +0 -6
  415. package/dist/Forms/MultiStepFormDialog/MultiStepFormDialog.js +0 -354
  416. package/dist/Forms/MultiStepFormDialog/MultiStepFormDialog.test.js +0 -20
  417. package/dist/Forms/MultiStepFormDialog/package.json +0 -6
  418. package/dist/Forms/MultiStepFormHook/MultiStepFormHook.js +0 -279
  419. package/dist/Forms/PdfUploader/PdfUploader.js +0 -250
  420. package/dist/Forms/PdfUploader/package.json +0 -6
  421. package/dist/Forms/RecordingInfo/RecordingInfo.js +0 -140
  422. package/dist/Forms/Settings/Settings.js +0 -138
  423. package/dist/Forms/Settings/Tabs/Display/Display.js +0 -106
  424. package/dist/Forms/Settings/Tabs/Display/package.json +0 -6
  425. package/dist/Forms/Settings/Tabs/EmailNotifications/EmailNotifications.js +0 -108
  426. package/dist/Forms/Settings/Tabs/EmailNotifications/package.json +0 -6
  427. package/dist/Forms/Settings/Tabs/General/General.js +0 -534
  428. package/dist/Forms/Settings/Tabs/General/package.json +0 -6
  429. package/dist/Forms/Settings/Tabs/Subscription/Subscription.js +0 -259
  430. package/dist/Forms/Settings/Tabs/Subscription/package.json +0 -6
  431. package/dist/Forms/Settings/package.json +0 -6
  432. package/dist/Forms/SortBySelector/SortBySelector.js +0 -47
  433. package/dist/Forms/UpdateBot/UpdateBot.js +0 -234
  434. package/dist/Forms/UpdateBot/UpdateBot.test.js +0 -23
  435. package/dist/Forms/UpdateBot/package.json +0 -6
  436. package/dist/Forms/UpdateClassroom/UpdateClassroom.js +0 -368
  437. package/dist/Forms/UpdateClassroom/UpdateClassroom.test.js +0 -20
  438. package/dist/Forms/UpdateClassroom/package.json +0 -6
  439. package/dist/Forms/UpdateCourse/UpdateCourse.js +0 -260
  440. package/dist/Forms/UpdateCourse/UpdateCourse.test.js +0 -20
  441. package/dist/Forms/UpdateCourse/package.json +0 -6
  442. package/dist/Forms/UpdateGroup/UpdateGroup.js +0 -185
  443. package/dist/Forms/UpdateGroup/UpdateGroup.test.js +0 -25
  444. package/dist/Forms/UpdateGroup/package.json +0 -6
  445. package/dist/Forms/UpdatePhraseList/UpdatePhraseList.js +0 -529
  446. package/dist/Forms/UpdateRoleplay/UpdateRoleplay.js +0 -238
  447. package/dist/Forms/UpdateRoleplay/UpdateRoleplay.test.js +0 -20
  448. package/dist/Forms/UpdateRoleplay/package.json +0 -6
  449. package/dist/Forms/UpdateTopic/UpdateTopic.js +0 -248
  450. package/dist/Forms/UpdateTopic/UpdateTopic.test.js +0 -20
  451. package/dist/Forms/UpdateTopic/package.json +0 -6
  452. package/dist/Forms/VideoUploader/VideoUploader.js +0 -197
  453. package/dist/Forms/VideoUploader/package.json +0 -6
  454. package/dist/Forms/VoiceSelector/VoiceSelector.js +0 -343
  455. package/dist/Forms/VoiceSelector/VoiceSelector.test.js +0 -15
  456. package/dist/Forms/VoiceSelector/package.json +0 -6
  457. package/dist/Lists/Avatars/Avatars.js +0 -67
  458. package/dist/Lists/Bots/Bots.js +0 -208
  459. package/dist/Lists/Bots/Bots.test.js +0 -24
  460. package/dist/Lists/Bots/package.json +0 -6
  461. package/dist/Lists/Categories/Categories.js +0 -93
  462. package/dist/Lists/Categories/Categories.test.js +0 -22
  463. package/dist/Lists/Categories/package.json +0 -6
  464. package/dist/Lists/Categories/sample.png +0 -0
  465. package/dist/Lists/Classrooms/Classrooms.js +0 -117
  466. package/dist/Lists/Classrooms/Classrooms.test.js +0 -30
  467. package/dist/Lists/Classrooms/package.json +0 -6
  468. package/dist/Lists/CourseOutline/CourseOutline.js +0 -1365
  469. package/dist/Lists/CourseOutline/CourseOutline.test.js +0 -23
  470. package/dist/Lists/CourseOutline/package.json +0 -6
  471. package/dist/Lists/CourseSelection/CourseSelection.js +0 -166
  472. package/dist/Lists/Courses/Courses.js +0 -184
  473. package/dist/Lists/Courses/Courses.test.js +0 -30
  474. package/dist/Lists/Courses/package.json +0 -6
  475. package/dist/Lists/ExerciseSelection/ExerciseSelection.js +0 -523
  476. package/dist/Lists/Exercises/Exercises.js +0 -1539
  477. package/dist/Lists/Exercises/Exercises.test.js +0 -29
  478. package/dist/Lists/Exercises/package.json +0 -6
  479. package/dist/Lists/Leaderboard/Leaderboard.js +0 -405
  480. package/dist/Lists/Leaderboard/package.json +0 -6
  481. package/dist/Lists/ListElements/index.js +0 -35
  482. package/dist/Lists/Members/Members.js +0 -433
  483. package/dist/Lists/Members/Members.test.js +0 -20
  484. package/dist/Lists/Members/package.json +0 -6
  485. package/dist/Lists/ParseScriptErrors/ParseScriptErrors.js +0 -29
  486. package/dist/Lists/PhraseListSelection/PhraseListSelection.js +0 -238
  487. package/dist/Lists/Phrases/Phrases.js +0 -717
  488. package/dist/Lists/Phrases/Phrases.test.js +0 -28
  489. package/dist/Lists/Phrases/package.json +0 -6
  490. package/dist/Lists/RoleplaySelection/RoleplaySelection.js +0 -192
  491. package/dist/Lists/Roleplays/Roleplays.js +0 -218
  492. package/dist/Lists/Roleplays/Roleplays.test.js +0 -24
  493. package/dist/Lists/Roleplays/package.json +0 -6
  494. package/dist/Lists/Sections/Sections.js +0 -238
  495. package/dist/Lists/Sections/Sections.test.js +0 -20
  496. package/dist/Lists/Sections/package.json +0 -6
  497. package/dist/Lists/SubscriptionPlans/SubscriptionPlans.js +0 -49
  498. package/dist/Lists/SubscriptionPlans/SubscriptionPlans.test.js +0 -20
  499. package/dist/Lists/SubscriptionPlans/package.json +0 -6
  500. package/dist/Lists/Timeline/EventItem.js +0 -154
  501. package/dist/Lists/Timeline/EventList.js +0 -34
  502. package/dist/Lists/Timeline/TimelineLoaded.js +0 -65
  503. package/dist/Lists/Timeline/groupByDay.js +0 -24
  504. package/dist/Lists/TopicPreview/TopicPreview.js +0 -454
  505. package/dist/Lists/TopicPreview/package.json +0 -6
  506. package/dist/Lists/Topics/Topics.js +0 -128
  507. package/dist/Lists/Topics/Topics.test.js +0 -21
  508. package/dist/Lists/Topics/package.json +0 -6
  509. package/dist/Lists/Voices/Voices.js +0 -257
  510. package/dist/Lists/Voices/Voices.test.js +0 -15
  511. package/dist/Lists/Voices/horse.ogm +0 -0
  512. package/dist/Lists/Voices/package.json +0 -6
  513. package/dist/Live/Game/Game.js +0 -678
  514. package/dist/Live/Game/package.json +0 -6
  515. package/dist/Live/GameControls/GameControls.js +0 -69
  516. package/dist/Live/GameControls/package.json +0 -6
  517. package/dist/Live/GameMembers/GameMembers.js +0 -185
  518. package/dist/Live/GameMembers/package.json +0 -6
  519. package/dist/Live/GameQuestionResults/GameQuestionResults.js +0 -96
  520. package/dist/Live/GameQuestionResults/package.json +0 -6
  521. package/dist/Live/GameSettings/GameSettings.js +0 -248
  522. package/dist/Live/GameSettings/package.json +0 -6
  523. package/dist/Live/HowToJoin/HowToJoin.js +0 -120
  524. package/dist/Live/HowToJoin/package.json +0 -6
  525. package/dist/Live/LiveListener/LiveListener.js +0 -606
  526. package/dist/Live/LiveListener/package.json +0 -6
  527. package/dist/Live/LiveMeaning/LiveMeaning.js +0 -392
  528. package/dist/Live/LiveMeaningReadWrite/LiveMeaningReadWrite.js +0 -393
  529. package/dist/Live/LiveRoleplay/LiveStory/LiveStory.js +0 -260
  530. package/dist/Live/LiveRoleplay/LiveStory/package.json +0 -6
  531. package/dist/Live/LiveTranslator/LiveTranslator.js +0 -735
  532. package/dist/Live/Misc/FinalScoreDrawer/FinalScoreDrawer.js +0 -244
  533. package/dist/Live/Misc/FinalScoreDrawer/package.json +0 -6
  534. package/dist/Live/Misc/StudentAnswerDrawer/StudentAnswerDrawer.js +0 -146
  535. package/dist/Live/Misc/StudentAnswerDrawer/package.json +0 -6
  536. package/dist/Live/WaitingRoom/WaitingRoom.js +0 -422
  537. package/dist/Live/WaitingRoom/package.json +0 -6
  538. package/dist/Misc/AiExperienceIcon/AiExperienceIcon.js +0 -128
  539. package/dist/Misc/AnswerResult/AnswerResult.js +0 -620
  540. package/dist/Misc/AnswerResult/package.json +0 -6
  541. package/dist/Misc/AvatarSelector/AvatarSelector.js +0 -183
  542. package/dist/Misc/AvatarSwitcher/AvatarSwitcher.js +0 -57
  543. package/dist/Misc/AxiosRestExample/AxiosRestExample.js +0 -46
  544. package/dist/Misc/AxiosRestExample/AxiosRestPostExample.js +0 -65
  545. package/dist/Misc/CSVUploader/CSVUploader.js +0 -153
  546. package/dist/Misc/CSVUploader/package.json +0 -6
  547. package/dist/Misc/ChatBubble/ChatBubble.js +0 -71
  548. package/dist/Misc/ColorLinearProgress/ColorLinearProgress.js +0 -28
  549. package/dist/Misc/ColorLinearProgress/package.json +0 -6
  550. package/dist/Misc/ColorSelector/ColorSelector.js +0 -143
  551. package/dist/Misc/ColorSelector/package.json +0 -6
  552. package/dist/Misc/CustomChipInput/CustomChipInput.js +0 -391
  553. package/dist/Misc/CustomChipInput/package.json +0 -6
  554. package/dist/Misc/DefaultColourButton/DefaultColourButton.js +0 -39
  555. package/dist/Misc/DefaultColourButton/package.json +0 -6
  556. package/dist/Misc/DiscussionTopicSelector/TopicSelector.js +0 -191
  557. package/dist/Misc/DiscussionTopicSelector/package.json +0 -6
  558. package/dist/Misc/DragAndDropPreview/DragAndDropPreview.js +0 -40
  559. package/dist/Misc/DragAndDropPreview/package.json +0 -6
  560. package/dist/Misc/EmojiInput/EmojiInput.js +0 -83
  561. package/dist/Misc/EmojiInput/css/emoji-mart.css +0 -497
  562. package/dist/Misc/ExerciseBottomBar/ExerciseBottomBar.js +0 -95
  563. package/dist/Misc/ExerciseBottomBar/package.json +0 -6
  564. package/dist/Misc/ExerciseProgressBar/ExerciseProgressBar.js +0 -56
  565. package/dist/Misc/ExerciseProgressBar/package.json +0 -6
  566. package/dist/Misc/FabContainer/FabContainer.js +0 -42
  567. package/dist/Misc/FabContainer/package.json +0 -6
  568. package/dist/Misc/HideOnScroll/HideOnScroll.js +0 -27
  569. package/dist/Misc/HideOnScroll/package.json +0 -6
  570. package/dist/Misc/HoverText/HoverText.js +0 -303
  571. package/dist/Misc/HtmlTooltipComponent/HtmlTooltipComponent.js +0 -69
  572. package/dist/Misc/HtmlTooltipComponent/package.json +0 -6
  573. package/dist/Misc/ImageLibrary/ImageLibrary.js +0 -311
  574. package/dist/Misc/ImagePreview/ImagePreview.js +0 -43
  575. package/dist/Misc/InfiniteScroll/InfiniteScroll.js +0 -37
  576. package/dist/Misc/InfiniteScroll/package.json +0 -6
  577. package/dist/Misc/LanguageSelector/LanguageSelector.js +0 -163
  578. package/dist/Misc/LanguageSelector/package.json +0 -6
  579. package/dist/Misc/MedalSelector/BronzeMedal.js +0 -1362
  580. package/dist/Misc/MedalSelector/GoldMedal.js +0 -1322
  581. package/dist/Misc/MedalSelector/MedalSelector.js +0 -55
  582. package/dist/Misc/MedalSelector/SilverMedal.js +0 -1862
  583. package/dist/Misc/MedalSelector/styles.css +0 -24
  584. package/dist/Misc/NotFound/Bot.js +0 -62
  585. package/dist/Misc/NotFound/Bots.js +0 -75
  586. package/dist/Misc/NotFound/ClassCourses.js +0 -198
  587. package/dist/Misc/NotFound/Classroom.js +0 -61
  588. package/dist/Misc/NotFound/Classrooms.js +0 -93
  589. package/dist/Misc/NotFound/Course.js +0 -62
  590. package/dist/Misc/NotFound/Courses.js +0 -111
  591. package/dist/Misc/NotFound/Discussions.js +0 -52
  592. package/dist/Misc/NotFound/Members.js +0 -48
  593. package/dist/Misc/NotFound/Roleplay.js +0 -62
  594. package/dist/Misc/NotFound/Roleplays.js +0 -75
  595. package/dist/Misc/NotFound/Script.js +0 -47
  596. package/dist/Misc/NotFound/Sections.js +0 -63
  597. package/dist/Misc/NotFound/Topic.js +0 -62
  598. package/dist/Misc/Notes/Notes.js +0 -77
  599. package/dist/Misc/Notes/Notes.test.js +0 -20
  600. package/dist/Misc/Notes/package.json +0 -6
  601. package/dist/Misc/NualaCreating/Nuala1.js +0 -352
  602. package/dist/Misc/NualaCreating/Nuala2.js +0 -455
  603. package/dist/Misc/NualaCreating/Nuala3.js +0 -462
  604. package/dist/Misc/NualaCreating/NualaCreating.js +0 -23
  605. package/dist/Misc/NualaCreating/styles.css +0 -68
  606. package/dist/Misc/NualangVerifiedIcon/NualangVerifiedIcon.js +0 -19
  607. package/dist/Misc/OnboardingEnrolment/CheckIfCourse.js +0 -33
  608. package/dist/Misc/OnboardingEnrolment/ClassCodeInvalid.js +0 -14
  609. package/dist/Misc/OnboardingEnrolment/ClassroomCodeInvalid.js +0 -14
  610. package/dist/Misc/OnboardingEnrolment/EnrolKey.js +0 -14
  611. package/dist/Misc/Overlay/Overlay.js +0 -59
  612. package/dist/Misc/Overlay/package.json +0 -6
  613. package/dist/Misc/PhraseDisplay/PhraseDisplay.js +0 -123
  614. package/dist/Misc/ProgressiveCardMedia/ProgressiveCardMedia.js +0 -38
  615. package/dist/Misc/ProgressiveCardMedia/package.json +0 -6
  616. package/dist/Misc/PronunciationScore/PronunciationScore.js +0 -92
  617. package/dist/Misc/PronunciationScore/package.json +0 -6
  618. package/dist/Misc/Recorder/Recorder.js +0 -151
  619. package/dist/Misc/Recorder/package.json +0 -6
  620. package/dist/Misc/ReportProblem/ReportProblem.js +0 -64
  621. package/dist/Misc/ReportProblem/package.json +0 -6
  622. package/dist/Misc/RoleplayChatWaveForm/RoleplayChatWaveForm.js +0 -199
  623. package/dist/Misc/RoleplayChatWaveForm/package.json +0 -6
  624. package/dist/Misc/RoleplayWaveform/RoleplayWaveform.js +0 -95
  625. package/dist/Misc/RoleplayWaveform/package.json +0 -6
  626. package/dist/Misc/RubyText/RubyText.js +0 -27
  627. package/dist/Misc/ShareButton/ShareButton.js +0 -69
  628. package/dist/Misc/ShareButton/ShareDrawer.js +0 -241
  629. package/dist/Misc/ShareButton/package.json +0 -6
  630. package/dist/Misc/SignOut/SignOut.js +0 -132
  631. package/dist/Misc/SignOut/package.json +0 -6
  632. package/dist/Misc/SiteLanguageSelector/SiteLanguageSelector.js +0 -107
  633. package/dist/Misc/SiteLanguageSelector/package.json +0 -6
  634. package/dist/Misc/Snackbar/Snackbar.js +0 -98
  635. package/dist/Misc/Snackbar/package.json +0 -6
  636. package/dist/Misc/SpeedDial/SpeedDial.js +0 -49
  637. package/dist/Misc/SpeedDial/package.json +0 -6
  638. package/dist/Misc/StudentWaitingMessage/StudentWaitingMessage.js +0 -38
  639. package/dist/Misc/SubmitTextField/SubmitTextField.js +0 -48
  640. package/dist/Misc/Testimonials/Testimonials.js +0 -82
  641. package/dist/Misc/Testimonials/package.json +0 -6
  642. package/dist/Misc/ThemeToggle/ThemeToggle.js +0 -39
  643. package/dist/Misc/ThemeToggle/package.json +0 -6
  644. package/dist/Misc/VoiceSpeed/VoiceSpeed.js +0 -68
  645. package/dist/Misc/VoiceSpeed/package.json +0 -6
  646. package/dist/Misc/WaveFormLite/WaveFormLite.js +0 -138
  647. package/dist/Misc/WaveFormLite/package.json +0 -6
  648. package/dist/Misc/Waveform/Waveform.js +0 -93
  649. package/dist/Misc/Waveform/package.json +0 -6
  650. package/dist/Misc/WhatsNew/WhatsNew.js +0 -105
  651. package/dist/Misc/WhatsNew/package.json +0 -6
  652. package/dist/Misc/WhatsNew/whatsnew.md +0 -41
  653. package/dist/Navigation/BottomBar/BottomBar.js +0 -72
  654. package/dist/Navigation/Breadcrumbs/Breadcrumbs.js +0 -113
  655. package/dist/Navigation/Breadcrumbs/Breadcrumbs.test.js +0 -24
  656. package/dist/Navigation/Breadcrumbs/package.json +0 -6
  657. package/dist/Navigation/Header/Header.js +0 -90
  658. package/dist/Navigation/Header/Header.test.js +0 -20
  659. package/dist/Navigation/Header/package.json +0 -6
  660. package/dist/Navigation/ResponsiveDrawer/ResponsiveDrawer.js +0 -532
  661. package/dist/Navigation/ResponsiveDrawer/ResponsiveDrawer.test.js +0 -23
  662. package/dist/Navigation/ResponsiveDrawer/package.json +0 -6
  663. package/dist/Navigation/ResponsiveStepper/ResponsiveStepper.js +0 -253
  664. package/dist/Navigation/ResponsiveStepper/ResponsiveStepper.test.js +0 -20
  665. package/dist/Navigation/ResponsiveStepper/package.json +0 -6
  666. package/dist/Navigation/ResponsiveTabs/ResponsiveTabs.js +0 -379
  667. package/dist/Navigation/ResponsiveTabs/TabContainer.js +0 -28
  668. package/dist/Navigation/ResponsiveTabs/package.json +0 -6
  669. package/dist/Navigation/_nav.js +0 -164
  670. package/dist/Payments/FreeTrial/FreeTrial.js +0 -106
  671. package/dist/Payments/FreeTrial/package.json +0 -6
  672. package/dist/Tables/Attempt/Attempt.js +0 -322
  673. package/dist/Tables/BotRows/BotRows.js +0 -132
  674. package/dist/Tables/BotRows/package.json +0 -6
  675. package/dist/Tables/Bots/Bots.js +0 -280
  676. package/dist/Tables/Bots/package.json +0 -6
  677. package/dist/Tables/Chart/Chart.js +0 -54
  678. package/dist/Tables/Chart/package.json +0 -5
  679. package/dist/Tables/ClassroomRows/ClassroomRows.js +0 -152
  680. package/dist/Tables/ClassroomRows/package.json +0 -6
  681. package/dist/Tables/Classrooms/Classrooms.js +0 -282
  682. package/dist/Tables/Classrooms/package.json +0 -6
  683. package/dist/Tables/CourseRows/CourseRows.js +0 -185
  684. package/dist/Tables/CourseRows/package.json +0 -6
  685. package/dist/Tables/Courses/Courses.js +0 -287
  686. package/dist/Tables/Courses/Courses.test.js +0 -29
  687. package/dist/Tables/Courses/package.json +0 -6
  688. package/dist/Tables/CreatedDiscussionsTable/CreatedDiscussionsTable.js +0 -188
  689. package/dist/Tables/GameRows/GameRows.js +0 -87
  690. package/dist/Tables/GameRows/package.json +0 -6
  691. package/dist/Tables/Games/Games.js +0 -258
  692. package/dist/Tables/Games/package.json +0 -6
  693. package/dist/Tables/MeetingPrompstList/MeetingPromptsList.js +0 -565
  694. package/dist/Tables/Phrases/Phrases.js +0 -200
  695. package/dist/Tables/Phrases/Phrases.test.js +0 -20
  696. package/dist/Tables/Phrases/package.json +0 -6
  697. package/dist/Tables/Plans/Plans.js +0 -74
  698. package/dist/Tables/Plans/plans.json +0 -162
  699. package/dist/Tables/Plans/plans2.json +0 -151
  700. package/dist/Tables/Progress/Header.js +0 -559
  701. package/dist/Tables/Progress/Progress.js +0 -502
  702. package/dist/Tables/Progress/ProgressList.js +0 -905
  703. package/dist/Tables/Progress/ProgressList.test.js +0 -48
  704. package/dist/Tables/Progress/ProgressTable.js +0 -882
  705. package/dist/Tables/Progress/ProgressTable.test.js +0 -258
  706. package/dist/Tables/Progress/ProgressTableRow.js +0 -295
  707. package/dist/Tables/Progress/README.md +0 -53
  708. package/dist/Tables/Progress/SelectMembers.js +0 -64
  709. package/dist/Tables/Progress/TableToolbar.js +0 -134
  710. package/dist/Tables/Progress/TableToolbar.test.js +0 -69
  711. package/dist/Tables/Progress/cells/index.js +0 -523
  712. package/dist/Tables/Progress/cells/index.test.js +0 -334
  713. package/dist/Tables/Progress/constants.js +0 -10
  714. package/dist/Tables/Progress/exportToExcel.js +0 -224
  715. package/dist/Tables/Progress/exportToExcel.test.js +0 -135
  716. package/dist/Tables/Progress/helpers.js +0 -42
  717. package/dist/Tables/Progress/helpers.test.js +0 -23
  718. package/dist/Tables/Progress/package.json +0 -6
  719. package/dist/Tables/Progress/sorting.js +0 -78
  720. package/dist/Tables/Progress/sorting.test.js +0 -69
  721. package/dist/Tables/Progress/styledComponents.js +0 -156
  722. package/dist/Tables/Progress/useProgressUrlParams.js +0 -162
  723. package/dist/Tables/Progress/useProgressUrlParams.test.js +0 -183
  724. package/dist/Tables/Progress/utils.js +0 -214
  725. package/dist/Tables/Progress/utils.test.js +0 -129
  726. package/dist/Tables/Progress/viewState.js +0 -27
  727. package/dist/Tables/RecordingListCards/RecordingListCards.js +0 -192
  728. package/dist/Tables/RoleplayRows/RoleplayRows.js +0 -129
  729. package/dist/Tables/RoleplayRows/package.json +0 -6
  730. package/dist/Tables/Roleplays/Roleplays.js +0 -280
  731. package/dist/Tables/Roleplays/package.json +0 -6
  732. package/dist/Tables/ScheduleListCards/ScheduleListCards.js +0 -92
  733. package/dist/Tables/SubmissionsTableCards/SubmissionsTableCards.js +0 -296
  734. package/dist/Tables/TrialUsers/TrialUsers.js +0 -155
  735. package/dist/Tables/Unanswered/Unanswered.js +0 -97
  736. package/dist/Tables/User/UserTable.js +0 -139
  737. package/dist/Tables/Users/UsersTable.js +0 -159
  738. package/dist/config.js +0 -413
  739. package/dist/hooks/handleBotVarsDownload.js +0 -40
  740. package/dist/hooks/handleScriptDownload.js +0 -93
  741. package/dist/hooks/useClassroomState.js +0 -55
  742. package/dist/hooks/useClassroomStateOld.js +0 -81
  743. package/dist/hooks/useConfirm.js +0 -19
  744. package/dist/hooks/useCourseState.js +0 -62
  745. package/dist/hooks/useCourseStateOld.js +0 -89
  746. package/dist/hooks/useDebounce.js +0 -20
  747. package/dist/hooks/useExerciseDocumentTitle.js +0 -15
  748. package/dist/hooks/useExerciseState.js +0 -2039
  749. package/dist/hooks/useLanguageTokens.js +0 -73
  750. package/dist/hooks/useListScroll.js +0 -19
  751. package/dist/hooks/usePhonetics.js +0 -64
  752. package/dist/hooks/usePhraseNameDialog.js +0 -10
  753. package/dist/hooks/useProgressiveImg.js +0 -21
  754. package/dist/hooks/useRecognition.js +0 -455
  755. package/dist/hooks/useSpreadsheetState.js +0 -87
  756. package/dist/hooks/useUrlQueryParam.js +0 -27
  757. package/dist/hooks/useWordBankFocus.js +0 -80
  758. package/dist/icons/AccountBalanceOff.js +0 -5
  759. package/dist/icons/KeyBoardOffDark.js +0 -22
  760. package/dist/icons/KeyBoardOffLight.js +0 -22
  761. package/dist/img/0-nuala-001.svg +0 -34
  762. package/dist/img/1-teacher-001.svg +0 -38
  763. package/dist/img/AudioNuala.svg +0 -165
  764. package/dist/img/Bronze Medal.svg +0 -545
  765. package/dist/img/Bronze.svg +0 -349
  766. package/dist/img/BronzeBadge.svg +0 -493
  767. package/dist/img/BronzeBadgeWithoutRibbon.svg +0 -317
  768. package/dist/img/Frame 51.svg +0 -98
  769. package/dist/img/Frame 52.svg +0 -131
  770. package/dist/img/Frame 53.svg +0 -139
  771. package/dist/img/Gold Badge.svg +0 -362
  772. package/dist/img/Gold Medal.svg +0 -481
  773. package/dist/img/GoldBadge.svg +0 -470
  774. package/dist/img/GoldBadgeWithoutRibbon.svg +0 -324
  775. package/dist/img/NewText.svg +0 -5
  776. package/dist/img/NualaCreateImage.svg +0 -129
  777. package/dist/img/NualaHeadphonesBackground.svg +0 -39
  778. package/dist/img/NualangLiveAnswerQuickly.svg +0 -103
  779. package/dist/img/NualangLiveAnwerQuicklyListening.svg +0 -3608
  780. package/dist/img/NualangLiveListen.png +0 -0
  781. package/dist/img/NualangLiveListen.svg +0 -42
  782. package/dist/img/NualangLiveListenQuickly.png +0 -0
  783. package/dist/img/NualangLiveListenToPhrase.svg +0 -4286
  784. package/dist/img/NualangLivePickAnswer.svg +0 -134
  785. package/dist/img/NualangLiveResult.png +0 -0
  786. package/dist/img/NualangLiveResult.svg +0 -1235
  787. package/dist/img/NualangLiveRoleplayAnswer.png +0 -0
  788. package/dist/img/NualangLiveRoleplayAnswer.svg +0 -334
  789. package/dist/img/NualangLiveRoleplayConvo.png +0 -0
  790. package/dist/img/NualangLiveRoleplayConvo.svg +0 -282
  791. package/dist/img/NualangLiveSeePlace.svg +0 -134
  792. package/dist/img/NualangLiveTranslate.png +0 -0
  793. package/dist/img/NualangLiveTranslate.svg +0 -54
  794. package/dist/img/NualangLiveTranslateQuickly.png +0 -0
  795. package/dist/img/NualangLiveTranslateQuickly.svg +0 -197
  796. package/dist/img/NualangLiveViewConversations.svg +0 -135
  797. package/dist/img/Polly.svg +0 -18
  798. package/dist/img/Silver Badge.svg +0 -523
  799. package/dist/img/Silver Medal.svg +0 -549
  800. package/dist/img/SilverBadge.svg +0 -655
  801. package/dist/img/SilverBadgeWithoutRibbon.svg +0 -491
  802. package/dist/img/aaron-square.jpg +0 -0
  803. package/dist/img/aaronAvatar.png +0 -0
  804. package/dist/img/add-file.svg +0 -1
  805. package/dist/img/avatars/0-nuala-001.svg +0 -34
  806. package/dist/img/avatars/0-nuala-002.svg +0 -25
  807. package/dist/img/avatars/0-nuala-003.svg +0 -27
  808. package/dist/img/avatars/0-nuala-004.svg +0 -41
  809. package/dist/img/avatars/0-nuala-005.svg +0 -33
  810. package/dist/img/avatars/0-nuala-006.svg +0 -32
  811. package/dist/img/avatars/0-nuala-007.svg +0 -37
  812. package/dist/img/avatars/0-nuala-008.svg +0 -21
  813. package/dist/img/avatars/0-nuala-009.svg +0 -21
  814. package/dist/img/avatars/0-nuala-010.svg +0 -39
  815. package/dist/img/avatars/0-nuala-011.svg +0 -33
  816. package/dist/img/avatars/0-nuala-012.svg +0 -43
  817. package/dist/img/avatars/0-nuala-013.svg +0 -36
  818. package/dist/img/avatars/0-nuala-014.svg +0 -30
  819. package/dist/img/avatars/0-nuala-015.svg +0 -28
  820. package/dist/img/avatars/0-nuala-016.svg +0 -24
  821. package/dist/img/avatars/0-nuala-017.svg +0 -31
  822. package/dist/img/avatars/0-nuala-018.svg +0 -29
  823. package/dist/img/avatars/0-nuala-019.svg +0 -57
  824. package/dist/img/avatars/0-nuala-020.svg +0 -30
  825. package/dist/img/avatars/0-nuala-021.svg +0 -28
  826. package/dist/img/avatars/001-man.svg +0 -104
  827. package/dist/img/avatars/002-girl.svg +0 -92
  828. package/dist/img/avatars/006-woman-1.svg +0 -99
  829. package/dist/img/avatars/028-woman-7.svg +0 -95
  830. package/dist/img/avatars/029-man-8.svg +0 -95
  831. package/dist/img/avatars/035-woman-9.svg +0 -86
  832. package/dist/img/avatars/066-boy-6.svg +0 -91
  833. package/dist/img/avatars/1-teacher-001.svg +0 -38
  834. package/dist/img/avatars/1-teacher-002.svg +0 -52
  835. package/dist/img/avatars/1-teacher-003.svg +0 -86
  836. package/dist/img/avatars/avatar1.png +0 -0
  837. package/dist/img/avatars/avatar2.png +0 -0
  838. package/dist/img/avatars/nuala_10_celebrating.svg +0 -44
  839. package/dist/img/avatars/nuala_10_speaking.svg +0 -45
  840. package/dist/img/avatars/nuala_11_celebrating.svg +0 -38
  841. package/dist/img/avatars/nuala_11_speaking.svg +0 -41
  842. package/dist/img/avatars/nuala_12_celebrating.svg +0 -48
  843. package/dist/img/avatars/nuala_12_speaking.svg +0 -49
  844. package/dist/img/avatars/nuala_13_celebrating.svg +0 -41
  845. package/dist/img/avatars/nuala_13_speaking.svg +0 -44
  846. package/dist/img/avatars/nuala_14_celebrating.svg +0 -35
  847. package/dist/img/avatars/nuala_14_speaking.svg +0 -36
  848. package/dist/img/avatars/nuala_15_celebrating.svg +0 -33
  849. package/dist/img/avatars/nuala_15_speaking.svg +0 -36
  850. package/dist/img/avatars/nuala_16_celebrating.svg +0 -29
  851. package/dist/img/avatars/nuala_16_speaking.svg +0 -32
  852. package/dist/img/avatars/nuala_17_celebrating.svg +0 -36
  853. package/dist/img/avatars/nuala_17_speaking.svg +0 -39
  854. package/dist/img/avatars/nuala_18_celebrating.svg +0 -34
  855. package/dist/img/avatars/nuala_18_speaking.svg +0 -37
  856. package/dist/img/avatars/nuala_19_celebrating.svg +0 -62
  857. package/dist/img/avatars/nuala_19_speaking.svg +0 -65
  858. package/dist/img/avatars/nuala_1_celebrating.svg +0 -30
  859. package/dist/img/avatars/nuala_1_speaking.svg +0 -37
  860. package/dist/img/avatars/nuala_20_celebrating.svg +0 -35
  861. package/dist/img/avatars/nuala_20_speaking.svg +0 -38
  862. package/dist/img/avatars/nuala_21_celebrating.svg +0 -33
  863. package/dist/img/avatars/nuala_21_speaking.svg +0 -36
  864. package/dist/img/avatars/nuala_2_celebrating.svg +0 -21
  865. package/dist/img/avatars/nuala_2_speaking.svg +0 -29
  866. package/dist/img/avatars/nuala_3_celebrating.svg +0 -20
  867. package/dist/img/avatars/nuala_3_speaking.svg +0 -28
  868. package/dist/img/avatars/nuala_4_celebrating.svg +0 -33
  869. package/dist/img/avatars/nuala_4_speaking.svg +0 -41
  870. package/dist/img/avatars/nuala_5_celebrating.svg +0 -30
  871. package/dist/img/avatars/nuala_5_speaking.svg +0 -36
  872. package/dist/img/avatars/nuala_6_celebrating.svg +0 -37
  873. package/dist/img/avatars/nuala_6_speaking.svg +0 -36
  874. package/dist/img/avatars/nuala_7_celebrating.svg +0 -42
  875. package/dist/img/avatars/nuala_7_speaking.svg +0 -43
  876. package/dist/img/avatars/nuala_8_celebrating.svg +0 -26
  877. package/dist/img/avatars/nuala_8_speaking.svg +0 -29
  878. package/dist/img/avatars/nuala_9_celebrating.svg +0 -26
  879. package/dist/img/avatars/nuala_9_speaking.svg +0 -27
  880. package/dist/img/aws.svg +0 -6
  881. package/dist/img/azure.svg +0 -10
  882. package/dist/img/bot-error.svg +0 -28
  883. package/dist/img/bot_nuala.svg +0 -45
  884. package/dist/img/classroom.svg +0 -178
  885. package/dist/img/connorAvatar.png +0 -0
  886. package/dist/img/course.svg +0 -113
  887. package/dist/img/dashboard.svg +0 -104
  888. package/dist/img/defaultImg.png +0 -0
  889. package/dist/img/google-classroom.svg +0 -1
  890. package/dist/img/jamieAvatar.png +0 -0
  891. package/dist/img/nuala_1_celebrating.svg +0 -33
  892. package/dist/img/nuala_2_celebrating.svg +0 -20
  893. package/dist/img/nuala_3_celebrating.svg +0 -21
  894. package/dist/img/nuala_4_celebrating.svg +0 -30
  895. package/dist/img/nuala_5_celebrating.svg +0 -30
  896. package/dist/img/nuala_celebrating.svg +0 -39
  897. package/dist/img/nuala_sign_in.svg +0 -62
  898. package/dist/img/nuala_speaking.svg +0 -41
  899. package/dist/img/nuala_speaking_2.svg +0 -41
  900. package/dist/img/nuala_speaking_3.svg +0 -41
  901. package/dist/img/nuala_speaking_4.svg +0 -41
  902. package/dist/img/nualang-logo-primary.svg +0 -17
  903. package/dist/img/nualangSquareIcon.svg +0 -18
  904. package/dist/img/nualas.svg +0 -185
  905. package/dist/img/photos.svg +0 -1
  906. package/dist/img/sentiment_dissatisfied_24px.svg +0 -3
  907. package/dist/img/sentiment_satisfied_24px.svg +0 -3
  908. package/dist/img/sentiment_very_satisfied_24px.svg +0 -3
  909. package/dist/img/soundWave.png +0 -0
  910. package/dist/img/stars1.svg +0 -44
  911. package/dist/img/stars2.svg +0 -30
  912. package/dist/img/stephenAvatar.png +0 -0
  913. package/dist/img/structuring.svg +0 -76
  914. package/dist/img/teacher-create-2.svg +0 -81
  915. package/dist/img/teacher-create.svg +0 -49
  916. package/dist/img/teacher-world.svg +0 -271
  917. package/dist/img/teacher.svg +0 -89
  918. package/dist/img/work-chat.svg +0 -1
  919. package/dist/img/world.svg +0 -41
  920. package/dist/index.js +0 -4
  921. package/dist/logger.js +0 -6
  922. package/dist/theme/colors/primary.js +0 -17
  923. package/dist/theme/colors/secondary.js +0 -17
  924. package/dist/theme/getComponents.js +0 -234
  925. package/dist/theme/index.js +0 -82
  926. package/dist/utils/Styles.js +0 -59
  927. package/dist/utils/canvasUtils.js +0 -55
  928. package/dist/utils/constants.js +0 -32
  929. package/dist/utils/currency-code-map.json +0 -1460
  930. package/dist/utils/dragAndDrop/dragAndDrop.js +0 -222
  931. package/dist/utils/index.js +0 -641
  932. package/dist/utils/japaneseTokenizer.js +0 -91
  933. package/dist/utils/languageHelpers.js +0 -41
  934. package/dist/utils/placeholder-images/index.js +0 -13
  935. package/dist/utils/voiceImages.js +0 -16
@@ -1,2039 +0,0 @@
1
- import { useState, useEffect } from "react";
2
- import { useNavigate } from "react-router";
3
- import distance from "jaro-winkler";
4
- import { shuffle, removeAllSymbols, removeAllSymbolsFillInBlanks, formatMarkdownNewlines, localeCompare, localeCompareCase, removeExtraWhiteSpaces } from "../utils/index";
5
- import { botErrorMessage } from "../utils/constants";
6
- import { convertNumberToText, getLearnLangCode } from "../utils/languageHelpers";
7
- import BotNualaImage from "../img/bot_nuala.svg";
8
- export default function useExerciseState({
9
- t,
10
- open,
11
- handleClose,
12
- exerciseName,
13
- gameId,
14
- phrases,
15
- topicInfo = {},
16
- initialVoiceSpeed,
17
- remainingQuestions = [],
18
- existingAnswerAttempts = [],
19
- existingMessages = [],
20
- existingVars,
21
- exerciseStartTime,
22
- handleComplete,
23
- roleplayCreatedAtId,
24
- handleSaveProgress,
25
- handleDeleteProgress,
26
- handleDeleteRoleplayProgress,
27
- handleDeleteBotProgress,
28
- openSnackbar,
29
- courseId,
30
- sectionId,
31
- topicId,
32
- finalTranscript,
33
- interimTranscript,
34
- resetTranscript,
35
- stopListening,
36
- handleSpeak,
37
- handleStopSpeaking,
38
- learnLang,
39
- hiddenWordBankExercises = [],
40
- hiddenImageExercises = [],
41
- roleplay,
42
- selectedActor,
43
- bot,
44
- userAttributes,
45
- handleMessageBot,
46
- clearAttemptAudio,
47
- transcriptConfidence,
48
- transcriptWords,
49
- correctSound,
50
- incorrectSound,
51
- indicateEndStream,
52
- disableShuffle,
53
- textInputRef,
54
- toggleMuteSound,
55
- uploadAudioAttempt,
56
- audioBlob,
57
- attemptAudioURL,
58
- clearQueue,
59
- stopAudio,
60
- languageInformation,
61
- isLiveGame = false,
62
- isCreator,
63
- isKeyboardHiddenTranslation,
64
- isReadWriteModeStudent = false,
65
- classroomId,
66
- phraseListId,
67
- i18nLanguage,
68
- isDynamicResponsesEnabled,
69
- aiChatbotConversationHistory,
70
- isWrite
71
- }) {
72
- const navigate = useNavigate();
73
- const [questions, setQuestions] = useState([]);
74
- const [currentPhrase, setCurrentPhrase] = useState("");
75
- const [currentTranslations, setCurrentTranslations] = useState("");
76
- const [wordOptions, setWordOptions] = useState([]);
77
- const [wordLibrary, setWordLibrary] = useState([]);
78
- const [translationText, setTranslationText] = useState("");
79
- const [translationWords, setTranslationWords] = useState([]);
80
- const [isConfidenceOpen, setIsConfidenceOpen] = useState(false);
81
- const handleCloseConfidence = () => setIsConfidenceOpen(false);
82
- const handleOpenConfidence = () => setIsConfidenceOpen(true);
83
- const [listeningText, setListeningText] = useState("");
84
- const [listeningWords, setListeningWords] = useState([]);
85
- const [useWordBank, setUseWordBank] = useState(isKeyboardHiddenTranslation ?? false);
86
- const [isWordBankHidden, setIsWordBankHidden] = useState(false);
87
- const [roleplayText, setRoleplayText] = useState("");
88
- const [roleplayMessages, setRoleplayMessages] = useState(existingMessages || []);
89
- const [isActorOne, setIsActorOne] = useState(selectedActor && selectedActor === 1 ? true : false);
90
- const [disableSkip, setDisableSkip] = useState(false);
91
- const [roleplayHasStarted, setRoleplayHasStarted] = useState(existingMessages && existingMessages.length ? true : false);
92
- const [sentenceLibrary, setSentenceLibrary] = useState([]);
93
- const [isMyTurn, setIsMyTurn] = useState(false);
94
- const [showOptions, setShowOptions] = useState(false);
95
- const [answerOptions, setAnswerOptions] = useState([]);
96
- const [botText, setBotText] = useState("");
97
- const [botMessages, setBotMessages] = useState(existingMessages || []);
98
- const [botVars, setBotVars] = useState(existingVars || null);
99
- const [muteSound, setMuteSound] = useState(false);
100
- const [isSpeaking, setIsSpeaking] = useState(false);
101
- const [isSpeakingTextContainer, setIsSpeakingTextContainer] = useState(null);
102
- const [pollyResult, setPollyResult] = useState(null);
103
- const [answerAttempt, setAnswerAttempt] = useState(null);
104
- const [isCorrectResultOpen, setIsCorrectResultOpen] = useState(false);
105
- const [isPartiallyCorrectResultOpen, setIsPartiallyCorrectResultOpen] = useState(false);
106
- const [isIncorrectResultOpen, setIsIncorrectResultOpen] = useState(false);
107
- const [answerAttempts, setAnswerAttempts] = useState(existingAnswerAttempts || []);
108
- const [startTime, setStartTime] = useState(exerciseStartTime || Date.now());
109
- const [isCloseModalOpen, setIsCloseModalOpen] = useState(false);
110
- const [isInProgressModalOpen, setIsInProgressModalOpen] = useState(false);
111
- const [isCompletionModalOpen, setIsCompletionModalOpen] = useState(false);
112
- const [isTourFinished, setIsTourFinished] = useState(false);
113
- const [voiceSpeed, setVoiceSpeed] = useState(initialVoiceSpeed || "");
114
- const [isVoiceSpeedMenuOpen, setIsVoiceSpeedMenuOpen] = useState(null);
115
- const [isReportProblemOpen, setIsReportProblemOpen] = useState(false);
116
- const [transcript, setTranscript] = useState("");
117
- const [checked, setChecked] = useState(false);
118
- const [inAnswerOptions, setInAnswerOptions] = useState(false);
119
- const [isSkipResultOpen, setIsSkipResultOpen] = useState(false);
120
- const [checkAnswer, setCheckAnswer] = useState(false);
121
- const [isWordBankAttemptChanged, setIsWordBankAttemptChanged] = useState(false);
122
- const [isKeyboardHidden, setIsKeyboardHidden] = useState(false);
123
- const [isAssignmentExercise, setIsAssignmentExercise] = useState(false);
124
- const [isFirstMessage, setIsFirstMessage] = useState(true);
125
- const [conversationHistory, setConversationHistory] = useState([]);
126
- const [readWriteText, setReadWriteText] = useState("");
127
- useEffect(() => {
128
- if (isLiveGame && existingMessages && existingMessages.length > 0) {
129
- setRoleplayMessages(existingMessages);
130
- }
131
- }, [existingMessages]);
132
- const openCloseModal = () => {
133
- setIsCloseModalOpen(true);
134
- if (stopAudio) {
135
- stopAudio();
136
- }
137
- if (clearQueue) {
138
- clearQueue();
139
- }
140
- };
141
- const closeCloseModal = () => {
142
- setIsCloseModalOpen(false);
143
- };
144
- const openInProgressModal = () => {
145
- setIsInProgressModalOpen(true);
146
- if (stopAudio) {
147
- stopAudio();
148
- }
149
- if (clearQueue) {
150
- clearQueue();
151
- }
152
- };
153
- const closeInProgressModal = () => {
154
- setIsInProgressModalOpen(false);
155
- };
156
- const openCompletionModal = () => {
157
- setIsCompletionModalOpen(true);
158
- if (stopAudio) {
159
- stopAudio();
160
- }
161
- if (clearQueue) {
162
- clearQueue();
163
- }
164
- };
165
- const closeCompletionModal = () => {
166
- setIsCompletionModalOpen(false);
167
- };
168
- const [actorHasBeenSelected, setActorHasBeenSelected] = useState(selectedActor ? true : false);
169
- const [playAllEnabled, setPlayAllEnabled] = useState(false);
170
- const [finishedRoleplay, setFinishedRoleplay] = useState(false);
171
- const [roleplayInProgress, setRoleplayInProgress] = useState(false);
172
- const numberBlankOptions = 3;
173
- const handleOpenVoiceSpeedMenu = event => {
174
- setIsVoiceSpeedMenuOpen(event.currentTarget);
175
- };
176
- const handleCloseVoiceSpeedMenu = () => {
177
- setIsVoiceSpeedMenuOpen(null);
178
- };
179
- const handleChangeVoiceSpeed = speed => {
180
- setVoiceSpeed(speed);
181
- handleCloseVoiceSpeedMenu();
182
- };
183
- const handleOpenReportProblem = () => {
184
- setIsReportProblemOpen(true);
185
- };
186
- const handleCloseReportProblem = () => {
187
- setIsReportProblemOpen(false);
188
- };
189
- useEffect(() => {
190
- if (phrases && phrases.length) {
191
- if (remainingQuestions && remainingQuestions.length) {
192
- setQuestions(remainingQuestions);
193
- openInProgressModal();
194
- } else {
195
- setStartTime(Date.now());
196
- const qs = phrases.slice();
197
- if (!disableShuffle) {
198
- shuffle(qs);
199
- }
200
- setQuestions(qs);
201
- }
202
- if (["translation", "listening"].includes(exerciseName)) {
203
- const wordSet = new Set();
204
- for (const p of phrases) {
205
- if (exerciseName === "translation") {
206
- for (const t of p.translations) {
207
- if (t) {
208
- for (const w of t.trim().split(" ")) {
209
- if (w && w !== "") {
210
- wordSet.add(w);
211
- }
212
- }
213
- }
214
- }
215
- } else if (exerciseName === "listening") {
216
- for (const p of phrases) {
217
- for (const w of p.phrase.trim().split(" ")) {
218
- if (w && w !== "") {
219
- wordSet.add(w);
220
- }
221
- }
222
- }
223
- }
224
- }
225
- setWordLibrary([...wordSet]);
226
- }
227
- }
228
- }, [phrases]);
229
- useEffect(() => {
230
- if (open && ["roleplay", "bot"].includes(exerciseName) && existingMessages && existingMessages.length) {
231
- openInProgressModal();
232
- if (exerciseName === "roleplay") {
233
- setRoleplayHasStarted(true);
234
- }
235
- }
236
- }, [open, exerciseName]);
237
- useEffect(() => {
238
- if (open && exerciseStartTime && exerciseStartTime !== startTime) {
239
- setStartTime(exerciseStartTime);
240
- }
241
- }, [open, exerciseStartTime]);
242
- useEffect(() => {
243
- if (["translation"].includes(exerciseName)) {
244
- setIsKeyboardHidden(isKeyboardHiddenTranslation);
245
- }
246
- }, [exerciseName, isKeyboardHiddenTranslation]);
247
- useEffect(() => {
248
- if (["translation", "listening"].includes(exerciseName) && !hiddenWordBankExercises) {
249
- setIsWordBankHidden(false);
250
- } else {
251
- setIsWordBankHidden(hiddenWordBankExercises.includes(exerciseName));
252
- }
253
- }, [exerciseName, hiddenWordBankExercises]);
254
- useEffect(() => {
255
- if (["translation", "listening", "pronunciation", "meaning", "meaning-listen-and-speak", "meaning-read-and-write"].includes(exerciseName)) {
256
- const qs = questions;
257
- if (qs && qs.length > 0) {
258
- setCurrentPhrase(qs[0]);
259
- setCurrentTranslations(qs[0].translations);
260
- }
261
- }
262
- }, [exerciseName, questions]);
263
- useEffect(() => {
264
- if (open && currentPhrase && currentPhrase.phrase !== "" && !isCompletionModalOpen && learnLang && learnLang !== "irish" && isTourFinished && exerciseName !== "meaning" && exerciseName !== "meaning-listen-and-speak" && exerciseName !== "meaning-read-and-write") {
265
- const {
266
- voice,
267
- voiceLanguageCode,
268
- voicePitch
269
- } = topicInfo;
270
- speak(currentPhrase.phrase, voice, false, "#currentPhrase", voiceLanguageCode, false, voicePitch);
271
- }
272
- }, [currentPhrase, open, isTourFinished]);
273
- useEffect(() => {
274
- if (["translation"].includes(exerciseName)) {
275
- if (currentTranslations && currentTranslations.length > 0) {
276
- const currentTranslationArray = currentTranslations[0].split(" ");
277
- const normalizeWord = word => word.replace(/[.,!¡¿?;:]/g, "").toLowerCase();
278
- const normalizedToOriginalMap = new Map();
279
- currentTranslationArray.forEach(word => {
280
- const normalized = normalizeWord(word);
281
- normalizedToOriginalMap.set(normalized, word);
282
- });
283
- const wordLibraryCopy = wordLibrary.filter((word, i, arr) => {
284
- const prevWord = i > 0 ? arr[i - 1] : null;
285
- const nextWord = i < arr.length - 1 ? arr[i + 1] : null;
286
- const prevPair = prevWord ? `${prevWord}-${word}` : null;
287
- const nextPair = nextWord ? `${word}-${nextWord}` : null;
288
- if (prevPair && arr.includes(prevPair) || nextPair && arr.includes(nextPair)) {
289
- return false;
290
- }
291
- const normalized = normalizeWord(word);
292
- if (!normalizedToOriginalMap.has(normalized)) {
293
- normalizedToOriginalMap.set(normalized, word);
294
- return true;
295
- }
296
- return false;
297
- });
298
-
299
- // Shuffle the word library copy
300
- shuffle(wordLibraryCopy);
301
-
302
- // Create a set for unique words
303
- const wordSet = new Set(normalizedToOriginalMap.keys());
304
-
305
- // Take up to five additional words as options
306
- const additionalOptions = Array.from(wordSet).slice(currentTranslationArray.length, currentTranslationArray.length + 5);
307
-
308
- // Create the word options array using the original formatting for display
309
- const wordOptions = [...currentTranslationArray, ...additionalOptions.map(normalized => normalizedToOriginalMap.get(normalized))].map((text, id) => ({
310
- text,
311
- id
312
- }));
313
- shuffle(wordOptions);
314
- setWordOptions(wordOptions);
315
- }
316
- }
317
- }, [exerciseName, currentPhrase, currentTranslations]);
318
- useEffect(() => {
319
- if (["listening"].includes(exerciseName)) {
320
- if (wordLibrary && wordLibrary.length > 0) {
321
- const currentPhraseArray = currentPhrase.phrase.split(" ");
322
- const normalizeWord = word => word.replace(/[.,!¡¿?;:]/g, "").toLowerCase();
323
- const normalizedToOriginalMap = new Map();
324
- currentPhraseArray.forEach(word => {
325
- const normalized = normalizeWord(word);
326
- normalizedToOriginalMap.set(normalized, word);
327
- });
328
- const wordLibraryCopy = wordLibrary.filter((word, i, arr) => {
329
- const prevWord = i > 0 ? arr[i - 1] : null;
330
- const nextWord = i < arr.length - 1 ? arr[i + 1] : null;
331
- const prevPair = prevWord ? `${prevWord}-${word}` : null;
332
- const nextPair = nextWord ? `${word}-${nextWord}` : null;
333
- if (prevPair && arr.includes(prevPair) || nextPair && arr.includes(nextPair)) {
334
- return false;
335
- }
336
- const normalized = normalizeWord(word);
337
- if (!normalizedToOriginalMap.has(normalized)) {
338
- normalizedToOriginalMap.set(normalized, word);
339
- return true;
340
- }
341
- return false;
342
- });
343
-
344
- // Shuffle the word library copy
345
- shuffle(wordLibraryCopy);
346
-
347
- // Create a set of normalized words to ensure uniqueness
348
- const wordSet = new Set(normalizedToOriginalMap.keys());
349
-
350
- // Take up to five additional words as options
351
- const additionalOptions = Array.from(wordSet).slice(currentPhraseArray.length, currentPhraseArray.length + 5);
352
-
353
- // Create the word options array using the original formatting for display
354
- const wordOptions = [...currentPhraseArray, ...additionalOptions.map(normalized => normalizedToOriginalMap.get(normalized))].map((text, id) => ({
355
- text,
356
- id
357
- }));
358
- shuffle(wordOptions);
359
- setWordOptions(wordOptions);
360
- }
361
- }
362
- }, [exerciseName, currentPhrase]);
363
-
364
- // Uncomment to renable auto mark translations as correct
365
- // useEffect(() => {
366
- // if (open && ['translation'].includes(exerciseName)) {
367
- // if (
368
- // translationText &&
369
- // currentPhrase &&
370
- // currentPhrase.phrase &&
371
- // currentTranslations
372
- // ) {
373
- // if (checkIsTranslationCorrect(translationText, currentTranslations)) {
374
- // handleContinue();
375
- // }
376
- // }
377
- // }
378
- // }, [open, exerciseName, translationText, currentPhrase, currentTranslations]);
379
-
380
- // useEffect(() => {
381
- // if (open && ["translation"].includes(exerciseName)) {
382
- // if (translationWords && translationWords.length > 0) {
383
- // const translationValue = translationWords.map((w) => w.text).join(" ");
384
- // if (checkIsTranslationCorrect(translationValue, currentTranslations)) {
385
- // handleContinue(false);
386
- // }
387
- // }
388
- // }
389
- // }, [
390
- // open,
391
- // exerciseName,
392
- // currentTranslations,
393
- // translationWords,
394
- // translationWords.length,
395
- // ]);
396
-
397
- // Uncomment to renable auto mark listening text as correct
398
- // useEffect(() => {
399
- // if (open && ['listening'].includes(exerciseName)) {
400
- // if (listeningText && currentPhrase && currentPhrase.phrase) {
401
- // if (checkIsListeningCorrect(listeningText, currentPhrase)) {
402
- // handleContinue();
403
- // }
404
- // }
405
- // }
406
- // }, [open, exerciseName, listeningText, currentPhrase]);
407
-
408
- // Uncomment to renable auto mark listening words as correct
409
- // useEffect(() => {
410
- // if (open && ["listening"].includes(exerciseName)) {
411
- // if (listeningWords && listeningWords.length > 0 && !isLiveGame) {
412
- // const phraseValue = listeningWords.map((w) => w.text).join(" ");
413
- // if (checkIsListeningCorrect(phraseValue, currentPhrase)) {
414
- // handleContinue(false);
415
- // }
416
- // }
417
- // }
418
- // }, [
419
- // open,
420
- // exerciseName,
421
- // listeningWords,
422
- // listeningWords.length,
423
- // currentPhrase,
424
- // ]);
425
-
426
- useEffect(() => {
427
- if (open && ["pronunciation", "meaning-listen-and-speak"].includes(exerciseName) && finalTranscript && currentPhrase && currentPhrase.phrase) {
428
- setTimeout(() => {
429
- handleOpenConfidence();
430
- }, 500);
431
- if (checkIsPronunciationCorrect(finalTranscript, currentPhrase)) {
432
- handleContinue(false, currentPhrase);
433
- }
434
- }
435
- }, [open, exerciseName, finalTranscript, currentPhrase]);
436
- useEffect(() => {
437
- if (open && ["pronunciation", "meaning-listen-and-speak"].includes(exerciseName) && interimTranscript && currentPhrase && currentPhrase.phrase) {
438
- // Check if final + interim transcript is the correct answer,
439
- if (checkIsPronunciationCorrect(`${finalTranscript || ""} ${interimTranscript || ""}`, currentPhrase)) {
440
- // End recogniton if the answer is correct (Indicate end stream to get final results)
441
- indicateEndStream();
442
- }
443
- }
444
- }, [open, exerciseName, interimTranscript, currentPhrase]);
445
- useEffect(() => {
446
- if (open && ["roleplay"].includes(exerciseName) && finalTranscript && roleplay && roleplay.script) {
447
- const script = roleplay.script;
448
- const currentScriptLine = script[roleplayMessages.length];
449
- setTimeout(() => {
450
- handleOpenConfidence();
451
- }, 500);
452
- if (checkIsRoleplayMessageCorrect(finalTranscript, currentScriptLine.text)) {
453
- checkRoleplayPronunciation(finalTranscript, currentScriptLine.text);
454
- }
455
- }
456
- }, [open, exerciseName, finalTranscript, currentPhrase]);
457
- useEffect(() => {
458
- if (open && ["roleplay"].includes(exerciseName) && interimTranscript && roleplay && roleplay.script) {
459
- const script = roleplay.script;
460
- const currentScriptLine = script[roleplayMessages.length];
461
- // Check if final + interim transcript is the correct answer,
462
- if (checkIsRoleplayMessageCorrect(`${finalTranscript || ""} ${interimTranscript || ""}`, currentScriptLine.text)) {
463
- // End recogniton if the answer is correct (Indicate end stream to get final results)
464
- indicateEndStream();
465
- }
466
- }
467
- }, [open, exerciseName, interimTranscript]);
468
- useEffect(() => {
469
- if (open && ["bot"].includes(exerciseName) && finalTranscript) {
470
- setTimeout(() => {
471
- handleOpenConfidence();
472
- if (textInputRef && textInputRef.current) {
473
- textInputRef.current.focus();
474
- }
475
- }, 500);
476
- }
477
- }, [open, exerciseName, finalTranscript]);
478
- useEffect(() => {
479
- if (open && ["pronunciation"].includes(exerciseName) && isConfidenceOpen) {
480
- setTimeout(() => {
481
- handleCloseConfidence();
482
- }, 3000);
483
- }
484
- }, [open, exerciseName, isConfidenceOpen]);
485
- useEffect(() => {
486
- if (["roleplay"].includes(exerciseName) && isConfidenceOpen) {
487
- setTimeout(() => {
488
- handleCloseConfidence();
489
- }, 3000);
490
- }
491
- }, [exerciseName, isConfidenceOpen]);
492
- useEffect(() => {
493
- if (open && roleplayHasStarted && roleplay && roleplay.script) {
494
- const sentences = roleplay.script.filter(s => s.text && s.actor === (isActorOne ? 1 : 2)).map(s => s.text);
495
- setSentenceLibrary(sentences);
496
- }
497
- }, [open, roleplayHasStarted]);
498
- useEffect(() => {
499
- if (open && roleplayHasStarted && roleplay && roleplay.script && (gameId?.startsWith("act-it-out") || gameId === "original")) {
500
- if (roleplayMessages.length <= roleplay.script.length) {
501
- const {
502
- script = []
503
- } = roleplay;
504
- const nextScriptline = script[roleplayMessages.length - 1];
505
- if (nextScriptline && nextScriptline?.question) {
506
- // question time
507
- const correctAnswers = nextScriptline.answers.reduce((accumulator, currentValue, currentIndex) => {
508
- const attempts = answerAttempts.filter(attempt => {
509
- return attempt.type === "question" && attempt.question === nextScriptline.question && attempt.attempt === currentValue.text && currentValue.correct;
510
- });
511
- if (attempts.length) {
512
- accumulator.push(currentIndex);
513
- }
514
- return accumulator;
515
- }, []);
516
- if (correctAnswers.length) {
517
- if (roleplayHasStarted) {
518
- if (roleplayMessages.length === script.length) {
519
- roleplayHasEnded(2000);
520
- } else {
521
- handleNext();
522
- }
523
- }
524
- }
525
- } else {
526
- if (roleplayMessages.length === script.length && !isSpeaking) {
527
- roleplayHasEnded(2000);
528
- } else {
529
- if (!isSpeaking) {
530
- if (muteSound) {
531
- // if sound is muted delay the next message to simulate speech
532
- setTimeout(() => {
533
- handleNext();
534
- }, 3000);
535
- } else if (!inAnswerOptions) {
536
- handleNext();
537
- }
538
- }
539
- }
540
- }
541
- }
542
- }
543
- }, [open, roleplayHasStarted, roleplayMessages, isSpeaking]);
544
-
545
- // Causes issue with bot inside course
546
- // useEffect(() => {
547
- // if (open && exerciseName === 'bot' && Array.isArray(existingMessages)) {
548
- // setBotMessages(existingMessages);
549
- // }
550
- // if (open && exerciseName === 'bot' && existingVars) {
551
- // setBotVars(existingVars);
552
- // }
553
- // if (open && exerciseName === 'roleplay' && Array.isArray(existingMessages)) {
554
- // setRoleplayMessages(existingMessages);
555
- // }
556
- // }, [open, existingMessages])
557
-
558
- useEffect(() => {
559
- if (open && roleplayText && roleplay && roleplay.script && roleplay.script && roleplayMessages && gameId === "original") {
560
- const script = roleplay.script;
561
- const scriptLine = script[roleplayMessages.length] ? script[roleplayMessages.length].text : "";
562
- const formattedScriptLine = removeAllSymbols(scriptLine).trim().toString();
563
- const formattedText = removeAllSymbols(roleplayText).trim().toString();
564
- if (checkIsRoleplayMessageCorrect(formattedText, formattedScriptLine)) {
565
- handleMakeAttempt();
566
- }
567
- }
568
- }, [open, roleplayText, roleplay]);
569
- useEffect(() => {
570
- if (open && exerciseName === "bot" && botMessages && botMessages.length) {
571
- handleSaveBotExerciseProgress(botMessages, botVars);
572
- }
573
- }, [open, exerciseName, botMessages]);
574
- const stopExerciseAudio = () => {
575
- if (clearQueue) {
576
- clearQueue();
577
- }
578
- if (stopAudio) {
579
- stopAudio();
580
- }
581
- };
582
- const handleInputChange = event => {
583
- const target = event.target;
584
- const value = target.type === "checkbox" ? target.checked : target.value;
585
- const name = event.target.name;
586
- if (name === "translationText") {
587
- setTranslationText(value);
588
- }
589
- if (name === "listeningText") {
590
- setListeningText(value);
591
- }
592
- if (name === "isActorOne") {
593
- setIsActorOne(value);
594
- if (roleplayHasStarted && !gameId.startsWith("act-it-out")) {
595
- handleRestartExercise();
596
- }
597
- }
598
- if (name === "roleplayText") {
599
- setRoleplayText(value);
600
- }
601
- if (name === "botText") {
602
- setBotText(value);
603
- }
604
- if (name === "readWriteText") {
605
- setReadWriteText(value);
606
- }
607
- };
608
- const clearPreviousAttempt = () => {
609
- setTranslationText("");
610
- setTranslationWords([]);
611
- setListeningText("");
612
- setListeningWords([]);
613
- setReadWriteText("");
614
- if (!isKeyboardHidden) {
615
- setUseWordBank(false);
616
- }
617
- };
618
- const handleUseWordBank = () => {
619
- setUseWordBank(true);
620
- setIsWordBankHidden(false);
621
- };
622
- const finishedSpeaking = () => {
623
- setIsSpeaking(false);
624
- setIsSpeakingTextContainer(null);
625
- };
626
- const disableStudentLiveStorySpeak = gameId === "story" && isLiveGame && !isCreator;
627
- const speak = async (text, voice = null, overrideMute = false, textContainer, languageCode, isHoverText = false, pitch, callback) => {
628
- try {
629
- if ((!muteSound || overrideMute) && !disableStudentLiveStorySpeak) {
630
- setIsSpeaking(true);
631
- setIsSpeakingTextContainer(textContainer);
632
- const result = await handleSpeak({
633
- text,
634
- learnLanguage: learnLang,
635
- voiceName: voice,
636
- mute: null,
637
- callback: () => {
638
- finishedSpeaking();
639
- if (callback) {
640
- callback();
641
- }
642
- },
643
- textContainer,
644
- languageCode,
645
- voiceSpeed,
646
- isHoverText,
647
- pitch
648
- });
649
- setPollyResult(result.audioUrl);
650
- }
651
- } catch (error) {
652
- console.error(error);
653
- finishedSpeaking();
654
- if (callback) {
655
- callback();
656
- }
657
- }
658
- };
659
- const stopSpeaking = async textContainer => {
660
- try {
661
- await handleStopSpeaking(textContainer);
662
- finishedSpeaking();
663
- } catch (error) {
664
- console.error(error);
665
- }
666
- };
667
- const handleContinue = async (isSkipped, answer) => {
668
- if (exerciseName === "pronunciation" || exerciseName === "meaning-listen-and-speak") {
669
- checkPronunciation(isSkipped, answer);
670
- }
671
- if (exerciseName === "translation") {
672
- checkTranslation(isSkipped);
673
- }
674
- if (exerciseName === "listening") {
675
- checkListening(isSkipped);
676
- }
677
- if (exerciseName === "meaning" || exerciseName === "meaning-read-and-write") {
678
- checkMeaning(isSkipped, answer, isWrite);
679
- }
680
- };
681
- const handleMute = () => {
682
- setMuteSound(prevValue => !prevValue);
683
- if (muteSound === false) {
684
- finishedSpeaking();
685
- }
686
- stopExerciseAudio();
687
- toggleMuteSound();
688
- };
689
- const handleReset = () => {
690
- if (stopListening) {
691
- stopListening();
692
- }
693
- if (resetTranscript) {
694
- if (finalTranscript) {
695
- setTranscript(finalTranscript);
696
- } else if (interimTranscript) {
697
- setTranscript(interimTranscript);
698
- } else if (answerAttempt) {
699
- setTranscript(answerAttempt.attempt);
700
- }
701
- resetTranscript();
702
- setTimeout(() => {
703
- // Check if transcript has been reset
704
- if (interimTranscript || finalTranscript) {
705
- resetTranscript();
706
- }
707
- }, 800);
708
- }
709
- clearPreviousAttempt();
710
- };
711
- const startRoleplay = () => {
712
- handleNext();
713
- setRoleplayHasStarted(true);
714
- // setDisableSkip(true);
715
- setStartTime(Date.now());
716
- };
717
- const checkIsMyTurn = () => {
718
- const script = roleplay.script;
719
- const currentScriptLine = script[roleplayMessages.length];
720
- return currentScriptLine && (currentScriptLine.actor === 1 && isActorOne || currentScriptLine.actor === 2 && !isActorOne);
721
- };
722
- const handleNext = updatedAnswerAttempts => {
723
- const script = roleplay.script;
724
- const currentScriptLine = script[roleplayMessages.length];
725
- if (gameId === "story") {
726
- if (currentScriptLine) {
727
- if (currentScriptLine?.question) {
728
- setRoleplayMessages(prevState => [...prevState, currentScriptLine]);
729
- } else {
730
- addRoleplayMessage(currentScriptLine.text, currentScriptLine.actor === 2);
731
- }
732
- }
733
- return;
734
- }
735
- if (gameId === "fill-in-the-blanks") {
736
- if (currentScriptLine && currentScriptLine.text) {
737
- addRoleplayMessage(currentScriptLine.text, currentScriptLine.actor === 2);
738
- if (currentScriptLine.text.trim().split(" ").length <= 2 && currentScriptLine.text === script[script.length - 1].text) {
739
- //no blanks in chat and last chat
740
- roleplayHasEnded(2000, updatedAnswerAttempts);
741
- }
742
- }
743
- return;
744
- }
745
- if (!checkIsMyTurn()) {
746
- setIsMyTurn(false);
747
- if (currentScriptLine?.question) {
748
- setRoleplayMessages(prevState => [...prevState, currentScriptLine]);
749
- } else {
750
- addRoleplayMessage(currentScriptLine.text, currentScriptLine.actor === 2);
751
- }
752
- } else {
753
- setDisableSkip(false);
754
- setIsMyTurn(true);
755
- let sentences;
756
- if (sentenceLibrary && sentenceLibrary.length) {
757
- sentences = sentenceLibrary;
758
- } else {
759
- sentences = roleplay.script.filter(s => s.text && s.actor === (isActorOne ? 1 : 2)).map(s => s.text);
760
- }
761
- shuffle(sentences);
762
- const sentenceSet = new Set([currentScriptLine.text, ...sentences]);
763
- const ansOptions = [...sentenceSet].slice(0, 4);
764
- shuffle(ansOptions);
765
- setAnswerOptions(ansOptions);
766
- }
767
- };
768
- const getRandomFeedbackMessage = feedbackArray => {
769
- const feedback = feedbackArray[Math.floor(Math.random() * feedbackArray.length)];
770
- return feedback;
771
- };
772
- const handleMakeAttempt = (attemptText, attemptMethod) => {
773
- const attempt = attemptText || roleplayText;
774
- const script = roleplay.script;
775
- const currentScriptLine = script[roleplayMessages.length];
776
- if (currentScriptLine) {
777
- const formattedText = removeAllSymbols(attempt).trim().toString();
778
- const formattedScriptLine = removeAllSymbols(currentScriptLine.text).trim().toString();
779
- const strDistance = stringDistance(formattedText, formattedScriptLine);
780
- const method = attemptMethod || (`${finalTranscript || ""} ${interimTranscript || ""}`.trim() === attempt.trim() ? "voice" : "text");
781
- handleReset();
782
- let answerMessage, color;
783
- if (strDistance === 1) {
784
- answerMessage = "answer_message_100";
785
- color = "success";
786
- } else if (strDistance > 0.95) {
787
- answerMessage = "answer_message_95";
788
- color = "info";
789
- } else if (strDistance >= 0.9) {
790
- answerMessage = "answer_message_90";
791
- color = "info";
792
- } else {
793
- answerMessage = getRandomFeedbackMessage(languageInformation.incorrectAnswerMessage) || "answer_message_wrong";
794
- color = "error";
795
- }
796
- openSnackbar(answerMessage, color);
797
- const isCorrect = checkIsRoleplayMessageCorrect(formattedText, formattedScriptLine);
798
- setAnswerAttempts(prevAttempts => [...prevAttempts, {
799
- type: "script",
800
- attempt,
801
- answer: currentScriptLine.text,
802
- result: isCorrect ? "correct" : "incorrect",
803
- method
804
- }]);
805
- if (isCorrect && isCorrect === true) {
806
- handleRoleplayCorrect(getRandomFeedbackMessage(languageInformation.correctAnswerMessage));
807
- addRoleplayMessage(currentScriptLine.text, currentScriptLine.actor === 2, true);
808
- setRoleplayText("");
809
- setDisableSkip(true);
810
- }
811
- }
812
- };
813
- const handleSelectAnswerOption = option => {
814
- setInAnswerOptions(false);
815
- handleMakeAttempt(option, "option");
816
- };
817
- const handleCorrectQuestionAnswer = (question, answer) => {
818
- // question time over
819
- let updatedAnswerAttempts = [];
820
- let method = "";
821
- if (gameId === "fill-in-the-blanks" || gameId === "story") {
822
- method = "multiple_choice";
823
- updatedAnswerAttempts = [...answerAttempts, {
824
- type: "question",
825
- question,
826
- attempt: answer.text,
827
- result: "correct",
828
- answer: answer.correctAnswer,
829
- method
830
- }];
831
- } else {
832
- updatedAnswerAttempts = [...answerAttempts, {
833
- type: "question",
834
- question,
835
- attempt: answer.text,
836
- result: "correct",
837
- answer: answer.correct,
838
- method: null
839
- }];
840
- }
841
- setAnswerAttempts(updatedAnswerAttempts);
842
- handleSaveRoleplayExerciseProgress(roleplayMessages, updatedAnswerAttempts);
843
- const {
844
- script = []
845
- } = roleplay;
846
- if (roleplayHasStarted) {
847
- if (roleplayMessages.length === script.length) {
848
- roleplayHasEnded(2000, updatedAnswerAttempts);
849
- } else {
850
- handleNext(updatedAnswerAttempts);
851
- }
852
- }
853
- };
854
- const handleIncorrectQuestionAnswer = (question, answer) => {
855
- let method = "";
856
- let updatedAnswerAttempts = [];
857
- if (gameId === "fill-in-the-blanks" || gameId === "story") {
858
- method = "multiple_choice";
859
- updatedAnswerAttempts = [...answerAttempts, {
860
- type: "question",
861
- question,
862
- attempt: answer.text,
863
- result: "incorrect",
864
- answer: answer.correctAnswer,
865
- method
866
- }];
867
- } else {
868
- updatedAnswerAttempts = [...answerAttempts, {
869
- type: "question",
870
- question,
871
- attempt: answer.text,
872
- result: "incorrect",
873
- answer: answer.correct,
874
- method: null
875
- }];
876
- }
877
- setAnswerAttempts(updatedAnswerAttempts);
878
- handleSaveRoleplayExerciseProgress(roleplayMessages, updatedAnswerAttempts);
879
- };
880
- const stringDistance = (string1, string2) => {
881
- return distance(string1, string2, {
882
- caseSensitive: false
883
- });
884
- };
885
- const handleSkip = () => {
886
- setDisableSkip(true);
887
- const script = roleplay.script;
888
- const currentScriptLine = script[roleplayMessages.length];
889
- setAnswerAttempts(prevAttempts => [...prevAttempts, {
890
- type: "script",
891
- attempt: roleplayText,
892
- answer: currentScriptLine.text,
893
- result: "skipped"
894
- }]);
895
- addRoleplayMessage(currentScriptLine.text, currentScriptLine.actor === 2);
896
- handleReset();
897
- setRoleplayText("");
898
- };
899
- const roleplayHasEnded = (timeout, newAnswerAttempts) => {
900
- setTimeout(() => {
901
- handleCompleteExercise(null, newAnswerAttempts);
902
- }, timeout || 0);
903
- };
904
- const handleRestart = () => {
905
- handleReset();
906
- if (phrases && phrases.length) {
907
- const qs = phrases.slice();
908
- if (!disableShuffle) {
909
- shuffle(qs);
910
- }
911
- setQuestions(qs);
912
- }
913
- if (exerciseName === "roleplay") {
914
- if (gameId.startsWith("act-it-out")) {
915
- setRoleplayHasStarted(false); // need to select actor first
916
- } else if (!roleplayHasStarted) {
917
- setRoleplayHasStarted(true);
918
- }
919
- }
920
- setAnswerAttempts([]);
921
- setStartTime(Date.now());
922
- setRoleplayText("");
923
- setRoleplayMessages([]);
924
- setBotVars(null);
925
- setBotText("");
926
- setBotMessages([]);
927
- setConversationHistory([]);
928
- setIsFirstMessage(true);
929
- deleteProgress();
930
- setChecked(false);
931
- setActorHasBeenSelected(false);
932
- setInAnswerOptions(false);
933
- };
934
- const handlePlayAgain = () => {
935
- closeCompletionModal();
936
- closeInProgressModal();
937
- handleReset();
938
- if (phrases && phrases.length) {
939
- const qs = phrases.slice();
940
- shuffle(qs);
941
- setQuestions(qs);
942
- }
943
- setRoleplayHasStarted(false);
944
- setActorHasBeenSelected(false);
945
- setAnswerAttempts([]);
946
- setStartTime(Date.now());
947
- setRoleplayText("");
948
- setRoleplayMessages([]);
949
- setBotVars(null);
950
- setBotText("");
951
- setBotMessages([]);
952
- setConversationHistory([]);
953
- setIsFirstMessage(true);
954
- deleteProgress();
955
- if (exerciseName === "roleplay" && !gameId.startsWith("act-it-out")) {
956
- // if act-it-out need to select actor
957
- startRoleplay();
958
- }
959
- setActorHasBeenSelected(false);
960
- setInAnswerOptions(false);
961
- };
962
- const deleteProgress = () => {
963
- if (courseId && sectionId && topicId) {
964
- handleDeleteProgress(courseId, sectionId, topicId, `${exerciseName}${gameId && gameId !== "original" ? `-${gameId}` : ""}`);
965
- } else if (exerciseName === "roleplay") {
966
- handleDeleteRoleplayProgress(roleplay.roleplayId, `${exerciseName}${gameId && gameId !== "original" ? `-${gameId}` : ""}`);
967
- } else if (exerciseName === "bot") {
968
- handleDeleteBotProgress(bot.botId, exerciseName);
969
- }
970
- };
971
- const handleRestartExercise = () => {
972
- closeCompletionModal();
973
- closeInProgressModal();
974
- handleRestart();
975
- stopExerciseAudio();
976
- };
977
- const getActorName = isA1 => {
978
- return isA1 ? roleplay.actor1 && roleplay.actor1.name ? roleplay.actor1.name : t("actor", {
979
- number: "1"
980
- }) : roleplay.actor2 && roleplay.actor2.name ? roleplay.actor2.name : t("actor", {
981
- number: "2"
982
- });
983
- };
984
- const checkPronunciation = (isSkipped, answer) => {
985
- let correctWordConfidenceScoreTotal = 0;
986
- let correctWordCounter = 0;
987
- let nearCorrectWordCounter = 0;
988
- const isCorrect = checkIsPronunciationCorrect(finalTranscript, answer);
989
- const answerArray = removeExtraWhiteSpaces(answer.phrase).split(" ");
990
- (finalTranscript || interimTranscript).split(" ").forEach((word, i) => {
991
- const isWordCorrect = answerArray[i] && checkIsPronunciationCorrect(word.trim(), {
992
- phrase: answerArray[i].trim(),
993
- alternativeVersions: currentPhrase.alternativeVersions ? currentPhrase.alternativeVersions.map(altAns => {
994
- return altAns ? altAns.split(" ")[i] : "";
995
- }) : []
996
- });
997
- if (isWordCorrect) {
998
- correctWordCounter += 1;
999
- const wordIndex = (transcriptWords || []).findIndex(w => w.word === word.trim());
1000
- if (wordIndex > -1 && transcriptWords[wordIndex].confidence) {
1001
- correctWordConfidenceScoreTotal += transcriptWords[wordIndex].confidence;
1002
- } else {
1003
- correctWordConfidenceScoreTotal += transcriptConfidence;
1004
- }
1005
- }
1006
- if (!isWordCorrect && (answerArray[i - 1] && checkIsPronunciationCorrect(word.trim(), {
1007
- phrase: answerArray[i - 1].trim(),
1008
- alternativeVersions: currentPhrase.alternativeVersions ? currentPhrase.alternativeVersions.map(altAns => {
1009
- return altAns ? removeExtraWhiteSpaces(altAns).split(" ")[i - 1] : "";
1010
- }) : []
1011
- }) || answerArray[i + 1] && checkIsPronunciationCorrect(word.trim(), {
1012
- phrase: answerArray[i + 1].trim(),
1013
- alternativeVersions: currentPhrase.alternativeVersions ? currentPhrase.alternativeVersions.map(altAns => {
1014
- return altAns ? removeExtraWhiteSpaces(altAns).split(" ")[i + 1] : "";
1015
- }) : []
1016
- }))) {
1017
- nearCorrectWordCounter += 1;
1018
- }
1019
- });
1020
- const transcriptCompleteness = correctWordCounter / answerArray.length;
1021
-
1022
- // A confidence score the awards 0 to an incorrect word
1023
- const transcriptCorrectWordConfidence = correctWordConfidenceScoreTotal / answerArray.length;
1024
- const pronunciationScore = (transcriptCorrectWordConfidence + transcriptCompleteness) / 2;
1025
- const answerAttempt = {
1026
- attempt: finalTranscript ? finalTranscript : interimTranscript,
1027
- answer: answer.phrase,
1028
- alternativeAnswers: currentPhrase.alternativeVersions ? currentPhrase.alternativeVersions : [],
1029
- result: isSkipped ? "skipped" : isCorrect ? "correct" : correctWordCounter >= 1 ? "partially_correct" : nearCorrectWordCounter >= 1 ? "partially_correct" : "incorrect",
1030
- transcriptConfidence,
1031
- transcriptCorrectWordConfidence,
1032
- transcriptCompleteness,
1033
- transcriptWords,
1034
- pronunciationScore
1035
- };
1036
- if (isSkipped === true) {
1037
- handleExerciseSkip(answerAttempt);
1038
- }
1039
- if (isCorrect && isCorrect === true) {
1040
- handleCorrect(answerAttempt);
1041
- } else if (correctWordCounter >= 1) {
1042
- handlePartiallyCorrect(answerAttempt);
1043
- } else {
1044
- handleIncorrect(answerAttempt);
1045
- }
1046
- };
1047
- const checkIsPronunciationCorrect = (finalTranscript, answer) => {
1048
- const words = finalTranscript.split(" ");
1049
- const isSingleWord = words.length === 1;
1050
- let stringMatch = localeCompare(removeAllSymbols(finalTranscript).trim(), removeAllSymbols(answer.phrase).trim());
1051
- if (stringMatch === 0) {
1052
- return true;
1053
- } else if (answer && answer.alternativeVersions && answer.alternativeVersions.length > 0) {
1054
- for (let index = 0; index < answer.alternativeVersions.length; index++) {
1055
- const alternativeVersion = answer.alternativeVersions[index];
1056
- stringMatch = localeCompare(removeAllSymbols(finalTranscript), removeAllSymbols(alternativeVersion));
1057
- if (stringMatch === 0) {
1058
- return true;
1059
- }
1060
- }
1061
- } // If answer contains words && finaltranscript contains digits
1062
- else if (isSingleWord && /^\d+$/.test(finalTranscript)) {
1063
- const numberToText = convertNumberToText(finalTranscript, learnLang);
1064
- stringMatch = localeCompare(removeAllSymbols(numberToText), removeAllSymbols(answer.phrase));
1065
- if (stringMatch === 0) {
1066
- return true;
1067
- }
1068
- } else if (!isSingleWord) {
1069
- let newStringArray = words;
1070
- words.map((word, index) => {
1071
- if (/^\d+$/.test(word)) {
1072
- const numberToText = convertNumberToText(word, learnLang);
1073
- newStringArray[index] = numberToText;
1074
- }
1075
- });
1076
- stringMatch = localeCompare(removeAllSymbols(newStringArray.join(" ")), removeAllSymbols(answer.phrase));
1077
- if (stringMatch === 0) {
1078
- return true;
1079
- }
1080
- }
1081
- return false;
1082
- };
1083
- const checkTranslation = isSkipped => {
1084
- let translations;
1085
- if (questions && questions.length > 0) {
1086
- translations = questions[0].translations || [];
1087
- } else {
1088
- return;
1089
- }
1090
- const translationAttempt = useWordBank || isKeyboardHidden ? translationWords.map(w => w.text).join(" ") : translationText.trim();
1091
- const isCorrect = checkIsTranslationCorrect(translationAttempt, translations);
1092
- const answerAttempt = {
1093
- attempt: translationAttempt,
1094
- answer: translations,
1095
- result: isSkipped ? "skipped" : isCorrect ? "correct" : "incorrect",
1096
- method: useWordBank ? "word_bank" : "text"
1097
- };
1098
- if (isSkipped === true) {
1099
- handleExerciseSkip(answerAttempt);
1100
- }
1101
- if (isCorrect && isCorrect === true) {
1102
- handleCorrect(answerAttempt);
1103
- } else {
1104
- useWordBank ? handleIncorrectWordBank(answerAttempt) : handleIncorrect(answerAttempt);
1105
- }
1106
- };
1107
- const checkIsTranslationCorrect = (translationAttempt, translations) => {
1108
- let translationMatch;
1109
- for (const item of translations) {
1110
- translationMatch = removeAllSymbols(item).localeCompare(removeAllSymbols(translationAttempt), undefined, {
1111
- sensitivity: "base"
1112
- });
1113
- if (translationMatch === 0) {
1114
- return true;
1115
- }
1116
- }
1117
- };
1118
- const checkIsMeaningCorrect = (meaningAttempt, phrase, alternativeVersions = []) => {
1119
- let meaningMatch = removeAllSymbols(phrase).localeCompare(removeAllSymbols(meaningAttempt), undefined, {
1120
- sensitivity: "base"
1121
- });
1122
- if (meaningMatch === 0) {
1123
- return true;
1124
- }
1125
- if (alternativeVersions && alternativeVersions.length > 0) {
1126
- for (let index = 0; index < alternativeVersions.length; index++) {
1127
- const alternativeVersion = alternativeVersions[index];
1128
- meaningMatch = removeAllSymbols(alternativeVersion).localeCompare(removeAllSymbols(meaningAttempt), undefined, {
1129
- sensitivity: "base"
1130
- });
1131
- if (meaningMatch === 0) {
1132
- return true;
1133
- }
1134
- }
1135
- }
1136
- };
1137
- const phraseWordList = currentPhrase && currentPhrase.phrase ? removeExtraWhiteSpaces(currentPhrase.phrase).split(" ") : [];
1138
- const checkListening = isSkipped => {
1139
- let correctWordCounter = 0;
1140
- const phraseAttempt = useWordBank ? listeningWords.map(w => w.text).join(" ") : listeningText.trim();
1141
- const isCorrect = checkIsListeningCorrect(phraseAttempt, currentPhrase);
1142
- const isCaseCorrect = checkIsCaseCorrect(phraseAttempt, currentPhrase);
1143
- (phraseAttempt || "").split(" ").forEach((word, i) => {
1144
- const correctWord = phraseWordList[i]?.trim() || "";
1145
- const isWordCorrect = checkIsListeningCorrect(word.trim(), {
1146
- phrase: correctWord
1147
- });
1148
- if (isWordCorrect === true) {
1149
- correctWordCounter += 1;
1150
- if (!checkIsCaseCorrect(word.trim(), {
1151
- phrase: correctWord
1152
- })) {
1153
- checkIsLetterCorrect(word, correctWord);
1154
- }
1155
- }
1156
- });
1157
- const result = isSkipped ? "skipped" : isCorrect && isCaseCorrect ? "correct" : correctWordCounter >= 1 && !isCaseCorrect ? "partially_correct" : "incorrect";
1158
- const answerAttempt = {
1159
- attempt: phraseAttempt,
1160
- answer: currentPhrase.phrase,
1161
- result,
1162
- method: useWordBank ? "word_bank" : "text"
1163
- };
1164
- if (isSkipped === true) {
1165
- handleExerciseSkip(answerAttempt);
1166
- }
1167
- if (isCorrect && isCaseCorrect) {
1168
- handleCorrect(answerAttempt);
1169
- } else if (correctWordCounter >= 1 && !isCaseCorrect) {
1170
- handlePartiallyCorrect(answerAttempt);
1171
- } else {
1172
- useWordBank ? handleIncorrectWordBank(answerAttempt) : handleIncorrect(answerAttempt);
1173
- }
1174
- };
1175
- const checkIsLetterCorrect = (attemptWord, correctWord) => {
1176
- const letterComparison = [];
1177
- if (attemptWord.toLowerCase() !== correctWord.toLowerCase()) {
1178
- return correctWord.split("").map(letter => ({
1179
- letter,
1180
- isCorrect: false
1181
- }));
1182
- }
1183
- const maxLength = Math.max(attemptWord.length, correctWord.length);
1184
- for (let i = 0; i < maxLength; i++) {
1185
- letterComparison.push({
1186
- letter: correctWord[i] || "",
1187
- isCorrect: attemptWord[i] === correctWord[i]
1188
- });
1189
- }
1190
- return letterComparison;
1191
- };
1192
- const checkIsCaseCorrect = (listeningText, currentPhrase) => {
1193
- const words = listeningText.split(" ");
1194
- const isSingleWord = words.length === 1;
1195
- if (listeningText && listeningText) {
1196
- let phraseMatch = localeCompareCase(removeAllSymbols(listeningText), removeAllSymbols(currentPhrase.phrase));
1197
- if (phraseMatch === 0) {
1198
- return true;
1199
- } else if (currentPhrase && currentPhrase.alternativeVersions && currentPhrase.alternativeVersions.length > 0) {
1200
- for (let index = 0; index < currentPhrase.alternativeVersions.length; index += 1) {
1201
- const alternativeVersion = currentPhrase.alternativeVersions[index];
1202
- phraseMatch = localeCompareCase(removeAllSymbols(listeningText), removeAllSymbols(alternativeVersion));
1203
- if (phraseMatch === 0) {
1204
- return true;
1205
- }
1206
- }
1207
- } else if (isSingleWord && /^\d+$/.test(listeningText)) {
1208
- const numberToText = convertNumberToText(listeningText, learnLang);
1209
- phraseMatch = localeCompareCase(removeAllSymbols(numberToText), removeAllSymbols(currentPhrase.phrase));
1210
- if (phraseMatch === 0) {
1211
- return true;
1212
- }
1213
- } else if (!isSingleWord) {
1214
- let newStringArray = words;
1215
- words.map((word, index) => {
1216
- if (/^\d+$/.test(word)) {
1217
- const numberToText = convertNumberToText(word, learnLang);
1218
- newStringArray[index] = numberToText;
1219
- }
1220
- });
1221
- phraseMatch = localeCompareCase(removeAllSymbols(newStringArray.join(" ")), removeAllSymbols(currentPhrase.phrase));
1222
- if (phraseMatch === 0) {
1223
- return true;
1224
- }
1225
- }
1226
- return false;
1227
- }
1228
- };
1229
- const checkIsListeningCorrect = (listeningText, currentPhrase) => {
1230
- const words = listeningText.split(" ");
1231
- const isSingleWord = words.length === 1;
1232
- if (listeningText && listeningText) {
1233
- let phraseMatch = localeCompare(removeAllSymbols(listeningText), removeAllSymbols(currentPhrase.phrase));
1234
- if (phraseMatch === 0) {
1235
- return true;
1236
- } else if (currentPhrase && currentPhrase.alternativeVersions && currentPhrase.alternativeVersions.length > 0) {
1237
- for (let index = 0; index < currentPhrase.alternativeVersions.length; index += 1) {
1238
- const alternativeVersion = currentPhrase.alternativeVersions[index];
1239
- phraseMatch = localeCompare(removeAllSymbols(listeningText), removeAllSymbols(alternativeVersion));
1240
- if (phraseMatch === 0) {
1241
- return true;
1242
- }
1243
- }
1244
- } else if (isSingleWord && /^\d+$/.test(listeningText)) {
1245
- const numberToText = convertNumberToText(listeningText, learnLang);
1246
- phraseMatch = localeCompare(removeAllSymbols(numberToText), removeAllSymbols(currentPhrase.phrase));
1247
- if (phraseMatch === 0) {
1248
- return true;
1249
- }
1250
- } else if (!isSingleWord) {
1251
- let newStringArray = words;
1252
- words.map((word, index) => {
1253
- if (/^\d+$/.test(word)) {
1254
- const numberToText = convertNumberToText(word, learnLang);
1255
- newStringArray[index] = numberToText;
1256
- }
1257
- });
1258
- phraseMatch = localeCompare(removeAllSymbols(newStringArray.join(" ")), removeAllSymbols(currentPhrase.phrase));
1259
- if (phraseMatch === 0) {
1260
- return true;
1261
- }
1262
- }
1263
- return false;
1264
- }
1265
- };
1266
- const checkMeaning = (isSkipped, selectedOption, isWrite = false) => {
1267
- const question = questions[0];
1268
- if (!question) return;
1269
- let isCorrect;
1270
- let answerAttemptData;
1271
- if (isWrite) {
1272
- const meaningAttempt = readWriteText.trim();
1273
- isCorrect = checkIsMeaningCorrect(meaningAttempt, question.phrase, question.alternativeVersions);
1274
- answerAttemptData = {
1275
- attempt: meaningAttempt,
1276
- answer: question.phrase,
1277
- result: isSkipped ? "skipped" : isCorrect ? "correct" : "incorrect",
1278
- method: "text"
1279
- };
1280
- } else {
1281
- isCorrect = selectedOption?.isCorrect;
1282
- answerAttemptData = {
1283
- attempt: isSkipped ? "" : selectedOption?.text ?? "",
1284
- answer: question.phrase,
1285
- result: isSkipped ? "skipped" : isCorrect ? "correct" : "incorrect"
1286
- };
1287
- }
1288
- if (isSkipped) {
1289
- handleExerciseSkip(answerAttemptData);
1290
- } else if (isCorrect) {
1291
- handleCorrect(answerAttemptData);
1292
- } else {
1293
- handleIncorrect(answerAttemptData);
1294
- }
1295
- };
1296
- const handleRoleplayCorrect = message => {
1297
- setShowOptions(false);
1298
- openSnackbar(message || "correct", "success");
1299
- };
1300
- const handleCorrect = answerAttempt => {
1301
- !muteSound && correctSound.play();
1302
- if (exerciseName === "meaning-listen-and-speak") {
1303
- const {
1304
- voice,
1305
- voiceLanguageCode,
1306
- voicePitch
1307
- } = topicInfo;
1308
- speak(currentPhrase.phrase, voice, false, "#currentPhrase", voiceLanguageCode, false, voicePitch);
1309
- }
1310
- setAnswerAttempt(answerAttempt);
1311
- setIsCorrectResultOpen(true);
1312
- handleReset();
1313
- };
1314
- const handlePartiallyCorrect = answerAttempt => {
1315
- !muteSound && correctSound.play();
1316
- if (exerciseName === "meaning-listen-and-speak") {
1317
- const {
1318
- voice,
1319
- voiceLanguageCode,
1320
- voicePitch
1321
- } = topicInfo;
1322
- speak(currentPhrase.phrase, voice, false, "#currentPhrase", voiceLanguageCode, false, voicePitch);
1323
- }
1324
- setAnswerAttempt(answerAttempt);
1325
- setIsPartiallyCorrectResultOpen(true);
1326
- handleReset();
1327
- };
1328
- const handleIncorrect = answerAttempt => {
1329
- !muteSound && incorrectSound.play();
1330
- if (exerciseName === "meaning-listen-and-speak") {
1331
- const {
1332
- voice,
1333
- voiceLanguageCode,
1334
- voicePitch
1335
- } = topicInfo;
1336
- speak(currentPhrase.phrase, voice, false, "#currentPhrase", voiceLanguageCode, false, voicePitch);
1337
- }
1338
- setIsIncorrectResultOpen(true);
1339
- setAnswerAttempt(answerAttempt);
1340
- handleReset();
1341
- };
1342
- const handleExerciseSkip = answerAttempt => {
1343
- !muteSound && incorrectSound.play();
1344
- setIsSkipResultOpen(true);
1345
- setAnswerAttempt(answerAttempt);
1346
- handleReset();
1347
- };
1348
- const formatAnswerAttempt = async answerAttempt => {
1349
- if (checked && audioBlob) {
1350
- // upload blob, function returns url
1351
- const voiceAttemptURL = await uploadAudioAttempt(audioBlob);
1352
- answerAttempt.voiceAttempt = voiceAttemptURL;
1353
- }
1354
- return answerAttempt;
1355
- };
1356
- const handleIncorrectWordBank = async answerAttempt => {
1357
- !muteSound && incorrectSound.play();
1358
- setCheckAnswer(true);
1359
- setAnswerAttempt(answerAttempt);
1360
- const formattedAnswerAttempt = await formatAnswerAttempt(answerAttempt);
1361
- const newAnswerAttempts = [...answerAttempts, formattedAnswerAttempt];
1362
- setAnswerAttempts(newAnswerAttempts);
1363
- setIsWordBankAttemptChanged(false);
1364
- };
1365
- const formatBotMessages = async botMessages => {
1366
- const updatedConversationHistory = conversationHistory.slice(1);
1367
- const responses = await Promise.all(botMessages.map(async m => {
1368
- let conversationHistoryMessage = updatedConversationHistory.find(historyMsg => historyMsg.content?.trim() === m.text?.trim());
1369
- const updatedMessage = {
1370
- ...m,
1371
- studentInappropriate: m?.studentInappropriate === true || conversationHistoryMessage?.studentInappropriate === true ? true : false
1372
- };
1373
- if (updatedMessage.audioBlob) delete updatedMessage.audioBlob;
1374
- if (updatedMessage.audioURL) delete updatedMessage.audioURL;
1375
- if (updatedMessage.checked) delete updatedMessage.checked;
1376
- if (m.checked && m.audioBlob) {
1377
- const voiceAttemptURL = await uploadAudioAttempt(m.audioBlob);
1378
- return {
1379
- ...updatedMessage,
1380
- voiceAttempt: voiceAttemptURL
1381
- };
1382
- }
1383
- return updatedMessage;
1384
- }));
1385
- return responses;
1386
- };
1387
- const handleNextQuestion = async () => {
1388
- const {
1389
- result,
1390
- attempt
1391
- } = answerAttempt;
1392
- if (["translation", "listening", "pronunciation", "meaning", "meaning-listen-and-speak", "meaning-read-and-write"].includes(exerciseName)) {
1393
- if (result === "correct" || exerciseName === "pronunciation" && attempt !== "" || exerciseName === "listening" && result === "partially_correct" || exerciseName === "meaning-listen-and-speak" && result === "partially_correct") {
1394
- const newQs = questions.filter((_, i) => i !== 0);
1395
- const formattedAnswerAttempt = await formatAnswerAttempt(answerAttempt);
1396
- const newAnswerAttempts = [...answerAttempts, formattedAnswerAttempt];
1397
- setAnswerAttempts(newAnswerAttempts);
1398
- setQuestions(newQs);
1399
- handleSaveExerciseProgress(newQs, newAnswerAttempts);
1400
- if (!newQs.length > 0) {
1401
- handleCompleteExercise(newQs, newAnswerAttempts);
1402
- }
1403
- } else {
1404
- const newQs = [...questions, {
1405
- ...questions[0],
1406
- questionAttempted: true
1407
- }].filter((_, i) => i !== 0).slice();
1408
- const formattedAnswerAttempt = await formatAnswerAttempt(answerAttempt);
1409
- const newAnswerAttempts = [...answerAttempts, formattedAnswerAttempt];
1410
- setAnswerAttempts(newAnswerAttempts);
1411
- setQuestions(newQs);
1412
- handleSaveExerciseProgress(newQs, newAnswerAttempts);
1413
- if (result === "incorrect" && newQs.length === 1) {
1414
- handleCompleteExercise(newQs, newAnswerAttempts);
1415
- }
1416
- }
1417
- } else if (["roleplay"].includes(exerciseName)) {
1418
- const formattedAnswerAttempt = await formatAnswerAttempt(answerAttempt);
1419
- const newAnswerAttempts = [...answerAttempts, formattedAnswerAttempt];
1420
- setAnswerAttempts(newAnswerAttempts);
1421
- const script = roleplay.script;
1422
- const currentScriptLine = script[roleplayMessages.length];
1423
- addRoleplayMessage(currentScriptLine.text, currentScriptLine.actor === 2, true);
1424
- setRoleplayText("");
1425
- setDisableSkip(true);
1426
- }
1427
- if (clearAttemptAudio) {
1428
- clearAttemptAudio();
1429
- }
1430
- setAnswerAttempt(null);
1431
- setIsCorrectResultOpen(false);
1432
- setIsPartiallyCorrectResultOpen(false);
1433
- setIsSkipResultOpen(false);
1434
- setIsIncorrectResultOpen(false);
1435
- setTranscript("");
1436
- };
1437
- const addRoleplayMessage = (text, isMyMessage, playAudio) => {
1438
- if (!text) {
1439
- return;
1440
- }
1441
- text = removeExtraWhiteSpaces(text);
1442
- const voice = !isMyMessage ? roleplay.actor1 && roleplay.actor1.voice ? roleplay.actor1.voice : null : roleplay.actor2 && roleplay.actor2.voice ? roleplay.actor2.voice : null;
1443
- const voiceLanguageCode = !isMyMessage ? roleplay.actor1 && roleplay.actor1.voiceLanguageCode ? roleplay.actor1.voiceLanguageCode : null : roleplay.actor2 && roleplay.actor2.voiceLanguageCode ? roleplay.actor2.voiceLanguageCode : null;
1444
- const voicePitch = !isMyMessage ? roleplay.actor1 && roleplay.actor1.voicePitch ? roleplay.actor1.voicePitch : null : roleplay.actor2 && roleplay.actor2.voicePitch ? roleplay.actor2.voicePitch : null;
1445
- const message = {
1446
- isMyMessage: isMyMessage,
1447
- name: !isMyMessage ? roleplay.actor1 && roleplay.actor1.name ? roleplay.actor1.name : t("actor", {
1448
- number: "1"
1449
- }) : roleplay.actor2 && roleplay.actor2.name ? roleplay.actor2.name : t("actor", {
1450
- number: "2"
1451
- }),
1452
- userImage: !isMyMessage ? roleplay.actor1 && roleplay.actor1.picture ? roleplay.actor1.picture : null : roleplay.actor2 && roleplay.actor2.picture ? roleplay.actor2.picture : null,
1453
- voice: voice,
1454
- voicePitch: voicePitch,
1455
- text: formatMarkdownNewlines(text),
1456
- datetime: new Date()
1457
- };
1458
- if (gameId === "fill-in-the-blanks") {
1459
- let rand;
1460
- let finished = false;
1461
- let count = 0;
1462
- const chatArray = message.text.trim().split(/\s+/);
1463
- const blankArray = [];
1464
- if (chatArray.length > 2) {
1465
- // no other words in chat if blanks were taken out
1466
- while (!finished) {
1467
- rand = Math.floor(Math.random() * chatArray.length); // choose where to create blanks
1468
- if (!blankArray.includes(rand) && removeAllSymbolsFillInBlanks(chatArray[rand]) !== "") {
1469
- blankArray.push(rand);
1470
- count += 1;
1471
- if (count >= 2) {
1472
- finished = true;
1473
- break;
1474
- }
1475
- }
1476
- }
1477
- count = 0;
1478
- finished = false;
1479
- const blank1 = removeAllSymbolsFillInBlanks(chatArray[blankArray[0]]);
1480
- const blank2 = removeAllSymbolsFillInBlanks(chatArray[blankArray[1]]);
1481
- message.correctAnswer = message.text;
1482
- message.blanks = [blank1, blank2]; // two blanks for now
1483
- message.blankIndexes = blankArray;
1484
- message.text = replaceBlankWords(chatArray, message.blanks, blankArray);
1485
- const listOfWords = compileWords(roleplay.script, roleplayMessages.length);
1486
- let optionArray = [blank1, blank2];
1487
- while (!finished) {
1488
- rand = Math.floor(Math.random() * listOfWords.length);
1489
- const optionWord = removeAllSymbolsFillInBlanks(listOfWords[rand]);
1490
- if (!checkWordExists(optionArray, optionWord) && optionWord !== "") {
1491
- optionArray.push(optionWord);
1492
- count += 1;
1493
- if (count >= numberBlankOptions) {
1494
- finished = true;
1495
- break;
1496
- }
1497
- }
1498
- }
1499
- message.answers = optionArray.sort(() => 0.5 - Math.random()); // randomize order of array
1500
- }
1501
- }
1502
- if (playAudio !== false && learnLang !== "irish" && !isReadWriteModeStudent) {
1503
- speak(message.text, voice, false, `#message${roleplayMessages.length}`, voiceLanguageCode, false, voicePitch);
1504
- }
1505
- const updatedRoleplayMessages = [...roleplayMessages, message];
1506
- setRoleplayMessages(updatedRoleplayMessages);
1507
- handleSaveRoleplayExerciseProgress(updatedRoleplayMessages, answerAttempts);
1508
- };
1509
- const addBotMessage = (text, isMyMessage, playAudio, method = null, isErrorMsg = false, finalTranscript) => {
1510
- if (!text) {
1511
- return;
1512
- }
1513
- const voice = bot.voice ? bot.voice : null;
1514
- const voiceLanguageCode = bot.voiceLanguageCode ? bot.voiceLanguageCode : null;
1515
- const voicePitch = bot.voicePitch ? bot.voicePitch : null;
1516
- let message = {
1517
- isMyMessage,
1518
- userImage: isErrorMsg ? BotNualaImage : isMyMessage ? userAttributes && userAttributes.picture ? userAttributes.picture : null : bot && bot.botAvatar ? bot.botAvatar : null,
1519
- name: isErrorMsg ? "Bot" : isMyMessage ? userAttributes && userAttributes.preferred_username ? userAttributes.preferred_username : "Me" : bot && bot.name ? bot.name : "Bot",
1520
- voice,
1521
- voicePitch,
1522
- text,
1523
- datetime: new Date(),
1524
- method,
1525
- isEdited: finalTranscript && text.trim() !== finalTranscript.trim() && method === "text",
1526
- audioBlob: audioBlob && isMyMessage ? audioBlob : null,
1527
- audioURL: attemptAudioURL && isMyMessage ? attemptAudioURL : null,
1528
- checked: attemptAudioURL && isMyMessage && checked ? checked : null,
1529
- transcriptConfidence: attemptAudioURL && isMyMessage ? transcriptConfidence : null
1530
- };
1531
- if (text.includes(botErrorMessage)) {
1532
- message.text = t("play_bot_error");
1533
- }
1534
- if (playAudio !== false && learnLang !== "irish" && !isReadWriteModeStudent && !text.includes(botErrorMessage)) {
1535
- speak(text, voice, false, `#message${botMessages.length + 1}`, voiceLanguageCode, false, voicePitch);
1536
- }
1537
- setBotMessages(prevState => [...prevState, message]);
1538
- };
1539
- const getInitialStudentGreeting = learnLang => {
1540
- const langCode = getLearnLangCode(learnLang);
1541
- return langCode ? t("hello", {
1542
- lng: langCode
1543
- }).toLowerCase() : "hello";
1544
- };
1545
- const resetConversationHistory = () => {
1546
- setConversationHistory([]);
1547
- setIsFirstMessage(true);
1548
- };
1549
- const handleSubmitBotMessage = async () => {
1550
- try {
1551
- if (botText && botText.trim() !== "") {
1552
- const method = `${finalTranscript || ""} ${interimTranscript || ""}`.trim() === botText.trim() ? "voice" : "text";
1553
- addBotMessage(botText, true, false, method, false, finalTranscript);
1554
- resetTranscript();
1555
- const loadingMessage = {
1556
- isMyMessage: false,
1557
- userImage: bot && bot.botAvatar ? bot.botAvatar : null,
1558
- name: bot && bot.name ? bot.name : "Bot",
1559
- text: "Loading ...",
1560
- isLoading: true
1561
- };
1562
- setBotMessages(prevMessages => [...prevMessages, loadingMessage]);
1563
- const intialStudentGreeting = getInitialStudentGreeting(learnLang);
1564
- const body = {
1565
- message: botText,
1566
- vars: botVars,
1567
- isFirstMessage: Array.isArray(aiChatbotConversationHistory) && aiChatbotConversationHistory.length !== 0 ? false : isFirstMessage,
1568
- i18nLanguage,
1569
- isDynamicResponsesEnabled: isDynamicResponsesEnabled === "enable" ? true : false,
1570
- conversationHistory,
1571
- botProgess: aiChatbotConversationHistory,
1572
- botTemplate: bot.selectedTemplate ? bot.selectedTemplate : "",
1573
- intialStudentGreeting,
1574
- botIntroMessage: bot.introMessage ? bot.introMessage : ""
1575
- };
1576
- const response = await handleMessageBot(bot.botId, body);
1577
- if (response.errorMessage) {
1578
- openSnackbar(t("problem_getting_reply"), "error");
1579
- setBotMessages(prevMessages => prevMessages.filter(message => message.isLoading !== true));
1580
- addBotMessage(t("ai_chatbot_error_response"), false, false);
1581
- } else if (typeof response === "string" && response.startsWith("Syntax error:")) {
1582
- openSnackbar(response, "error");
1583
- }
1584
- if (response && response.reply) {
1585
- setBotText("");
1586
- setBotVars(response.vars);
1587
- setConversationHistory(response.conversationHistory);
1588
- handleReset();
1589
- if (clearAttemptAudio) {
1590
- clearAttemptAudio();
1591
- }
1592
- setBotMessages(prevMessages => prevMessages.filter(message => message.isLoading !== true));
1593
- addBotMessage(response.reply, false, true);
1594
- setIsFirstMessage(false);
1595
- }
1596
- }
1597
- } catch (error) {
1598
- console.error(error);
1599
- openSnackbar(t("problem_getting_reply"), "error");
1600
- setBotMessages(prevMessages => prevMessages.filter(message => message.isLoading !== true));
1601
- }
1602
- };
1603
- const viewReport = () => {
1604
- handleClose();
1605
- if (exerciseName === "bot") {
1606
- if (classroomId && courseId && sectionId && topicId) {
1607
- navigate(`/classrooms/${classroomId}/${courseId}/${sectionId}/${topicId}/activity/${exerciseName}?botId=${bot.botId}`);
1608
- } else if (courseId && sectionId && topicId) {
1609
- navigate(`/courses/${courseId}/${sectionId}/${topicId}/activity/${exerciseName}?botId=${bot.botId}`);
1610
- } else if (bot.botId) {
1611
- navigate(`/bots/${bot.botId}/activity`);
1612
- }
1613
- } else if (exerciseName === "roleplay") {
1614
- if (classroomId && courseId && sectionId && topicId) {
1615
- navigate(`/classrooms/${classroomId}/${courseId}/${sectionId}/${topicId}/activity/${exerciseName}?roleplayId=${roleplay.roleplayId}`);
1616
- } else if (courseId && sectionId && topicId) {
1617
- navigate(`/courses/${courseId}/${sectionId}/${topicId}/activity/${exerciseName}?roleplayId=${roleplay.roleplayId}`);
1618
- } else if (roleplay.roleplayId) {
1619
- navigate(`/roleplays/${roleplay.roleplayId}/activity/${roleplay.createdBy}/${roleplayCreatedAtId}`);
1620
- }
1621
- } else {
1622
- if (classroomId) {
1623
- navigate(`/classrooms/${classroomId}/${courseId}/${sectionId}/${topicId}/activity/${exerciseName}`);
1624
- } else {
1625
- navigate(`/courses/${courseId}/${sectionId}/${topicId}/activity/${exerciseName}`);
1626
- }
1627
- }
1628
- };
1629
- const handleCloseClicked = () => {
1630
- if (answerAttempts.length === 0 && botMessages.length === 0 && !roleplayHasStarted) {
1631
- isAssignmentExercise ? navigate(`/classrooms/${classroomId}#Assignments`) : handleClose();
1632
- } else {
1633
- openCloseModal();
1634
- }
1635
- };
1636
- const handleCloseExercise = () => {
1637
- closeCompletionModal();
1638
- closeInProgressModal();
1639
- closeCloseModal();
1640
- handleClose();
1641
- stopExerciseAudio();
1642
- };
1643
- const handleCompleteExercise = async (unansweredPhrases, newAnswerAttempts) => {
1644
- setIsCompletionModalOpen(true);
1645
- openCompletionModal();
1646
- closeInProgressModal();
1647
- closeCloseModal();
1648
- openSnackbar("exercise_complete", "success");
1649
- stopExerciseAudio();
1650
- const exerciseCompletion = {
1651
- exercise: `${exerciseName}${gameId && gameId !== "original" ? `-${gameId}` : ""}`,
1652
- exerciseStartTime: startTime,
1653
- courseId,
1654
- sectionId,
1655
- topicId
1656
- };
1657
- if (exerciseName === "bot") {
1658
- const {
1659
- botId,
1660
- picture,
1661
- botName,
1662
- description
1663
- } = bot;
1664
- exerciseCompletion.botId = botId;
1665
- exerciseCompletion.vars = botVars;
1666
- exerciseCompletion.picture = picture;
1667
- exerciseCompletion.botName = botName;
1668
- exerciseCompletion.description = description;
1669
- const formattedBotMessages = await formatBotMessages(botMessages);
1670
- exerciseCompletion.messages = formattedBotMessages;
1671
- } else if (exerciseName === "roleplay") {
1672
- const {
1673
- picture,
1674
- roleplayName,
1675
- description,
1676
- roleplayId
1677
- } = roleplay;
1678
- exerciseCompletion.gameId = gameId;
1679
- exerciseCompletion.selectedActor = isActorOne ? 1 : 2;
1680
- exerciseCompletion.actor1 = roleplay.actor1;
1681
- exerciseCompletion.actor2 = roleplay.actor2;
1682
- exerciseCompletion.answerAttempts = newAnswerAttempts && Array.isArray(newAnswerAttempts) ? newAnswerAttempts : answerAttempts;
1683
- exerciseCompletion.picture = picture;
1684
- exerciseCompletion.roleplayId = roleplayId;
1685
- exerciseCompletion.roleplayName = roleplayName;
1686
- exerciseCompletion.description = description;
1687
- exerciseCompletion.unansweredQuestions = [];
1688
- setRoleplayHasStarted(false);
1689
- setRoleplayMessages([]);
1690
- } else {
1691
- const {
1692
- topicName,
1693
- description
1694
- } = topicInfo;
1695
- exerciseCompletion.topicName = topicName;
1696
- exerciseCompletion.description = description;
1697
- exerciseCompletion.answerAttempts = newAnswerAttempts && Array.isArray(newAnswerAttempts) ? newAnswerAttempts : answerAttempts;
1698
- exerciseCompletion.unansweredPhrases = unansweredPhrases && Array.isArray(unansweredPhrases) ? unansweredPhrases : questions;
1699
- exerciseCompletion.remainingQuestions = remainingQuestions;
1700
- if (phraseListId) exerciseCompletion.phraseListId = phraseListId;
1701
- setQuestions(phrases.slice());
1702
- }
1703
- handleComplete(exerciseCompletion);
1704
- deleteProgress();
1705
- };
1706
- const handleSaveExerciseProgress = (remainingQuestions = [], answerAttempts = [], closeExercise = false) => {
1707
- const progressData = {
1708
- exercise: exerciseName,
1709
- remainingQuestions,
1710
- answerAttempts,
1711
- exerciseStartTime: startTime,
1712
- courseId,
1713
- sectionId,
1714
- topicId,
1715
- ...(phraseListId ? {
1716
- phraseListId
1717
- } : {})
1718
- };
1719
- handleSaveProgress(progressData);
1720
- if (closeExercise) {
1721
- handleCloseExercise();
1722
- }
1723
- };
1724
- const handleSaveRoleplayExerciseProgress = (existingMessages = [], answerAttempts = [], closeExercise = false) => {
1725
- handleSaveProgress({
1726
- exercise: `${exerciseName}${gameId && gameId !== "original" ? `-${gameId}` : ""}`,
1727
- roleplayId: roleplay.roleplayId,
1728
- gameId: gameId,
1729
- existingMessages,
1730
- answerAttempts,
1731
- exerciseStartTime: startTime,
1732
- selectedActor: isActorOne ? 1 : 2,
1733
- actor1: roleplay.actor1,
1734
- actor2: roleplay.actor2,
1735
- courseId,
1736
- sectionId,
1737
- topicId
1738
- });
1739
- if (closeExercise) {
1740
- handleCloseExercise();
1741
- }
1742
- };
1743
- const handleSaveBotExerciseProgress = async (existingMessages = [], existingVars = null, closeExercise = false) => {
1744
- const filteredMessages = existingMessages.filter(message => !message.isLoading);
1745
- const formattedBotMessages = await formatBotMessages(filteredMessages);
1746
- handleSaveProgress({
1747
- exercise: exerciseName,
1748
- botId: bot.botId,
1749
- existingMessages: formattedBotMessages,
1750
- existingVars,
1751
- exerciseStartTime: startTime,
1752
- courseId,
1753
- sectionId,
1754
- topicId
1755
- });
1756
- if (closeExercise) {
1757
- handleCloseExercise();
1758
- }
1759
- };
1760
- const handlePronunciationTourFinished = () => {
1761
- setIsTourFinished(true);
1762
- };
1763
- const handleListeningTourFinished = () => {
1764
- setIsTourFinished(true);
1765
- };
1766
- const handleTranslationTourFinished = () => {
1767
- setIsTourFinished(true);
1768
- };
1769
- const handleTryAgain = async () => {
1770
- const formattedAnswerAttempt = await formatAnswerAttempt(answerAttempt);
1771
- const newAnswerAttempts = [...answerAttempts, formattedAnswerAttempt];
1772
- setAnswerAttempts(newAnswerAttempts);
1773
- if (exerciseName === "roleplay") {
1774
- handleSaveRoleplayExerciseProgress(roleplayMessages, newAnswerAttempts);
1775
- } else {
1776
- handleSaveExerciseProgress(questions, newAnswerAttempts);
1777
- }
1778
- if (clearAttemptAudio) {
1779
- clearAttemptAudio();
1780
- }
1781
- setAnswerAttempt(null);
1782
- setIsCorrectResultOpen(false);
1783
- setIsPartiallyCorrectResultOpen(false);
1784
- setIsIncorrectResultOpen(false);
1785
- setIsSkipResultOpen(false);
1786
- handleCloseConfidence();
1787
- };
1788
- const compileWords = (chats, index) => {
1789
- let returnArray = [];
1790
- for (let i = 0; i < chats.length; i += 1) {
1791
- if (!chats[i]?.question && i !== index) {
1792
- // don't want to choose words from current chat
1793
- const stringArray = chats[i].text.split(" ");
1794
- returnArray = returnArray.concat(stringArray);
1795
- }
1796
- }
1797
- return returnArray;
1798
- };
1799
- const replaceBlankWords = (chat, words, blankArray) => {
1800
- const chatCopy = chat;
1801
- chatCopy[blankArray[0]] = chatCopy[blankArray[0]].replace(removeAllSymbolsFillInBlanks(chatCopy[blankArray[0]]), "_____");
1802
- chatCopy[blankArray[1]] = chatCopy[blankArray[1]].replace(removeAllSymbolsFillInBlanks(chatCopy[blankArray[1]]), "_____");
1803
- let fillBlank = [...chatCopy].join(" ");
1804
- return fillBlank;
1805
- };
1806
- // Commented out to fix lint warning - no-unused-vars
1807
- // const addQuestionsToChats = (chats, blankChats) => {
1808
- // const newChatArray = [];
1809
- // const chatArray = [...chats];
1810
- // let blankChatCounter = 0;
1811
- // for (let i = 0; i < chatArray.length; i += 1) {
1812
- // if (!chatArray[i].question) {
1813
- // if (blankChats[blankChatCounter].question) {
1814
- // chatArray[i].text = blankChats[blankChatCounter].text;
1815
- // newChatArray.push(chatArray[i]);
1816
- // newChatArray.push(blankChats[blankChatCounter]);
1817
- // } else {
1818
- // newChatArray.push(chatArray[i]);
1819
- // }
1820
- // blankChatCounter += 1;
1821
- // }
1822
- // }
1823
- // return newChatArray;
1824
- // }
1825
-
1826
- const checkWordExists = (wordArray, word) => {
1827
- for (let i = 0; i < wordArray.length; i++) {
1828
- if (wordArray[i].toLowerCase() === word.toLowerCase()) {
1829
- return true;
1830
- }
1831
- }
1832
- return false;
1833
- };
1834
- const checkIsRoleplayMessageCorrect = (finalTranscript, answer) => {
1835
- const words = finalTranscript.split(" ");
1836
- const isSingleWord = words.length === 1;
1837
- let stringMatch = localeCompare(removeAllSymbols(finalTranscript).trim(), removeAllSymbols(answer).trim());
1838
- if (stringMatch === 0) {
1839
- return true;
1840
- } // If answer contains words && finaltranscript contains digits
1841
- else if (isSingleWord && /^\d+$/.test(finalTranscript)) {
1842
- const numberToText = convertNumberToText(finalTranscript, learnLang);
1843
- stringMatch = localeCompare(removeAllSymbols(numberToText), removeAllSymbols(answer));
1844
- if (stringMatch === 0) {
1845
- return true;
1846
- }
1847
- } else if (!isSingleWord) {
1848
- let newStringArray = words;
1849
- words.map((word, index) => {
1850
- if (/^\d+$/.test(word)) {
1851
- const numberToText = convertNumberToText(word, learnLang);
1852
- newStringArray[index] = numberToText;
1853
- }
1854
- stringMatch = localeCompare(removeAllSymbols(newStringArray.join(" ")), removeAllSymbols(currentPhrase.phrase));
1855
- if (stringMatch === 0) {
1856
- return true;
1857
- }
1858
- });
1859
- }
1860
- return false;
1861
- };
1862
- const checkRoleplayPronunciation = (finalTranscript, answer) => {
1863
- let correctWordConfidenceScoreTotal = 0;
1864
- let correctWordCounter = 0;
1865
- const isCorrect = checkIsRoleplayMessageCorrect(finalTranscript, answer);
1866
- const answerArray = removeExtraWhiteSpaces(answer).split(" ");
1867
- (finalTranscript || interimTranscript).split(" ").forEach((word, i) => {
1868
- const isWordCorrect = answerArray[i] && checkIsRoleplayMessageCorrect(word.trim(), answerArray[i].trim());
1869
- if (isWordCorrect) {
1870
- correctWordCounter += 1;
1871
- const wordIndex = (transcriptWords || []).findIndex(w => w.word === word.trim());
1872
- if (wordIndex > -1 && transcriptWords[wordIndex].confidence) {
1873
- correctWordConfidenceScoreTotal += transcriptWords[wordIndex].confidence;
1874
- } else {
1875
- correctWordConfidenceScoreTotal += transcriptConfidence;
1876
- }
1877
- }
1878
- });
1879
- const transcriptCompleteness = correctWordCounter / answerArray.length;
1880
-
1881
- // A confidence score the awards 0 to an incorrect word
1882
- const transcriptCorrectWordConfidence = correctWordConfidenceScoreTotal / answerArray.length;
1883
- const pronunciationScore = (transcriptCorrectWordConfidence + transcriptCompleteness) / 2;
1884
- const answerAttempt = {
1885
- attempt: finalTranscript ? finalTranscript : interimTranscript,
1886
- answer: answer,
1887
- result: isCorrect ? "correct" : correctWordCounter >= 1 ? "partially_correct" : "incorrect",
1888
- transcriptConfidence,
1889
- transcriptCorrectWordConfidence,
1890
- transcriptCompleteness,
1891
- transcriptWords,
1892
- pronunciationScore
1893
- };
1894
- if (isCorrect && isCorrect === true) {
1895
- handleCorrect(answerAttempt);
1896
- } else if (correctWordCounter >= 1) {
1897
- handlePartiallyCorrect(answerAttempt);
1898
- } else {
1899
- handleIncorrect(answerAttempt);
1900
- }
1901
- };
1902
- return {
1903
- questions,
1904
- currentPhrase,
1905
- currentTranslations,
1906
- wordOptions,
1907
- wordLibrary,
1908
- translationText,
1909
- translationWords,
1910
- listeningText,
1911
- listeningWords,
1912
- useWordBank,
1913
- isWordBankHidden,
1914
- roleplayText,
1915
- roleplayMessages,
1916
- sentenceLibrary,
1917
- roleplayHasStarted,
1918
- botMessages,
1919
- botText,
1920
- botVars,
1921
- handleMute,
1922
- muteSound,
1923
- isSpeaking,
1924
- setIsSpeaking,
1925
- isSpeakingTextContainer,
1926
- isConfidenceOpen,
1927
- answerAttempt,
1928
- isCorrectResultOpen,
1929
- isIncorrectResultOpen,
1930
- isSkipResultOpen,
1931
- answerAttempts,
1932
- pollyResult,
1933
- startTime,
1934
- isCloseModalOpen,
1935
- isInProgressModalOpen,
1936
- isCompletionModalOpen,
1937
- voiceSpeed,
1938
- isVoiceSpeedMenuOpen,
1939
- isPartiallyCorrectResultOpen,
1940
- transcript,
1941
- setTranscript,
1942
- setIsPartiallyCorrectResultOpen,
1943
- handleOpenVoiceSpeedMenu,
1944
- handleCloseVoiceSpeedMenu,
1945
- handleChangeVoiceSpeed,
1946
- isReportProblemOpen,
1947
- handleCloseReportProblem,
1948
- handleOpenReportProblem,
1949
- openCloseModal,
1950
- closeCloseModal,
1951
- openInProgressModal,
1952
- closeInProgressModal,
1953
- openCompletionModal,
1954
- closeCompletionModal,
1955
- handleCloseConfidence,
1956
- handleOpenConfidence,
1957
- handleInputChange,
1958
- setTranslationWords,
1959
- setListeningWords,
1960
- setUseWordBank,
1961
- handleUseWordBank,
1962
- checkIsPronunciationCorrect,
1963
- checkIsTranslationCorrect,
1964
- checkIsListeningCorrect,
1965
- checkIsLetterCorrect,
1966
- checkIsRoleplayMessageCorrect,
1967
- setRoleplayText,
1968
- getActorName,
1969
- handleSkip,
1970
- handleNextQuestion,
1971
- playAllEnabled,
1972
- setPlayAllEnabled,
1973
- roleplayInProgress,
1974
- setRoleplayInProgress,
1975
- finishedRoleplay,
1976
- setFinishedRoleplay,
1977
- setIsCloseModalOpen,
1978
- setIsInProgressModalOpen,
1979
- setIsCompletionModalOpen,
1980
- disableSkip,
1981
- handleSelectAnswerOption,
1982
- startRoleplay,
1983
- isActorOne,
1984
- isMyTurn,
1985
- showOptions,
1986
- setShowOptions,
1987
- answerOptions,
1988
- handleMakeAttempt,
1989
- handleCorrectQuestionAnswer,
1990
- handleIncorrectQuestionAnswer,
1991
- setBotText,
1992
- addBotMessage,
1993
- handleSubmitBotMessage,
1994
- handleContinue,
1995
- speak,
1996
- stopSpeaking,
1997
- handleRestart,
1998
- handlePlayAgain,
1999
- handleReset,
2000
- handleRestartExercise,
2001
- viewReport,
2002
- roleplayCreatedAtId,
2003
- handleSaveExerciseProgress,
2004
- handleSaveRoleplayExerciseProgress,
2005
- handleSaveBotExerciseProgress,
2006
- handleCompleteExercise,
2007
- handleCloseExercise,
2008
- selectedActor,
2009
- handleCloseClicked,
2010
- isTourFinished,
2011
- handlePronunciationTourFinished,
2012
- handleListeningTourFinished,
2013
- handleTranslationTourFinished,
2014
- handleTryAgain,
2015
- setIsCorrectResultOpen,
2016
- setIsIncorrectResultOpen,
2017
- setIsSkipResultOpen,
2018
- handleIncorrect,
2019
- checkRoleplayPronunciation,
2020
- handleNext,
2021
- checked,
2022
- setChecked,
2023
- setBotMessages,
2024
- setInAnswerOptions,
2025
- setBotVars,
2026
- actorHasBeenSelected,
2027
- setActorHasBeenSelected,
2028
- checkAnswer,
2029
- setCheckAnswer,
2030
- isWordBankAttemptChanged,
2031
- setIsWordBankAttemptChanged,
2032
- isKeyboardHidden,
2033
- setWordOptions,
2034
- setIsAssignmentExercise,
2035
- resetConversationHistory,
2036
- setAnswerAttempt,
2037
- readWriteText
2038
- };
2039
- }