@tinyweb_dev/oe-exam-sdk 0.1.1 → 0.1.2

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 (485) hide show
  1. package/dist/api/exam-create.js +1 -179
  2. package/dist/api/exam-create.types.js +1 -1
  3. package/dist/api/exam-questions.js +1 -98
  4. package/dist/api/exam-questions.types.js +1 -1
  5. package/dist/api/exam-taking.js +1 -73
  6. package/dist/api/exam-taking.types.js +1 -1
  7. package/dist/api/index.js +1 -6
  8. package/dist/api/result-review.js +1 -50
  9. package/dist/api/result-review.types.js +1 -1
  10. package/dist/components/CueCardEditor.js +1 -58
  11. package/dist/components/common/ResolvedImage.js +1 -15
  12. package/dist/components/exams/CreateExamInfoForm.js +1 -35
  13. package/dist/components/exams/CreateExamPageContainer.js +1 -103
  14. package/dist/components/exams/ExamCreator.js +1 -89
  15. package/dist/components/exams/ExamPartTabs.js +1 -40
  16. package/dist/components/exams/ExamQuestionGrid.js +1 -18
  17. package/dist/components/exams/ExamQuestionsPageContainer.js +1 -90
  18. package/dist/components/exams/PartAudioUploader.js +1 -9
  19. package/dist/components/exams/TemplateSelector.js +1 -66
  20. package/dist/components/exams/api.js +1 -3
  21. package/dist/components/exams/create-exam.validation.js +1 -18
  22. package/dist/components/exams/exam-template.utils.js +1 -18
  23. package/dist/components/exams/index.js +1 -10
  24. package/dist/components/exams/take/ExamTakingPageContainer.js +1 -153
  25. package/dist/components/exams/take/GenericQuestionRenderer.js +1 -14
  26. package/dist/components/exams/take/exam-taking.utils.js +1 -88
  27. package/dist/components/exams/take/hooks/useSpeakingRecorder.js +1 -24
  28. package/dist/components/exams/take/index.js +1 -2
  29. package/dist/components/exams/take/types.js +1 -1
  30. package/dist/components/index.js +1 -42
  31. package/dist/components/questions/_shared/config/question-types.config.js +1 -333
  32. package/dist/components/questions/_shared/constants/color-palette.js +1 -21
  33. package/dist/components/questions/_shared/hooks/useAnswerGroupQuestionGroup.js +1 -105
  34. package/dist/components/questions/_shared/hooks/useBasicQuestionGroup.js +1 -222
  35. package/dist/components/questions/_shared/hooks/useCompareImagesGroup.js +1 -140
  36. package/dist/components/questions/_shared/hooks/useImageQuestionGroup.js +1 -123
  37. package/dist/components/questions/_shared/hooks/useInfoExchangeGroup.js +1 -50
  38. package/dist/components/questions/_shared/hooks/useQuestionFormState.js +1 -54
  39. package/dist/components/questions/_shared/hooks/useQuestionInitialization.js +1 -123
  40. package/dist/components/questions/_shared/hooks/useQuestionListGroup.js +1 -121
  41. package/dist/components/questions/_shared/hooks/useQuestionOnChange.js +1 -70
  42. package/dist/components/questions/_shared/hooks/useSceneQuestionGroup.js +1 -194
  43. package/dist/components/questions/_shared/index.js +1 -7
  44. package/dist/components/questions/_shared/types/answer-the-question.type.js +1 -1
  45. package/dist/components/questions/_shared/types/arrange-letters-into-words.type.js +1 -1
  46. package/dist/components/questions/_shared/types/choose-correct-adjective.type.js +1 -3
  47. package/dist/components/questions/_shared/types/color-region.config.js +1 -1
  48. package/dist/components/questions/_shared/types/fill-in-blank.type.js +1 -1
  49. package/dist/components/questions/_shared/types/fill-missing-words-in-grid.type.js +1 -1
  50. package/dist/components/questions/_shared/types/gn-speaking-interview.type.js +1 -1
  51. package/dist/components/questions/_shared/types/index.js +1 -12
  52. package/dist/components/questions/_shared/types/label-the-picture.type.js +1 -1
  53. package/dist/components/questions/_shared/types/listen-and-choose-from-answer-group.type.js +1 -1
  54. package/dist/components/questions/_shared/types/listen-and-choose-objects-in-scene.type.js +1 -1
  55. package/dist/components/questions/_shared/types/listen-and-drag-objects-into-scene.type.js +1 -1
  56. package/dist/components/questions/_shared/types/listen-and-speak-answer.type.js +1 -1
  57. package/dist/components/questions/_shared/types/listen-and-speak-compare-images.type.js +1 -1
  58. package/dist/components/questions/_shared/types/listen-and-speak-image-group.type.js +1 -1
  59. package/dist/components/questions/_shared/types/listen-and-speak-info-exchange.type.js +1 -1
  60. package/dist/components/questions/_shared/types/listen-and-speak-odd-one-out.type.js +1 -3
  61. package/dist/components/questions/_shared/types/listen-and-speak-question-list.type.js +1 -1
  62. package/dist/components/questions/_shared/types/listen-and-speak-with-story-images.type.js +1 -3
  63. package/dist/components/questions/_shared/types/listen-and-tick-answer.type.js +1 -1
  64. package/dist/components/questions/_shared/types/listening-drawline.type.js +1 -1
  65. package/dist/components/questions/_shared/types/look-and-choose-answer.type.js +1 -1
  66. package/dist/components/questions/_shared/types/look-picture-fill-word-hint.type.js +1 -1
  67. package/dist/components/questions/_shared/types/match-by-writing-answer.type.js +1 -1
  68. package/dist/components/questions/_shared/types/multiple-choice.type.js +1 -1
  69. package/dist/components/questions/_shared/types/question-group.type.js +1 -11
  70. package/dist/components/questions/_shared/types/read-and-color-objects.type.js +1 -1
  71. package/dist/components/questions/_shared/types/read-displayed-content.type.js +1 -1
  72. package/dist/components/questions/_shared/types/read-passage-and-answer-questions.type.js +1 -1
  73. package/dist/components/questions/_shared/types/speaking-describe-image.type.js +1 -1
  74. package/dist/components/questions/_shared/types/spontaneous-qa.type.js +1 -1
  75. package/dist/components/questions/_shared/types/word-fill-paragraph-with-options.type.js +1 -1
  76. package/dist/components/questions/_shared/types/word-fill-paragraph.type.js +1 -1
  77. package/dist/components/questions/_shared/types/word-fill-structured-form.type.js +1 -1
  78. package/dist/components/questions/_shared/types/word-ordering.type.js +1 -1
  79. package/dist/components/questions/_shared/types/write-a-short-letter.type.js +1 -1
  80. package/dist/components/questions/_shared/types/write-correct-verb-form.type.js +1 -3
  81. package/dist/components/questions/_shared/types/write-sentences.type.js +1 -1
  82. package/dist/components/questions/_shared/types/write-short-paragraph.type.js +1 -1
  83. package/dist/components/questions/_shared/utils/answer-builder.js +1 -79
  84. package/dist/components/questions/_shared/utils/createColorRegionRegistration.js +1 -39
  85. package/dist/components/questions/_shared/utils/id-generator.js +1 -3
  86. package/dist/components/questions/_shared/utils/question-validation.js +1 -21
  87. package/dist/components/questions/components/ColorNode.js +1 -85
  88. package/dist/components/questions/components/ColorRegionClient.js +1 -545
  89. package/dist/components/questions/components/ColorRegionCreator.js +1 -420
  90. package/dist/components/questions/components/ColorRegionNode.js +1 -59
  91. package/dist/components/questions/components/CreatorGuide.js +1 -103
  92. package/dist/components/questions/components/NameNode.js +1 -26
  93. package/dist/components/questions/components/QuestionBankOption.js +1 -46
  94. package/dist/components/questions/components/QuestionBasicInfoForm.js +1 -9
  95. package/dist/components/questions/components/QuestionCommonFields.js +1 -33
  96. package/dist/components/questions/components/QuestionSearchDropdown.js +1 -258
  97. package/dist/components/questions/components/QuestionTypeSelector.js +1 -32
  98. package/dist/components/questions/components/QuestionTypeSpecificForms.js +1 -6
  99. package/dist/components/questions/components/RegionNode.js +1 -94
  100. package/dist/components/questions/components/index.js +1 -14
  101. package/dist/components/questions/creator/QuestionCreator.js +1 -90
  102. package/dist/components/questions/creator/QuestionGroupCreator.js +1 -119
  103. package/dist/components/questions/creator/dedicated-component-router.js +1 -79
  104. package/dist/components/questions/creator/index.js +1 -3
  105. package/dist/components/questions/creator/question-type-registry.js +1 -80
  106. package/dist/components/questions/groups/ArticlesGroupCard.js +1 -121
  107. package/dist/components/questions/groups/BasicQuestionGroupCard.js +1 -50
  108. package/dist/components/questions/groups/DocumentGroupCard.js +1 -114
  109. package/dist/components/questions/groups/MatchAnswerGroupCard.js +1 -25
  110. package/dist/components/questions/index.js +1 -10
  111. package/dist/components/questions/types/answer-the-question/AnswerTheQuestionClient.js +1 -37
  112. package/dist/components/questions/types/answer-the-question/AnswerTheQuestionCreator.js +1 -351
  113. package/dist/components/questions/types/answer-the-question/register.js +1 -67
  114. package/dist/components/questions/types/answer-the-question/transform.js +1 -36
  115. package/dist/components/questions/types/arrange-letters-into-words/ArrangeLettersIntoWordsClient.js +1 -141
  116. package/dist/components/questions/types/arrange-letters-into-words/ArrangeLettersIntoWordsCreator.js +1 -118
  117. package/dist/components/questions/types/arrange-letters-into-words/index.js +1 -2
  118. package/dist/components/questions/types/arrange-letters-into-words/register.js +1 -4
  119. package/dist/components/questions/types/arrange-letters-into-words/transform.js +1 -24
  120. package/dist/components/questions/types/choose-correct-adjective/ChooseCorrectAdjectiveClient.js +1 -64
  121. package/dist/components/questions/types/choose-correct-adjective/ChooseCorrectAdjectiveCreator.js +1 -169
  122. package/dist/components/questions/types/choose-correct-adjective/index.js +1 -2
  123. package/dist/components/questions/types/choose-correct-adjective/register.js +1 -55
  124. package/dist/components/questions/types/choose-correct-adjective/transform.js +1 -16
  125. package/dist/components/questions/types/choose-the-correct-answer/ChooseTheCorrectAnswerClient.js +1 -131
  126. package/dist/components/questions/types/choose-the-correct-answer/ChooseTheCorrectAnswerCreator.js +1 -581
  127. package/dist/components/questions/types/choose-the-correct-answer/index.js +1 -2
  128. package/dist/components/questions/types/choose-the-correct-answer/register.js +1 -101
  129. package/dist/components/questions/types/choose-the-correct-answer/transform.js +1 -43
  130. package/dist/components/questions/types/fill-in-blank/FillInBlankClient.js +1 -275
  131. package/dist/components/questions/types/fill-in-blank/FillInBlankCreator.js +1 -448
  132. package/dist/components/questions/types/fill-in-blank/index.js +1 -2
  133. package/dist/components/questions/types/fill-in-blank/register.js +1 -138
  134. package/dist/components/questions/types/fill-in-blank/transform.js +1 -59
  135. package/dist/components/questions/types/fill-missing-words-in-grid/FillMissingWordsInGridClient.js +1 -117
  136. package/dist/components/questions/types/fill-missing-words-in-grid/FillMissingWordsInGridCreator.js +1 -671
  137. package/dist/components/questions/types/fill-missing-words-in-grid/index.js +1 -2
  138. package/dist/components/questions/types/fill-missing-words-in-grid/register.js +1 -37
  139. package/dist/components/questions/types/fill-missing-words-in-grid/transform.js +1 -15
  140. package/dist/components/questions/types/gn-speaking-interview/GNSpeakingInterviewCreator.js +1 -262
  141. package/dist/components/questions/types/gn-speaking-interview/register.js +1 -121
  142. package/dist/components/questions/types/gn-speaking-interview/transform.js +1 -48
  143. package/dist/components/questions/types/image-object-matching/ImageObjectMatchingClient.js +1 -16
  144. package/dist/components/questions/types/image-object-matching/ImageObjectMatchingCreator.js +1 -27
  145. package/dist/components/questions/types/image-object-matching/index.js +1 -2
  146. package/dist/components/questions/types/image-object-matching/register.js +1 -3
  147. package/dist/components/questions/types/image-object-matching/transform.js +1 -2
  148. package/dist/components/questions/types/label-the-picture/LabelThePictureClient.js +1 -102
  149. package/dist/components/questions/types/label-the-picture/LabelThePictureCreator.js +1 -344
  150. package/dist/components/questions/types/label-the-picture/index.js +1 -2
  151. package/dist/components/questions/types/label-the-picture/register.js +1 -54
  152. package/dist/components/questions/types/label-the-picture/transform.js +1 -28
  153. package/dist/components/questions/types/listen-and-choose-from-answer-group/ListenAndChooseFromAnswerGroupClient.js +1 -78
  154. package/dist/components/questions/types/listen-and-choose-from-answer-group/ListenAndChooseFromAnswerGroupCreator.js +1 -232
  155. package/dist/components/questions/types/listen-and-choose-from-answer-group/index.js +1 -2
  156. package/dist/components/questions/types/listen-and-choose-from-answer-group/register.js +1 -82
  157. package/dist/components/questions/types/listen-and-choose-from-answer-group/transform.js +1 -27
  158. package/dist/components/questions/types/listen-and-choose-objects-in-scene/ListenAndChooseObjectsInSceneClient.js +1 -70
  159. package/dist/components/questions/types/listen-and-choose-objects-in-scene/ListenAndChooseObjectsInSceneCreator.js +1 -386
  160. package/dist/components/questions/types/listen-and-choose-objects-in-scene/index.js +1 -2
  161. package/dist/components/questions/types/listen-and-choose-objects-in-scene/register.js +1 -100
  162. package/dist/components/questions/types/listen-and-choose-objects-in-scene/transform.js +1 -33
  163. package/dist/components/questions/types/listen-and-drag-objects-into-scene/ListenAndDragObjectsIntoSceneClient.js +1 -106
  164. package/dist/components/questions/types/listen-and-drag-objects-into-scene/ListenAndDragObjectsIntoSceneCreator.js +1 -457
  165. package/dist/components/questions/types/listen-and-drag-objects-into-scene/index.js +1 -2
  166. package/dist/components/questions/types/listen-and-drag-objects-into-scene/register.js +1 -110
  167. package/dist/components/questions/types/listen-and-drag-objects-into-scene/transform.js +1 -35
  168. package/dist/components/questions/types/listen-and-speak-answer/ArrowIndicator.js +1 -8
  169. package/dist/components/questions/types/listen-and-speak-answer/ListenAndSpeakAnswerClient.js +1 -22
  170. package/dist/components/questions/types/listen-and-speak-answer/ListenAndSpeakAnswerCreator.js +1 -291
  171. package/dist/components/questions/types/listen-and-speak-answer/index.js +1 -2
  172. package/dist/components/questions/types/listen-and-speak-answer/register.js +1 -84
  173. package/dist/components/questions/types/listen-and-speak-answer/transform.js +1 -27
  174. package/dist/components/questions/types/listen-and-speak-compare-images/ListenAndSpeakCompareImagesClient.js +1 -32
  175. package/dist/components/questions/types/listen-and-speak-compare-images/ListenAndSpeakCompareImagesCreator.js +1 -295
  176. package/dist/components/questions/types/listen-and-speak-compare-images/register.js +1 -79
  177. package/dist/components/questions/types/listen-and-speak-compare-images/transform.js +1 -27
  178. package/dist/components/questions/types/listen-and-speak-image-group/ListenAndSpeakImageGroupClient.js +1 -34
  179. package/dist/components/questions/types/listen-and-speak-image-group/ListenAndSpeakImageGroupCreator.js +1 -285
  180. package/dist/components/questions/types/listen-and-speak-image-group/register.js +1 -81
  181. package/dist/components/questions/types/listen-and-speak-image-group/transform.js +1 -26
  182. package/dist/components/questions/types/listen-and-speak-info-exchange/ListenAndSpeakInfoExchangeClient.js +1 -38
  183. package/dist/components/questions/types/listen-and-speak-info-exchange/ListenAndSpeakInfoExchangeCreator.js +1 -385
  184. package/dist/components/questions/types/listen-and-speak-info-exchange/register.js +1 -87
  185. package/dist/components/questions/types/listen-and-speak-info-exchange/transform.js +1 -32
  186. package/dist/components/questions/types/listen-and-speak-odd-one-out/ListenAndSpeakOddOneOutClient.js +1 -26
  187. package/dist/components/questions/types/listen-and-speak-odd-one-out/ListenAndSpeakOddOneOutCreator.js +1 -247
  188. package/dist/components/questions/types/listen-and-speak-odd-one-out/register.js +1 -59
  189. package/dist/components/questions/types/listen-and-speak-odd-one-out/transform.js +1 -18
  190. package/dist/components/questions/types/listen-and-speak-question-list/ListenAndSpeakQuestionListClient.js +1 -26
  191. package/dist/components/questions/types/listen-and-speak-question-list/ListenAndSpeakQuestionListCreator.js +1 -256
  192. package/dist/components/questions/types/listen-and-speak-question-list/register.js +1 -81
  193. package/dist/components/questions/types/listen-and-speak-question-list/transform.js +1 -26
  194. package/dist/components/questions/types/listen-and-speak-with-story-images/ListenAndSpeakWithStoryImagesClient.js +1 -26
  195. package/dist/components/questions/types/listen-and-speak-with-story-images/ListenAndSpeakWithStoryImagesCreator.js +1 -230
  196. package/dist/components/questions/types/listen-and-speak-with-story-images/register.js +1 -56
  197. package/dist/components/questions/types/listen-and-speak-with-story-images/transform.js +1 -16
  198. package/dist/components/questions/types/look-picture-choose-correct-answer/LookPictureChooseCorrectAnswerClient.js +1 -72
  199. package/dist/components/questions/types/look-picture-choose-correct-answer/LookPictureChooseCorrectAnswerCreator.js +1 -230
  200. package/dist/components/questions/types/look-picture-choose-correct-answer/index.js +1 -1
  201. package/dist/components/questions/types/look-picture-choose-correct-answer/register.js +1 -66
  202. package/dist/components/questions/types/look-picture-choose-correct-answer/transform.js +1 -42
  203. package/dist/components/questions/types/look-picture-fill-blank-choose-answer/LookPictureFillBlankChooseAnswerClient.js +1 -96
  204. package/dist/components/questions/types/look-picture-fill-blank-choose-answer/LookPictureFillBlankChooseAnswerCreator.js +1 -238
  205. package/dist/components/questions/types/look-picture-fill-blank-choose-answer/index.js +1 -2
  206. package/dist/components/questions/types/look-picture-fill-blank-choose-answer/register.js +1 -76
  207. package/dist/components/questions/types/look-picture-fill-blank-choose-answer/transform.js +1 -19
  208. package/dist/components/questions/types/look-picture-fill-word-hint/LookPictureFillWordHintClient.js +1 -134
  209. package/dist/components/questions/types/look-picture-fill-word-hint/LookPictureFillWordHintCreator.js +1 -617
  210. package/dist/components/questions/types/look-picture-fill-word-hint/index.js +1 -2
  211. package/dist/components/questions/types/look-picture-fill-word-hint/register.js +1 -82
  212. package/dist/components/questions/types/look-picture-fill-word-hint/transform.js +1 -29
  213. package/dist/components/questions/types/match-by-writing-answer/MatchByWritingAnswerClient.js +1 -38
  214. package/dist/components/questions/types/match-by-writing-answer/MatchByWritingAnswerCreator.js +1 -359
  215. package/dist/components/questions/types/match-by-writing-answer/index.js +1 -3
  216. package/dist/components/questions/types/match-by-writing-answer/register.js +1 -58
  217. package/dist/components/questions/types/match-by-writing-answer/transform.js +1 -61
  218. package/dist/components/questions/types/read-and-color-objects/ReadAndColorObjectsClient.js +1 -16
  219. package/dist/components/questions/types/read-and-color-objects/ReadAndColorObjectsCreator.js +1 -23
  220. package/dist/components/questions/types/read-and-color-objects/index.js +1 -2
  221. package/dist/components/questions/types/read-and-color-objects/register.js +1 -3
  222. package/dist/components/questions/types/read-and-color-objects/transform.js +1 -36
  223. package/dist/components/questions/types/read-displayed-content/ReadDisplayedContentCreator.js +1 -125
  224. package/dist/components/questions/types/read-displayed-content/register.js +1 -64
  225. package/dist/components/questions/types/read-displayed-content/transform.js +1 -12
  226. package/dist/components/questions/types/read-passage-and-answer-questions/ReadPassageAndAnswerQuestionsClient.js +1 -64
  227. package/dist/components/questions/types/read-passage-and-answer-questions/ReadPassageAndAnswerQuestionsCreator.js +1 -511
  228. package/dist/components/questions/types/read-passage-and-answer-questions/index.js +1 -2
  229. package/dist/components/questions/types/read-passage-and-answer-questions/register.js +1 -58
  230. package/dist/components/questions/types/read-passage-and-answer-questions/transform.js +1 -28
  231. package/dist/components/questions/types/speaking-conversation/SpeakingConversationCreator.js +1 -373
  232. package/dist/components/questions/types/speaking-conversation/SpeakingConversationPreviewClient.js +1 -41
  233. package/dist/components/questions/types/speaking-conversation/register.js +1 -110
  234. package/dist/components/questions/types/speaking-conversation/transform.js +1 -34
  235. package/dist/components/questions/types/speaking-cue-card/SpeakingCueCardCreator.js +1 -74
  236. package/dist/components/questions/types/speaking-cue-card/register.js +1 -52
  237. package/dist/components/questions/types/speaking-cue-card/transform.js +1 -12
  238. package/dist/components/questions/types/speaking-describe-image/SpeakingDescribeImageClient.js +1 -10
  239. package/dist/components/questions/types/speaking-describe-image/SpeakingDescribeImageCreator.js +1 -161
  240. package/dist/components/questions/types/speaking-describe-image/index.js +1 -2
  241. package/dist/components/questions/types/speaking-describe-image/register.js +1 -69
  242. package/dist/components/questions/types/speaking-describe-image/transform.js +1 -16
  243. package/dist/components/questions/types/spontaneous-qa/SpontaneousQACreator.js +1 -234
  244. package/dist/components/questions/types/spontaneous-qa/register.js +1 -93
  245. package/dist/components/questions/types/spontaneous-qa/transform.js +1 -34
  246. package/dist/components/questions/types/true-false/TrueFalseClient.js +1 -75
  247. package/dist/components/questions/types/true-false/TrueFalseCreator.js +1 -244
  248. package/dist/components/questions/types/true-false/index.js +1 -2
  249. package/dist/components/questions/types/true-false/register.js +1 -77
  250. package/dist/components/questions/types/true-false/transform.js +1 -32
  251. package/dist/components/questions/types/word-fill-paragraph/WordFillParagraphClient.js +1 -233
  252. package/dist/components/questions/types/word-fill-paragraph/WordFillParagraphCreator.js +1 -631
  253. package/dist/components/questions/types/word-fill-paragraph/WordFillParagraphWrapper.js +1 -28
  254. package/dist/components/questions/types/word-fill-paragraph/index.js +1 -2
  255. package/dist/components/questions/types/word-fill-paragraph/register.js +1 -136
  256. package/dist/components/questions/types/word-fill-paragraph/transform.js +1 -56
  257. package/dist/components/questions/types/word-fill-structured-form/WordFillStructuredFormClient.js +1 -138
  258. package/dist/components/questions/types/word-fill-structured-form/WordFillStructuredFormCreator.js +1 -261
  259. package/dist/components/questions/types/word-fill-structured-form/index.js +1 -2
  260. package/dist/components/questions/types/word-fill-structured-form/register.js +1 -67
  261. package/dist/components/questions/types/word-fill-structured-form/transform.js +1 -40
  262. package/dist/components/questions/types/word-ordering/WordOrderingClient.js +1 -84
  263. package/dist/components/questions/types/word-ordering/WordOrderingCreator.js +1 -192
  264. package/dist/components/questions/types/word-ordering/index.js +1 -2
  265. package/dist/components/questions/types/word-ordering/register.js +1 -46
  266. package/dist/components/questions/types/word-ordering/transform.js +1 -24
  267. package/dist/components/questions/types/write-a-short-letter/WriteAShortLetterClient.js +1 -98
  268. package/dist/components/questions/types/write-a-short-letter/WriteAShortLetterCreator.js +1 -320
  269. package/dist/components/questions/types/write-a-short-letter/index.js +1 -2
  270. package/dist/components/questions/types/write-a-short-letter/register.js +1 -68
  271. package/dist/components/questions/types/write-a-short-letter/transform.js +1 -25
  272. package/dist/components/questions/types/write-correct-verb-form/WriteCorrectVerbFormClient.js +1 -61
  273. package/dist/components/questions/types/write-correct-verb-form/WriteCorrectVerbFormCreator.js +1 -196
  274. package/dist/components/questions/types/write-correct-verb-form/index.js +1 -2
  275. package/dist/components/questions/types/write-correct-verb-form/register.js +1 -62
  276. package/dist/components/questions/types/write-correct-verb-form/transform.js +1 -17
  277. package/dist/components/questions/types/write-sentences/WriteSentencesClient.js +1 -22
  278. package/dist/components/questions/types/write-sentences/WriteSentencesCreator.js +1 -174
  279. package/dist/components/questions/types/write-sentences/index.js +1 -2
  280. package/dist/components/questions/types/write-sentences/register.js +1 -58
  281. package/dist/components/questions/types/write-sentences/transform.js +1 -28
  282. package/dist/components/questions/types/write-short-paragraph/WriteShortParagraphClient.js +1 -96
  283. package/dist/components/questions/types/write-short-paragraph/WriteShortParagraphCreator.js +1 -161
  284. package/dist/components/questions/types/write-short-paragraph/index.js +1 -2
  285. package/dist/components/questions/types/write-short-paragraph/register.js +1 -4
  286. package/dist/components/questions/types/write-short-paragraph/transform.js +1 -21
  287. package/dist/components/questions/viewer/QuestionGroupViewer.js +1 -36
  288. package/dist/components/questions/viewer/QuestionViewer.js +1 -446
  289. package/dist/components/questions/viewer/index.js +1 -2
  290. package/dist/components/results/ResultReviewPageContainer.js +1 -98
  291. package/dist/components/results/ReviewQuestionRenderer.js +1 -72
  292. package/dist/components/results/index.js +1 -2
  293. package/dist/components/results/result-review.utils.js +1 -6
  294. package/dist/components/results/review-data.js +1 -150
  295. package/dist/components/results/review-renderer.utils.js +1 -97
  296. package/dist/components/results/review-types.js +1 -1
  297. package/dist/components/themes/cambridge-yle/CambridgeYleAudioPlayer.js +1 -138
  298. package/dist/components/themes/cambridge-yle/CambridgeYleBottomNav.js +1 -12
  299. package/dist/components/themes/cambridge-yle/CambridgeYleExamLayout.js +1 -18
  300. package/dist/components/themes/cambridge-yle/CambridgeYleExampleText.js +1 -11
  301. package/dist/components/themes/cambridge-yle/CambridgeYleHeader.js +1 -11
  302. package/dist/components/themes/cambridge-yle/CambridgeYleInstructionBanner.js +1 -9
  303. package/dist/components/themes/cambridge-yle/CambridgeYleNavButton.js +1 -13
  304. package/dist/components/themes/cambridge-yle/CambridgeYlePartBanner.js +1 -8
  305. package/dist/components/themes/cambridge-yle/CambridgeYleProgressBar.js +1 -6
  306. package/dist/components/themes/cambridge-yle/CambridgeYleQuestionCard.js +1 -5
  307. package/dist/components/themes/cambridge-yle/CambridgeYleQuestionCardFullWidth.js +1 -9
  308. package/dist/components/themes/cambridge-yle/CambridgeYleSidebar.js +1 -41
  309. package/dist/components/themes/cambridge-yle/CambridgeYleTimer.js +1 -25
  310. package/dist/components/themes/cambridge-yle/index.js +1 -13
  311. package/dist/components/themes/english-certification/EcAnswerTheQuestion.js +1 -24
  312. package/dist/components/themes/english-certification/EcMatchByWritingAnswer.js +1 -88
  313. package/dist/components/themes/english-certification/EcWordFillParagraph.js +1 -55
  314. package/dist/components/themes/english-certification/EcWordFillStructuredForm.js +1 -156
  315. package/dist/components/themes/english-certification/EcWritingTask.js +1 -34
  316. package/dist/components/themes/english-certification/EnglishCertificationAudioPlayer.js +1 -114
  317. package/dist/components/themes/english-certification/EnglishCertificationBrand.js +1 -11
  318. package/dist/components/themes/english-certification/EnglishCertificationExamLayout.js +1 -21
  319. package/dist/components/themes/english-certification/EnglishCertificationFlagButton.js +1 -15
  320. package/dist/components/themes/english-certification/EnglishCertificationFooterBar.js +1 -19
  321. package/dist/components/themes/english-certification/EnglishCertificationGroupedQuestion.js +1 -148
  322. package/dist/components/themes/english-certification/EnglishCertificationHeader.js +1 -31
  323. package/dist/components/themes/english-certification/EnglishCertificationNavigationPanel.js +1 -71
  324. package/dist/components/themes/english-certification/EnglishCertificationOptionSelector.js +1 -33
  325. package/dist/components/themes/english-certification/EnglishCertificationPassagePanel.js +1 -16
  326. package/dist/components/themes/english-certification/EnglishCertificationQuestionCard.js +1 -22
  327. package/dist/components/themes/english-certification/EnglishCertificationQuestionItem.js +1 -37
  328. package/dist/components/themes/english-certification/EnglishCertificationQuestionRenderer.js +1 -72
  329. package/dist/components/themes/english-certification/EnglishCertificationReadingSection.js +1 -90
  330. package/dist/components/themes/english-certification/EnglishCertificationSingleQuestion.js +1 -18
  331. package/dist/components/themes/english-certification/EnglishCertificationSingleQuestionList.js +1 -29
  332. package/dist/components/themes/english-certification/english-certification-theme.js +1 -58
  333. package/dist/components/themes/english-certification/grouped-question-utils.js +1 -218
  334. package/dist/components/themes/english-certification/index.js +1 -21
  335. package/dist/components/themes/index.js +1 -6
  336. package/dist/components/themes/summer-sky/SummerSkyAudioPlayer.js +1 -170
  337. package/dist/components/themes/summer-sky/SummerSkyLayout.js +1 -221
  338. package/dist/components/themes/summer-sky/SummerSkySubmitModal.js +1 -18
  339. package/dist/components/themes/summer-sky/SummerSkyWaitingRoom.js +1 -194
  340. package/dist/components/themes/types.js +1 -1
  341. package/dist/components/ui/alert-dialog.js +1 -26
  342. package/dist/components/ui/alert.js +1 -22
  343. package/dist/components/ui/avatar.js +1 -12
  344. package/dist/components/ui/badge.js +1 -38
  345. package/dist/components/ui/button.js +1 -35
  346. package/dist/components/ui/calendar.js +1 -76
  347. package/dist/components/ui/card.js +1 -16
  348. package/dist/components/ui/carousel.js +1 -91
  349. package/dist/components/ui/checkbox.js +1 -9
  350. package/dist/components/ui/collapsible.js +1 -13
  351. package/dist/components/ui/command.js +1 -34
  352. package/dist/components/ui/confirm-dialog.js +1 -49
  353. package/dist/components/ui/dialog.js +1 -23
  354. package/dist/components/ui/drawer.js +1 -35
  355. package/dist/components/ui/dropdown-menu.js +1 -33
  356. package/dist/components/ui/file-upload.js +1 -155
  357. package/dist/components/ui/form.js +1 -62
  358. package/dist/components/ui/hover-card.js +1 -10
  359. package/dist/components/ui/image-preview.js +1 -29
  360. package/dist/components/ui/input.js +1 -8
  361. package/dist/components/ui/label.js +1 -9
  362. package/dist/components/ui/language-switcher.js +1 -15
  363. package/dist/components/ui/multi-select.js +1 -90
  364. package/dist/components/ui/points-input.js +1 -33
  365. package/dist/components/ui/popover.js +1 -26
  366. package/dist/components/ui/progress.js +1 -16
  367. package/dist/components/ui/radio-group.js +1 -12
  368. package/dist/components/ui/scroll-area.js +1 -11
  369. package/dist/components/ui/select.js +1 -38
  370. package/dist/components/ui/separator.js +1 -8
  371. package/dist/components/ui/sheet.js +1 -40
  372. package/dist/components/ui/single-select.js +1 -76
  373. package/dist/components/ui/skeleton.js +1 -6
  374. package/dist/components/ui/switch.js +1 -8
  375. package/dist/components/ui/table.js +1 -20
  376. package/dist/components/ui/tabs.js +1 -17
  377. package/dist/components/ui/textarea.js +1 -8
  378. package/dist/components/ui/tooltip.js +1 -11
  379. package/dist/index.js +1 -19
  380. package/dist/mcp/config.js +1 -32
  381. package/dist/mcp/http-client.js +1 -48
  382. package/dist/mcp/index.js +1 -29
  383. package/dist/mcp/tools/_helpers.js +1 -25
  384. package/dist/mcp/tools/exams.js +1 -439
  385. package/dist/mcp/tools/index.js +1 -6
  386. package/dist/mcp/tools/results.js +1 -19
  387. package/dist/shared/constants/ApiConstant.js +1 -276
  388. package/dist/shared/constants/QueryKeyConstant.js +1 -112
  389. package/dist/shared/constants/exam-level.enum.js +1 -41
  390. package/dist/shared/constants/landings/placement-test.constants.js +1 -431
  391. package/dist/shared/constants/question-skills.js +1 -267
  392. package/dist/shared/constants/routes.js +1 -81
  393. package/dist/shared/index.js +1 -7
  394. package/dist/shared/lib/hooks/index.js +1 -10
  395. package/dist/shared/lib/hooks/useAlertDialog.js +1 -57
  396. package/dist/shared/lib/hooks/useAudioPlayCounter.js +1 -30
  397. package/dist/shared/lib/hooks/useAudioPreview.js +1 -81
  398. package/dist/shared/lib/hooks/useAudioUpload.js +1 -24
  399. package/dist/shared/lib/hooks/useConfirmDialog.js +1 -89
  400. package/dist/shared/lib/hooks/useDebouncedCallback.js +1 -32
  401. package/dist/shared/lib/hooks/useDelayedAutoPlay.js +1 -12
  402. package/dist/shared/lib/hooks/useFileUpload.js +1 -24
  403. package/dist/shared/lib/hooks/useImageUrl.js +1 -5
  404. package/dist/shared/lib/hooks/usePresignedFileUrl.js +1 -10
  405. package/dist/shared/lib/hooks/useReactHookForm.js +1 -31
  406. package/dist/shared/lib/hooks/useToast.js +1 -62
  407. package/dist/shared/lib/i18n/index.js +1 -54
  408. package/dist/shared/lib/i18n/messages/en/admin.js +1 -2104
  409. package/dist/shared/lib/i18n/messages/en/auth.js +1 -86
  410. package/dist/shared/lib/i18n/messages/en/common.js +1 -140
  411. package/dist/shared/lib/i18n/messages/en/file-upload.js +1 -18
  412. package/dist/shared/lib/i18n/messages/en/student.js +1 -133
  413. package/dist/shared/lib/i18n/messages/en/terms.js +1 -37
  414. package/dist/shared/lib/i18n/messages/en.js +1 -15
  415. package/dist/shared/lib/i18n/messages/vi/admin.js +1 -2104
  416. package/dist/shared/lib/i18n/messages/vi/auth.js +1 -86
  417. package/dist/shared/lib/i18n/messages/vi/common.js +1 -140
  418. package/dist/shared/lib/i18n/messages/vi/file-upload.js +1 -18
  419. package/dist/shared/lib/i18n/messages/vi/student.js +1 -133
  420. package/dist/shared/lib/i18n/messages/vi/terms.js +1 -37
  421. package/dist/shared/lib/i18n/messages/vi.js +1 -15
  422. package/dist/shared/lib/i18n/types.js +1 -1
  423. package/dist/shared/lib/stores/examQuestionStore.js +1 -212
  424. package/dist/shared/lib/stores/localeStore.js +1 -10
  425. package/dist/shared/lib/utils/public-page.js +1 -44
  426. package/dist/shared/lib/utils/question-transform-types.js +1 -1
  427. package/dist/shared/lib/utils/question-transform.js +1 -174
  428. package/dist/shared/lib/utils.js +1 -168
  429. package/dist/shared/lib/validation/choose-correct-answer.validation.js +1 -111
  430. package/dist/shared/lib/validation/label-the-picture.validation.js +1 -19
  431. package/dist/shared/lib/validation/listen-and-choose-from-answer-group.validation.js +1 -46
  432. package/dist/shared/lib/validation/listen-and-choose-objects-in-scene.validation.js +1 -21
  433. package/dist/shared/lib/validation/listen-and-drag-objects-into-scene.validation.js +1 -34
  434. package/dist/shared/lib/validation/listen-and-speak-answer.validation.js +1 -40
  435. package/dist/shared/lib/validation/listen-and-speak-compare-images.validation.js +1 -45
  436. package/dist/shared/lib/validation/listen-and-speak-image-group.validation.js +1 -19
  437. package/dist/shared/lib/validation/listen-and-speak-info-exchange.validation.js +1 -39
  438. package/dist/shared/lib/validation/listen-and-speak-odd-one-out.validation.js +1 -32
  439. package/dist/shared/lib/validation/listen-and-speak-question-list.validation.js +1 -19
  440. package/dist/shared/lib/validation/listen-and-speak-with-story-images.validation.js +1 -28
  441. package/dist/shared/lib/validation/look-picture-choose-correct-answer.validation.js +1 -12
  442. package/dist/shared/lib/validation/look-picture-fill-blank-choose-answer.validation.js +1 -47
  443. package/dist/shared/lib/validation/read-and-color-objects.validation.js +1 -29
  444. package/dist/shared/lib/validation/read-displayed-content.validation.js +1 -28
  445. package/dist/shared/lib/validation/speaking-conversation.validation.js +1 -75
  446. package/dist/shared/lib/validation/speaking-describe-image.validation.js +1 -31
  447. package/dist/shared/lib/validation/spontaneous-qa.validation.js +1 -48
  448. package/dist/shared/lib/validation/word-fill-paragraph-default.validation.js +1 -38
  449. package/dist/shared/lib/validation/word-fill-paragraph-with-options.validation.js +1 -39
  450. package/dist/shared/lib/validation/word-fill-paragraph.validation.js +1 -43
  451. package/dist/shared/lib/validation/word-ordering.validation.js +1 -33
  452. package/dist/shared/types/branch.types.js +1 -6
  453. package/dist/shared/types/common.types.js +1 -50
  454. package/dist/shared/types/entities/exam-schedule.types.js +1 -5
  455. package/dist/shared/types/entities/exam.types.js +1 -1
  456. package/dist/shared/types/entities/question.types.js +1 -4
  457. package/dist/shared/types/entities/result.types.js +1 -4
  458. package/dist/shared/types/entities/user.types.js +1 -4
  459. package/dist/shared/types/exam-taking.types.js +1 -2
  460. package/dist/shared/types/history.types.js +1 -34
  461. package/dist/shared/types/index.js +1 -1
  462. package/dist/shared/types/questions/choose-correct-adjective.js +1 -4
  463. package/dist/shared/types/questions/choose-the-correct-answer.js +1 -9
  464. package/dist/shared/types/questions/fill-missing-words-in-grid.js +1 -11
  465. package/dist/shared/types/questions/index.js +1 -40
  466. package/dist/shared/types/questions/listen-and-speak-answer.js +1 -1
  467. package/dist/shared/types/questions/listen-and-speak-compare-images.js +1 -1
  468. package/dist/shared/types/questions/listen-and-speak-image-group.js +1 -1
  469. package/dist/shared/types/questions/listen-and-speak-info-exchange.js +1 -3
  470. package/dist/shared/types/questions/listen-and-speak-odd-one-out.js +1 -3
  471. package/dist/shared/types/questions/listen-and-speak-question-list.js +1 -1
  472. package/dist/shared/types/questions/listen-and-speak-with-story-images.js +1 -3
  473. package/dist/shared/types/questions/look-picture-choose-correct-answer.js +1 -5
  474. package/dist/shared/types/questions/look-picture-fill-blank-choose-answer.js +1 -9
  475. package/dist/shared/types/questions/look-picture-fill-word-hint.js +1 -7
  476. package/dist/shared/types/questions/read-displayed-content.js +1 -1
  477. package/dist/shared/types/questions/speaking-conversation.js +1 -7
  478. package/dist/shared/types/questions/speaking-describe-image.js +1 -1
  479. package/dist/shared/types/questions/spontaneous-qa.js +1 -1
  480. package/dist/shared/types/questions/write-correct-verb-form.js +1 -12
  481. package/dist/shared/types/role.types.js +1 -1
  482. package/dist/shared/types/structure-management.js +1 -28
  483. package/dist/shared/types/student.types.js +1 -54
  484. package/dist/shared/types/teacher-dashboard-rooms.js +1 -2
  485. package/package.json +4 -2
@@ -1,123 +1 @@
1
- import { useEffect, useRef } from 'react';
2
- export function useQuestionInitialization({ initialData, prefilledType, prefilledSkill, updateField, }) {
3
- const isInitializingRef = useRef(false);
4
- const previousInitialDataRef = useRef(null);
5
- const previousPrefilledTypeRef = useRef(undefined);
6
- const previousPrefilledSkillRef = useRef(undefined);
7
- const updateFieldRef = useRef(updateField);
8
- // Keep updateField ref up to date
9
- useEffect(() => {
10
- updateFieldRef.current = updateField;
11
- }, [updateField]);
12
- useEffect(() => {
13
- // Check if initialData actually changed
14
- const initialDataChanged = JSON.stringify(previousInitialDataRef.current) !== JSON.stringify(initialData);
15
- const prefilledTypeChanged = previousPrefilledTypeRef.current !== prefilledType;
16
- const prefilledSkillChanged = previousPrefilledSkillRef.current !== prefilledSkill;
17
- // Only proceed if something actually changed
18
- if (!initialDataChanged && !prefilledTypeChanged && !prefilledSkillChanged) {
19
- return;
20
- }
21
- if (initialDataChanged) {
22
- isInitializingRef.current = true;
23
- previousInitialDataRef.current = initialData;
24
- }
25
- if (prefilledTypeChanged) {
26
- previousPrefilledTypeRef.current = prefilledType;
27
- }
28
- if (prefilledSkillChanged) {
29
- previousPrefilledSkillRef.current = prefilledSkill;
30
- }
31
- // Set prefilled values
32
- if (prefilledType) {
33
- updateFieldRef.current('questionType', prefilledType);
34
- }
35
- else if (initialData?.type) {
36
- updateFieldRef.current('questionType', initialData.type);
37
- }
38
- if (prefilledSkill) {
39
- updateFieldRef.current('skill', prefilledSkill);
40
- }
41
- // Load initial data if provided
42
- if (initialData) {
43
- if (initialData.content)
44
- updateFieldRef.current('content', initialData.content);
45
- if (initialData.level)
46
- updateFieldRef.current('level', initialData.level);
47
- if (initialData.difficulty)
48
- updateFieldRef.current('difficulty', initialData.difficulty);
49
- if (initialData.skill)
50
- updateFieldRef.current('skill', initialData.skill);
51
- if (initialData.points)
52
- updateFieldRef.current('points', initialData.points);
53
- // Load answer data based on question type
54
- if (initialData.answer) {
55
- const answerData = initialData.answer;
56
- switch (initialData.type) {
57
- case 'LISTEN_AND_FILL_IN_THE_BLANK_WITH_IMAGE':
58
- if (answerData.audioUrl)
59
- updateFieldRef.current('audioUrl', answerData.audioUrl);
60
- if (answerData.blanks)
61
- updateFieldRef.current('blanks', answerData.blanks);
62
- break;
63
- case 'CHOOSE_THE_CORRECT_ANSWER':
64
- if (answerData.options)
65
- updateFieldRef.current('options', answerData.options);
66
- if (answerData.correctAnswer !== undefined)
67
- updateFieldRef.current('correctOption', answerData.correctAnswer);
68
- if (answerData.imageUrl)
69
- updateFieldRef.current('mcImageUrl', answerData.imageUrl);
70
- if (answerData.audioUrl)
71
- updateFieldRef.current('audioUrl', answerData.audioUrl);
72
- break;
73
- case 'TICK_TRUE_OR_FALSE':
74
- case 'TICK_YES_OR_NO':
75
- if (answerData.statements)
76
- updateFieldRef.current('statements', answerData.statements);
77
- break;
78
- case 'ARRANGE_LETTERS_INTO_WORDS':
79
- if (answerData.subQuestions) {
80
- updateFieldRef.current('arrangeLettersData', {
81
- subQuestions: answerData.subQuestions,
82
- });
83
- }
84
- break;
85
- case 'READ_PASSAGE_AND_COMPLETE_STORY':
86
- if (answerData.passage)
87
- updateFieldRef.current('passage', answerData.passage);
88
- if (answerData.blanks)
89
- updateFieldRef.current('passageBlanks', answerData.blanks);
90
- break;
91
- case 'FILL_MISSING_WORDS_IN_GRID':
92
- if (answerData.grid)
93
- updateFieldRef.current('fillMissingWordsInGrid', answerData.grid);
94
- if (answerData.rows !== undefined)
95
- updateFieldRef.current('fillMissingWordsInGridRows', answerData.rows);
96
- if (answerData.columns !== undefined)
97
- updateFieldRef.current('fillMissingWordsInGridColumns', answerData.columns);
98
- if (answerData.missingLetters)
99
- updateFieldRef.current('fillMissingWordsInGridAnswers', answerData.missingLetters);
100
- break;
101
- case 'LOOK_PICTURE_CHOOSE_CORRECT_ANSWER':
102
- case 'LOOK_PICTURE_FILL_BLANK_CHOOSE_ANSWER':
103
- if (answerData.subQuestions)
104
- updateFieldRef.current('lookPictureChooseSubQuestions', answerData.subQuestions);
105
- break;
106
- case 'LOOK_PICTURE_FILL_WORD_HINT':
107
- if (answerData.subQuestions)
108
- updateFieldRef.current('lookPictureFillWordHintSubQuestions', answerData.subQuestions);
109
- break;
110
- }
111
- }
112
- }
113
- // Reset flag after initialization completes
114
- if (initialDataChanged) {
115
- setTimeout(() => {
116
- isInitializingRef.current = false;
117
- }, 100);
118
- }
119
- }, [initialData, prefilledType, prefilledSkill]);
120
- return {
121
- isInitializing: () => isInitializingRef.current,
122
- };
123
- }
1
+ import{useEffect as r,useRef as e}from"react";export function useQuestionInitialization({initialData:s,prefilledType:t,prefilledSkill:n,updateField:i}){const u=e(!1),c=e(null),o=e(void 0),l=e(void 0),a=e(i);return r(()=>{a.current=i},[i]),r(()=>{const r=JSON.stringify(c.current)!==JSON.stringify(s),e=o.current!==t,i=l.current!==n;if(r||e||i){if(r&&(u.current=!0,c.current=s),e&&(o.current=t),i&&(l.current=n),t?a.current("questionType",t):s?.type&&a.current("questionType",s.type),n&&a.current("skill",n),s&&(s.content&&a.current("content",s.content),s.level&&a.current("level",s.level),s.difficulty&&a.current("difficulty",s.difficulty),s.skill&&a.current("skill",s.skill),s.points&&a.current("points",s.points),s.answer)){const r=s.answer;switch(s.type){case"LISTEN_AND_FILL_IN_THE_BLANK_WITH_IMAGE":r.audioUrl&&a.current("audioUrl",r.audioUrl),r.blanks&&a.current("blanks",r.blanks);break;case"CHOOSE_THE_CORRECT_ANSWER":r.options&&a.current("options",r.options),void 0!==r.correctAnswer&&a.current("correctOption",r.correctAnswer),r.imageUrl&&a.current("mcImageUrl",r.imageUrl),r.audioUrl&&a.current("audioUrl",r.audioUrl);break;case"TICK_TRUE_OR_FALSE":case"TICK_YES_OR_NO":r.statements&&a.current("statements",r.statements);break;case"ARRANGE_LETTERS_INTO_WORDS":r.subQuestions&&a.current("arrangeLettersData",{subQuestions:r.subQuestions});break;case"READ_PASSAGE_AND_COMPLETE_STORY":r.passage&&a.current("passage",r.passage),r.blanks&&a.current("passageBlanks",r.blanks);break;case"FILL_MISSING_WORDS_IN_GRID":r.grid&&a.current("fillMissingWordsInGrid",r.grid),void 0!==r.rows&&a.current("fillMissingWordsInGridRows",r.rows),void 0!==r.columns&&a.current("fillMissingWordsInGridColumns",r.columns),r.missingLetters&&a.current("fillMissingWordsInGridAnswers",r.missingLetters);break;case"LOOK_PICTURE_CHOOSE_CORRECT_ANSWER":case"LOOK_PICTURE_FILL_BLANK_CHOOSE_ANSWER":r.subQuestions&&a.current("lookPictureChooseSubQuestions",r.subQuestions);break;case"LOOK_PICTURE_FILL_WORD_HINT":r.subQuestions&&a.current("lookPictureFillWordHintSubQuestions",r.subQuestions)}}r&&setTimeout(()=>{u.current=!1},100)}},[s,t,n]),{isInitializing:()=>u.current}}
@@ -1,121 +1 @@
1
- 'use client';
2
- import { useState, useEffect, useRef } from 'react';
3
- import { useExamQuestionStore } from '../../../../shared/lib/stores/examQuestionStore';
4
- export function getGroupNumberForIndex(questionIndexInPart, groups) {
5
- if (!groups || groups.length === 0 || questionIndexInPart === undefined)
6
- return 1;
7
- let cumulative = 0;
8
- for (const group of groups) {
9
- cumulative += group.questionCount;
10
- if (questionIndexInPart < cumulative) {
11
- return group.number;
12
- }
13
- }
14
- return groups[groups.length - 1]?.number ?? 1;
15
- }
16
- export function useQuestionListGroup({ partId, groups, questionIndexInPart, initialData, }) {
17
- const setSharedListData = useExamQuestionStore((s) => s.setSharedListData);
18
- const getSharedListData = useExamQuestionStore((s) => s.getSharedListData);
19
- const sharedListData = useExamQuestionStore((s) => s.sharedListData);
20
- const isGrouped = Boolean(groups && groups.length > 0);
21
- const currentGroupNumber = getGroupNumberForIndex(questionIndexInPart, groups);
22
- const resolveInitial = () => {
23
- if (isGrouped && partId) {
24
- const stored = getSharedListData(partId, currentGroupNumber);
25
- if (stored && stored.questions !== undefined) {
26
- return {
27
- questions: stored.questions && stored.questions.length > 0
28
- ? stored.questions
29
- : initialData?.questions ?? [],
30
- };
31
- }
32
- }
33
- return {
34
- questions: initialData?.questions ?? [],
35
- };
36
- };
37
- const initial = resolveInitial();
38
- const [questionsState, setQuestionsState] = useState(initial.questions ?? []);
39
- const prevGroupNumberRef = useRef(currentGroupNumber);
40
- useEffect(() => {
41
- if (!isGrouped || !partId)
42
- return;
43
- if (!initialData)
44
- return;
45
- const stored = getSharedListData(partId, currentGroupNumber);
46
- if (stored && stored.questions !== undefined)
47
- return;
48
- const newQuestions = initialData.questions && initialData.questions.length > 0
49
- ? initialData.questions
50
- : null;
51
- if (newQuestions === null)
52
- return;
53
- setQuestionsState(newQuestions);
54
- setSharedListData(partId, currentGroupNumber, {
55
- ...(stored || {}),
56
- questions: newQuestions,
57
- });
58
- // eslint-disable-next-line react-hooks/exhaustive-deps
59
- }, [initialData, partId, currentGroupNumber, isGrouped]);
60
- useEffect(() => {
61
- if (prevGroupNumberRef.current === currentGroupNumber)
62
- return;
63
- prevGroupNumberRef.current = currentGroupNumber;
64
- if (!isGrouped || !partId)
65
- return;
66
- const stored = getSharedListData(partId, currentGroupNumber);
67
- if (stored && stored.questions && stored.questions.length > 0) {
68
- setQuestionsState(stored.questions);
69
- }
70
- else {
71
- setQuestionsState(initialData?.questions ?? []);
72
- }
73
- // eslint-disable-next-line react-hooks/exhaustive-deps
74
- }, [currentGroupNumber, partId, isGrouped]);
75
- // ------------------------------------------------------------------
76
- // Subscribe to external store changes (from other questions in group)
77
- // ------------------------------------------------------------------
78
- useEffect(() => {
79
- if (!isGrouped || !partId)
80
- return;
81
- const stored = getSharedListData(partId, currentGroupNumber);
82
- if (stored && stored.questions) {
83
- // Only update if references/lengths differ to avoid infinite loops,
84
- // or perform a deep comparison if needed. For now, basic length/ref check:
85
- setQuestionsState((prev) => {
86
- if (JSON.stringify(prev) !== JSON.stringify(stored.questions)) {
87
- return stored.questions || [];
88
- }
89
- return prev;
90
- });
91
- }
92
- }, [sharedListData, isGrouped, partId, currentGroupNumber, getSharedListData]);
93
- const persistToStore = (nodes) => {
94
- if (!isGrouped || !partId)
95
- return;
96
- const stored = getSharedListData(partId, currentGroupNumber);
97
- setSharedListData(partId, currentGroupNumber, {
98
- ...(stored || {}),
99
- questions: nodes,
100
- });
101
- };
102
- const setQuestions = (value) => {
103
- if (typeof value === 'function') {
104
- setQuestionsState((prev) => {
105
- const next = value(prev);
106
- persistToStore(next);
107
- return next;
108
- });
109
- }
110
- else {
111
- setQuestionsState(value);
112
- persistToStore(value);
113
- }
114
- };
115
- return {
116
- isGrouped,
117
- currentGroupNumber,
118
- questions: questionsState,
119
- setQuestions,
120
- };
121
- }
1
+ "use client";import{useState as t,useEffect as e,useRef as n}from"react";import{useExamQuestionStore as s}from"../../../../shared/lib/stores/examQuestionStore";export function getGroupNumberForIndex(t,e){if(!e||0===e.length||void 0===t)return 1;let n=0;for(const s of e)if(n+=s.questionCount,t<n)return s.number;return e[e.length-1]?.number??1}export function useQuestionListGroup({partId:o,groups:r,questionIndexInPart:u,initialData:i}){const q=s(t=>t.setSharedListData),f=s(t=>t.getSharedListData),a=s(t=>t.sharedListData),c=Boolean(r&&r.length>0),l=getGroupNumberForIndex(u,r),d=(()=>{if(c&&o){const t=f(o,l);if(t&&void 0!==t.questions)return{questions:t.questions&&t.questions.length>0?t.questions:i?.questions??[]}}return{questions:i?.questions??[]}})(),[g,p]=t(d.questions??[]),h=n(l);e(()=>{if(!c||!o)return;if(!i)return;const t=f(o,l);if(t&&void 0!==t.questions)return;const e=i.questions&&i.questions.length>0?i.questions:null;null!==e&&(p(e),q(o,l,{...t||{},questions:e}))},[i,o,l,c]),e(()=>{if(h.current===l)return;if(h.current=l,!c||!o)return;const t=f(o,l);t&&t.questions&&t.questions.length>0?p(t.questions):p(i?.questions??[])},[l,o,c]),e(()=>{if(!c||!o)return;const t=f(o,l);t&&t.questions&&p(e=>JSON.stringify(e)!==JSON.stringify(t.questions)?t.questions||[]:e)},[a,c,o,l,f]);const m=t=>{if(!c||!o)return;const e=f(o,l);q(o,l,{...e||{},questions:t})};return{isGrouped:c,currentGroupNumber:l,questions:g,setQuestions:t=>{"function"==typeof t?p(e=>{const n=t(e);return m(n),n}):(p(t),m(t))}}}
@@ -1,70 +1 @@
1
- import { useEffect, useRef } from 'react';
2
- import { QUESTION_TYPES_WITH_DEDICATED_COMPONENTS } from '../config/question-types.config';
3
- import { buildAnswerPayload } from '../utils/answer-builder';
4
- export function useQuestionOnChange({ onChange, state, isInitializing, prefilledType, }) {
5
- const onChangeRef = useRef(onChange);
6
- const previousPayloadRef = useRef('');
7
- useEffect(() => {
8
- onChangeRef.current = onChange;
9
- }, [onChange]);
10
- useEffect(() => {
11
- if (!onChange)
12
- return;
13
- const effectiveQuestionType = (state.questionType || prefilledType || '');
14
- // Skip entirely for question types that render a dedicated creator component.
15
- // Those components push real answer payloads via their own `onChange`; the
16
- // generic `useQuestionFormState` is often stale or empty for them. Running
17
- // this hook anyway causes spurious `onChange` calls on unrelated parent
18
- // re-renders (e.g. LISTENING part audio upload), flipping the question to
19
- // "Chưa lưu". Example: WORD_FILL_STRUCTURED_FORM was missing from the old
20
- // manual allowlist while CHOOSE_THE_CORRECT_ANSWER was listed — behaviour
21
- // diverged between those types.
22
- if (effectiveQuestionType &&
23
- QUESTION_TYPES_WITH_DEDICATED_COMPONENTS.includes(effectiveQuestionType)) {
24
- return;
25
- }
26
- const questionType = state.questionType;
27
- // Skip onChange during initialization to prevent infinite loop
28
- if (isInitializing())
29
- return;
30
- const computedAnswer = buildAnswerPayload(questionType, state);
31
- const payload = {
32
- type: questionType || undefined,
33
- content: state.content,
34
- points: state.points,
35
- level: state.level,
36
- difficulty: state.difficulty,
37
- skill: state.skill,
38
- };
39
- if (computedAnswer !== undefined) {
40
- payload.answer = computedAnswer;
41
- }
42
- // Serialize payload for comparison
43
- const payloadString = JSON.stringify(payload);
44
- // Only call onChange if payload actually changed
45
- if (previousPayloadRef.current !== payloadString) {
46
- previousPayloadRef.current = payloadString;
47
- onChangeRef.current?.(payload);
48
- }
49
- }, [
50
- onChange,
51
- prefilledType,
52
- state.questionType,
53
- state.content,
54
- state.points,
55
- state.level,
56
- state.difficulty,
57
- state.skill,
58
- state.audioUrl,
59
- state.blanks,
60
- state.options,
61
- state.correctOption,
62
- state.imageUrl,
63
- state.statements,
64
- state.arrangeLettersData,
65
- state.passage,
66
- state.passageBlanks,
67
- state.mcImageUrl,
68
- isInitializing,
69
- ]);
70
- }
1
+ import{useEffect as t,useRef as e}from"react";import{QUESTION_TYPES_WITH_DEDICATED_COMPONENTS as n}from"../config/question-types.config";import{buildAnswerPayload as i}from"../utils/answer-builder";export function useQuestionOnChange({onChange:r,state:s,isInitializing:o,prefilledType:l}){const c=e(r),a=e("");t(()=>{c.current=r},[r]),t(()=>{if(!r)return;const t=s.questionType||l||"";if(t&&n.includes(t))return;const e=s.questionType;if(o())return;const u=i(e,s),p={type:e||void 0,content:s.content,points:s.points,level:s.level,difficulty:s.difficulty,skill:s.skill};void 0!==u&&(p.answer=u);const f=JSON.stringify(p);a.current!==f&&(a.current=f,c.current?.(p))},[r,l,s.questionType,s.content,s.points,s.level,s.difficulty,s.skill,s.audioUrl,s.blanks,s.options,s.correctOption,s.imageUrl,s.statements,s.arrangeLettersData,s.passage,s.passageBlanks,s.mcImageUrl,o])}
@@ -1,194 +1 @@
1
- 'use client';
2
- import { useState, useEffect, useRef } from 'react';
3
- import { useExamQuestionStore } from '../../../../shared/lib/stores/examQuestionStore';
4
- // ---------------------------------------------------------------------------
5
- // Helpers
6
- // ---------------------------------------------------------------------------
7
- /**
8
- * Derives which group number a question at `questionIndexInPart` belongs to,
9
- * given the part's group configuration array.
10
- *
11
- * Example: groups = [{ number:1, questionCount:3 }, { number:2, questionCount:3 }]
12
- * index 0,1,2 → group 1
13
- * index 3,4,5 → group 2
14
- */
15
- export function getGroupNumberForIndex(questionIndexInPart, groups) {
16
- if (!groups || groups.length === 0 || questionIndexInPart === undefined)
17
- return 1;
18
- let cumulative = 0;
19
- for (const group of groups) {
20
- cumulative += group.questionCount;
21
- if (questionIndexInPart < cumulative) {
22
- return group.number;
23
- }
24
- }
25
- return groups[groups.length - 1]?.number ?? 1;
26
- }
27
- // ---------------------------------------------------------------------------
28
- // Hook implementation
29
- // ---------------------------------------------------------------------------
30
- /**
31
- * `useSceneQuestionGroup`
32
- *
33
- * Manages the shared scene fields (backgroundImageUrl, objectNodes) for the
34
- * LISTEN_AND_CHOOSE_OBJECTS_IN_SCENE group question type.
35
- *
36
- * Reads initial values from `examQuestionStore` (shared across all questions in
37
- * the same group), falls back to `initialData`, and writes every change back to
38
- * the store so sibling questions instantly see the updated values.
39
- *
40
- * Follows the same pattern as `useBasicQuestionGroup`.
41
- */
42
- export function useSceneQuestionGroup({ partId, groups, questionIndexInPart, initialData, }) {
43
- const setSharedSceneData = useExamQuestionStore((s) => s.setSharedSceneData);
44
- const getSharedSceneData = useExamQuestionStore((s) => s.getSharedSceneData);
45
- const isGrouped = Boolean(groups && groups.length > 0);
46
- const currentGroupNumber = getGroupNumberForIndex(questionIndexInPart, groups);
47
- // ------------------------------------------------------------------
48
- // Initialise state: store > initialData > empty
49
- // ------------------------------------------------------------------
50
- const resolveInitial = () => {
51
- if (isGrouped && partId) {
52
- const stored = getSharedSceneData(partId, currentGroupNumber);
53
- if (stored) {
54
- return {
55
- backgroundImageUrl: stored.backgroundImageUrl ?? initialData?.backgroundImageUrl ?? '',
56
- objectNodes: stored.objectNodes && stored.objectNodes.length > 0
57
- ? stored.objectNodes
58
- : initialData?.objectNodes ?? [],
59
- dropZones: stored.dropZones && stored.dropZones.length > 0
60
- ? stored.dropZones
61
- : initialData?.dropZones ?? [],
62
- };
63
- }
64
- }
65
- return {
66
- backgroundImageUrl: initialData?.backgroundImageUrl ?? '',
67
- objectNodes: initialData?.objectNodes ?? [],
68
- dropZones: initialData?.dropZones ?? [],
69
- };
70
- };
71
- const initial = resolveInitial();
72
- const [backgroundImageUrl, setBackgroundImageUrlState] = useState(initial.backgroundImageUrl ?? '');
73
- const [objectNodes, setObjectNodesState] = useState(initial.objectNodes ?? []);
74
- const [dropZones, setDropZonesState] = useState(initial.dropZones ?? []);
75
- // Track the last rendered group number and question index so we can re-sync when navigating
76
- const prevGroupNumberRef = useRef(currentGroupNumber);
77
- const prevQuestionIndexRef = useRef(questionIndexInPart);
78
- // ------------------------------------------------------------------
79
- // Seed from initialData when it becomes available (e.g. after async fetch).
80
- // Only fills fields that are missing from the store — never overwrites
81
- // values the user has already typed.
82
- // ------------------------------------------------------------------
83
- useEffect(() => {
84
- if (!isGrouped || !partId)
85
- return;
86
- if (!initialData)
87
- return;
88
- const stored = getSharedSceneData(partId, currentGroupNumber);
89
- // If a stored record already exists for this group, it means the data has
90
- // been actively managed (written by persistToStore). Do NOT re-seed from
91
- // initialData — the user may have intentionally cleared a field.
92
- if (stored)
93
- return;
94
- const newBg = initialData.backgroundImageUrl || null;
95
- const newNodes = initialData.objectNodes && initialData.objectNodes.length > 0
96
- ? initialData.objectNodes
97
- : null;
98
- const newDropZones = initialData.dropZones && initialData.dropZones.length > 0
99
- ? initialData.dropZones
100
- : null;
101
- if (newBg === null && newNodes === null && newDropZones === null)
102
- return;
103
- if (newBg !== null)
104
- setBackgroundImageUrlState(newBg);
105
- if (newNodes !== null)
106
- setObjectNodesState(newNodes);
107
- if (newDropZones !== null)
108
- setDropZonesState(newDropZones);
109
- setSharedSceneData(partId, currentGroupNumber, {
110
- backgroundImageUrl: newBg ?? '',
111
- objectNodes: newNodes ?? [],
112
- dropZones: newDropZones ?? [],
113
- });
114
- // eslint-disable-next-line react-hooks/exhaustive-deps
115
- }, [initialData, partId, currentGroupNumber, isGrouped]);
116
- // ------------------------------------------------------------------
117
- // Re-sync when the user navigates to a different question (group may change)
118
- // ------------------------------------------------------------------
119
- useEffect(() => {
120
- const groupChanged = prevGroupNumberRef.current !== currentGroupNumber;
121
- const questionChanged = prevQuestionIndexRef.current !== questionIndexInPart;
122
- if (!groupChanged && !questionChanged)
123
- return;
124
- prevGroupNumberRef.current = currentGroupNumber;
125
- prevQuestionIndexRef.current = questionIndexInPart;
126
- if (!isGrouped || !partId)
127
- return;
128
- const stored = getSharedSceneData(partId, currentGroupNumber);
129
- if (stored && (stored.backgroundImageUrl || (stored.objectNodes && stored.objectNodes.length > 0) || (stored.dropZones && stored.dropZones.length > 0))) {
130
- setBackgroundImageUrlState(stored.backgroundImageUrl ?? '');
131
- setObjectNodesState(stored.objectNodes ?? []);
132
- setDropZonesState(stored.dropZones ?? []);
133
- }
134
- else {
135
- // New group: seed from initialData
136
- setBackgroundImageUrlState(initialData?.backgroundImageUrl ?? '');
137
- setObjectNodesState(initialData?.objectNodes ?? []);
138
- setDropZonesState(initialData?.dropZones ?? []);
139
- }
140
- // eslint-disable-next-line react-hooks/exhaustive-deps
141
- }, [currentGroupNumber, questionIndexInPart, partId, isGrouped]);
142
- // ------------------------------------------------------------------
143
- // Helpers: write state + persist to store
144
- // ------------------------------------------------------------------
145
- const persistToStore = (partialData) => {
146
- if (!isGrouped || !partId)
147
- return;
148
- const stored = getSharedSceneData(partId, currentGroupNumber) || {};
149
- setSharedSceneData(partId, currentGroupNumber, {
150
- ...stored,
151
- ...partialData,
152
- });
153
- };
154
- const setBackgroundImageUrl = (value) => {
155
- setBackgroundImageUrlState(value);
156
- persistToStore({ backgroundImageUrl: value });
157
- };
158
- const setObjectNodes = (value) => {
159
- if (typeof value === 'function') {
160
- setObjectNodesState((prev) => {
161
- const next = value(prev);
162
- persistToStore({ objectNodes: next });
163
- return next;
164
- });
165
- }
166
- else {
167
- setObjectNodesState(value);
168
- persistToStore({ objectNodes: value });
169
- }
170
- };
171
- const setDropZones = (value) => {
172
- if (typeof value === 'function') {
173
- setDropZonesState((prev) => {
174
- const next = value(prev);
175
- persistToStore({ dropZones: next });
176
- return next;
177
- });
178
- }
179
- else {
180
- setDropZonesState(value);
181
- persistToStore({ dropZones: value });
182
- }
183
- };
184
- return {
185
- isGrouped,
186
- currentGroupNumber,
187
- backgroundImageUrl,
188
- objectNodes,
189
- dropZones,
190
- setBackgroundImageUrl,
191
- setObjectNodes,
192
- setDropZones,
193
- };
194
- }
1
+ "use client";import{useState as e,useEffect as o,useRef as r}from"react";import{useExamQuestionStore as n}from"../../../../shared/lib/stores/examQuestionStore";export function getGroupNumberForIndex(e,o){if(!o||0===o.length||void 0===e)return 1;let r=0;for(const n of o)if(r+=n.questionCount,e<r)return n.number;return o[o.length-1]?.number??1}export function useSceneQuestionGroup({partId:t,groups:s,questionIndexInPart:u,initialData:d}){const c=n(e=>e.setSharedSceneData),l=n(e=>e.getSharedSceneData),a=Boolean(s&&s.length>0),g=getGroupNumberForIndex(u,s),b=(()=>{if(a&&t){const e=l(t,g);if(e)return{backgroundImageUrl:e.backgroundImageUrl??d?.backgroundImageUrl??"",objectNodes:e.objectNodes&&e.objectNodes.length>0?e.objectNodes:d?.objectNodes??[],dropZones:e.dropZones&&e.dropZones.length>0?e.dropZones:d?.dropZones??[]}}return{backgroundImageUrl:d?.backgroundImageUrl??"",objectNodes:d?.objectNodes??[],dropZones:d?.dropZones??[]}})(),[p,i]=e(b.backgroundImageUrl??""),[m,N]=e(b.objectNodes??[]),[f,j]=e(b.dropZones??[]),Z=r(g),I=r(u);o(()=>{if(!a||!t)return;if(!d)return;if(l(t,g))return;const e=d.backgroundImageUrl||null,o=d.objectNodes&&d.objectNodes.length>0?d.objectNodes:null,r=d.dropZones&&d.dropZones.length>0?d.dropZones:null;null===e&&null===o&&null===r||(null!==e&&i(e),null!==o&&N(o),null!==r&&j(r),c(t,g,{backgroundImageUrl:e??"",objectNodes:o??[],dropZones:r??[]}))},[d,t,g,a]),o(()=>{const e=Z.current!==g,o=I.current!==u;if(!e&&!o)return;if(Z.current=g,I.current=u,!a||!t)return;const r=l(t,g);r&&(r.backgroundImageUrl||r.objectNodes&&r.objectNodes.length>0||r.dropZones&&r.dropZones.length>0)?(i(r.backgroundImageUrl??""),N(r.objectNodes??[]),j(r.dropZones??[])):(i(d?.backgroundImageUrl??""),N(d?.objectNodes??[]),j(d?.dropZones??[]))},[g,u,t,a]);const k=e=>{if(!a||!t)return;const o=l(t,g)||{};c(t,g,{...o,...e})};return{isGrouped:a,currentGroupNumber:g,backgroundImageUrl:p,objectNodes:m,dropZones:f,setBackgroundImageUrl:e=>{i(e),k({backgroundImageUrl:e})},setObjectNodes:e=>{"function"==typeof e?N(o=>{const r=e(o);return k({objectNodes:r}),r}):(N(e),k({objectNodes:e}))},setDropZones:e=>{"function"==typeof e?j(o=>{const r=e(o);return k({dropZones:r}),r}):(j(e),k({dropZones:e}))}}}
@@ -1,7 +1 @@
1
- export * from './hooks/useQuestionFormState';
2
- export * from './hooks/useQuestionInitialization';
3
- export * from './hooks/useQuestionOnChange';
4
- export * from './utils/answer-builder';
5
- export * from './utils/question-validation';
6
- export * from './config/question-types.config';
7
- export * from './constants/color-palette';
1
+ export*from"./hooks/useQuestionFormState";export*from"./hooks/useQuestionInitialization";export*from"./hooks/useQuestionOnChange";export*from"./utils/answer-builder";export*from"./utils/question-validation";export*from"./config/question-types.config";export*from"./constants/color-palette";
@@ -1 +1 @@
1
- export {};
1
+ export{};
@@ -1 +1 @@
1
- export {};
1
+ export{};
@@ -1,3 +1 @@
1
- // BƯỚC 1: Type Definitions for Choose Correct Adjective
2
- // Loại câu hỏi: Chọn dạng đúng của tính từ để hoàn thành câu
3
- export {};
1
+ export{};
@@ -1 +1 @@
1
- export {};
1
+ export{};
@@ -1 +1 @@
1
- export {};
1
+ export{};
@@ -1 +1 @@
1
- export {};
1
+ export{};
@@ -1 +1 @@
1
- export {};
1
+ export{};
@@ -1,12 +1 @@
1
- export * from './listening-drawline.type';
2
- export * from './listen-and-tick-answer.type';
3
- export * from './arrange-letters-into-words.type';
4
- export * from './write-short-paragraph.type';
5
- export * from './fill-missing-words-in-grid.type';
6
- export * from './look-and-choose-answer.type';
7
- export * from './look-picture-fill-word-hint.type';
8
- export * from './label-the-picture.type';
9
- export * from './read-and-color-objects.type';
10
- export * from './fill-in-blank.type';
11
- export * from './read-passage-and-answer-questions.type';
12
- export * from './word-fill-structured-form.type';
1
+ export*from"./listening-drawline.type";export*from"./listen-and-tick-answer.type";export*from"./arrange-letters-into-words.type";export*from"./write-short-paragraph.type";export*from"./fill-missing-words-in-grid.type";export*from"./look-and-choose-answer.type";export*from"./look-picture-fill-word-hint.type";export*from"./label-the-picture.type";export*from"./read-and-color-objects.type";export*from"./fill-in-blank.type";export*from"./read-passage-and-answer-questions.type";export*from"./word-fill-structured-form.type";
@@ -1 +1 @@
1
- export {};
1
+ export{};
@@ -1 +1 @@
1
- export {};
1
+ export{};
@@ -1 +1 @@
1
- export {};
1
+ export{};
@@ -1 +1 @@
1
- export {};
1
+ export{};
@@ -1 +1 @@
1
- export {};
1
+ export{};
@@ -1,3 +1 @@
1
- // Frontend/Creator types for LISTEN_AND_SPEAK_ODD_ONE_OUT
2
- // (Movers Part 3 - Which One Is Different? Why?)
3
- export {};
1
+ export{};
@@ -1 +1 @@
1
- export {};
1
+ export{};
@@ -1,3 +1 @@
1
- // Frontend/Creator types for LISTEN_AND_SPEAK_WITH_STORY_IMAGES
2
- // (Movers Part 2 - Tell the Story)
3
- export {};
1
+ export{};
@@ -1 +1 @@
1
- export {};
1
+ export{};
@@ -1 +1 @@
1
- export {};
1
+ export{};
@@ -1 +1 @@
1
- export {};
1
+ export{};
@@ -1 +1 @@
1
- export {};
1
+ export{};