@cuemath/leap 3.5.46 → 3.5.47-gg10

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 (182) hide show
  1. package/dist/assets/line-icons/icons/bulb.js +10 -10
  2. package/dist/assets/line-icons/icons/bulb.js.map +1 -1
  3. package/dist/assets/line-icons/icons/chevron-up.js +28 -0
  4. package/dist/assets/line-icons/icons/chevron-up.js.map +1 -0
  5. package/dist/assets/line-icons/icons/close.js +28 -0
  6. package/dist/assets/line-icons/icons/close.js.map +1 -0
  7. package/dist/assets/line-icons/icons/cursor2.js +24 -0
  8. package/dist/assets/line-icons/icons/cursor2.js.map +1 -0
  9. package/dist/assets/line-icons/icons/hand.js.map +1 -1
  10. package/dist/assets/line-icons/icons/hints.js +25 -0
  11. package/dist/assets/line-icons/icons/hints.js.map +1 -0
  12. package/dist/assets/line-icons/icons/question-feedback.js +30 -0
  13. package/dist/assets/line-icons/icons/question-feedback.js.map +1 -0
  14. package/dist/assets/line-icons/icons/scribble.js +13 -36
  15. package/dist/assets/line-icons/icons/scribble.js.map +1 -1
  16. package/dist/assets/line-icons/icons/sticker.js +9 -9
  17. package/dist/assets/line-icons/icons/sticker.js.map +1 -1
  18. package/dist/assets/line-icons/icons/teaching-tools.js +40 -0
  19. package/dist/assets/line-icons/icons/teaching-tools.js.map +1 -0
  20. package/dist/assets/line-icons/icons/tval-question.js +32 -0
  21. package/dist/assets/line-icons/icons/tval-question.js.map +1 -0
  22. package/dist/features/circle-games/hooks/use-circle-sounds/constants.js +4 -7
  23. package/dist/features/circle-games/hooks/use-circle-sounds/constants.js.map +1 -1
  24. package/dist/features/circle-games/hooks/use-circle-sounds/helper.js +19 -0
  25. package/dist/features/circle-games/hooks/use-circle-sounds/helper.js.map +1 -0
  26. package/dist/features/circle-games/hooks/use-circle-sounds/use-circle-sounds.js +110 -51
  27. package/dist/features/circle-games/hooks/use-circle-sounds/use-circle-sounds.js.map +1 -1
  28. package/dist/features/cue-canvas/sidebar/puzzles/api/get-puzzles.js.map +1 -1
  29. package/dist/features/hooks/use-audio-player.js +54 -0
  30. package/dist/features/hooks/use-audio-player.js.map +1 -0
  31. package/dist/features/journey/hooks/use-home-page-journey/home-page-homeworks-mock.js +6 -6
  32. package/dist/features/journey/hooks/use-home-page-journey/home-page-homeworks-mock.js.map +1 -1
  33. package/dist/features/journey/hooks/use-home-page-journey/recent-chapters-mock.js +2 -2
  34. package/dist/features/journey/hooks/use-home-page-journey/recent-chapters-mock.js.map +1 -1
  35. package/dist/features/journey/mocks/chapter-page-journey-mock-data.js +64 -29
  36. package/dist/features/journey/mocks/chapter-page-journey-mock-data.js.map +1 -1
  37. package/dist/features/milestone/milestone-tests/tests-creation/test-stages/test-preview/test-preview.js +9 -9
  38. package/dist/features/milestone/milestone-tests/tests-creation/test-stages/test-preview/test-preview.js.map +1 -1
  39. package/dist/features/puzzles/app/puzzle-app-view.js +40 -40
  40. package/dist/features/puzzles/app/puzzle-app-view.js.map +1 -1
  41. package/dist/features/ui/tabs/tabs.js +15 -15
  42. package/dist/features/ui/tabs/tabs.js.map +1 -1
  43. package/dist/features/worksheet/learnosity-preloader/learnosity-preloader.js +0 -1
  44. package/dist/features/worksheet/learnosity-preloader/learnosity-preloader.js.map +1 -1
  45. package/dist/features/worksheet/worksheet/constants.js +12 -13
  46. package/dist/features/worksheet/worksheet/constants.js.map +1 -1
  47. package/dist/features/worksheet/worksheet/hooks/use-create-imperative-handle.js +120 -101
  48. package/dist/features/worksheet/worksheet/hooks/use-create-imperative-handle.js.map +1 -1
  49. package/dist/features/worksheet/worksheet/hooks/use-worksheet-store.js +1 -1
  50. package/dist/features/worksheet/worksheet/hooks/use-worksheet-store.js.map +1 -1
  51. package/dist/features/worksheet/worksheet/worksheet-action-bar/worksheet-action-bar.js +40 -109
  52. package/dist/features/worksheet/worksheet/worksheet-action-bar/worksheet-action-bar.js.map +1 -1
  53. package/dist/features/worksheet/worksheet/worksheet-behavior-helper.js +49 -46
  54. package/dist/features/worksheet/worksheet/worksheet-behavior-helper.js.map +1 -1
  55. package/dist/features/worksheet/worksheet/worksheet-calculator/worksheet-calculator.js +4 -4
  56. package/dist/features/worksheet/worksheet/worksheet-calculator/worksheet-calculator.js.map +1 -1
  57. package/dist/features/worksheet/worksheet/worksheet-helpers.js +127 -274
  58. package/dist/features/worksheet/worksheet/worksheet-helpers.js.map +1 -1
  59. package/dist/features/worksheet/worksheet/worksheet-navigation/worksheet-navigation.js +25 -25
  60. package/dist/features/worksheet/worksheet/worksheet-navigation/worksheet-navigation.js.map +1 -1
  61. package/dist/features/worksheet/worksheet/worksheet-provider.js +1 -1
  62. package/dist/features/worksheet/worksheet/worksheet-provider.js.map +1 -1
  63. package/dist/features/worksheet/worksheet/worksheet-question/subjective-styled.js +17 -22
  64. package/dist/features/worksheet/worksheet/worksheet-question/subjective-styled.js.map +1 -1
  65. package/dist/features/worksheet/worksheet/worksheet-question/worksheet-question-styled.js +25 -29
  66. package/dist/features/worksheet/worksheet/worksheet-question/worksheet-question-styled.js.map +1 -1
  67. package/dist/features/worksheet/worksheet/worksheet-question/worksheet-question.js +319 -259
  68. package/dist/features/worksheet/worksheet/worksheet-question/worksheet-question.js.map +1 -1
  69. package/dist/features/worksheet/worksheet/worksheet-questions-controller/hooks/use-handle-allow-retry-button-click.js +15 -0
  70. package/dist/features/worksheet/worksheet/worksheet-questions-controller/hooks/use-handle-allow-retry-button-click.js.map +1 -0
  71. package/dist/features/worksheet/worksheet/worksheet-questions-controller/hooks/use-handle-back-button-click.js +18 -0
  72. package/dist/features/worksheet/worksheet/worksheet-questions-controller/hooks/use-handle-back-button-click.js.map +1 -0
  73. package/dist/features/worksheet/worksheet/worksheet-questions-controller/hooks/use-handle-check-button-click.js +21 -0
  74. package/dist/features/worksheet/worksheet/worksheet-questions-controller/hooks/use-handle-check-button-click.js.map +1 -0
  75. package/dist/features/worksheet/worksheet/worksheet-questions-controller/hooks/use-handle-next-button-click.js +19 -0
  76. package/dist/features/worksheet/worksheet/worksheet-questions-controller/hooks/use-handle-next-button-click.js.map +1 -0
  77. package/dist/features/worksheet/worksheet/worksheet-questions-controller/hooks/use-handle-ready-button-click.js +34 -0
  78. package/dist/features/worksheet/worksheet/worksheet-questions-controller/hooks/use-handle-ready-button-click.js.map +1 -0
  79. package/dist/features/worksheet/worksheet/worksheet-questions-controller/hooks/use-handle-response-change.js +38 -0
  80. package/dist/features/worksheet/worksheet/worksheet-questions-controller/hooks/use-handle-response-change.js.map +1 -0
  81. package/dist/features/worksheet/worksheet/worksheet-questions-controller/hooks/use-handle-retry-button-click.js +16 -0
  82. package/dist/features/worksheet/worksheet/worksheet-questions-controller/hooks/use-handle-retry-button-click.js.map +1 -0
  83. package/dist/features/worksheet/worksheet/worksheet-questions-controller/hooks/use-handle-skip-button-click.js +35 -0
  84. package/dist/features/worksheet/worksheet/worksheet-questions-controller/hooks/use-handle-skip-button-click.js.map +1 -0
  85. package/dist/features/worksheet/worksheet/worksheet-questions-controller/hooks/use-handle-skip-section-button-click.js +12 -0
  86. package/dist/features/worksheet/worksheet/worksheet-questions-controller/hooks/use-handle-skip-section-button-click.js.map +1 -0
  87. package/dist/features/worksheet/worksheet/worksheet-questions-controller/hooks/use-handle-start-button-click.js +44 -0
  88. package/dist/features/worksheet/worksheet/worksheet-questions-controller/hooks/use-handle-start-button-click.js.map +1 -0
  89. package/dist/features/worksheet/worksheet/worksheet-questions-controller/hooks/use-handle-submit-quiz.js +51 -0
  90. package/dist/features/worksheet/worksheet/worksheet-questions-controller/hooks/use-handle-submit-quiz.js.map +1 -0
  91. package/dist/features/worksheet/worksheet/worksheet-questions-controller/hooks/use-handle-validate-button-click.js +19 -0
  92. package/dist/features/worksheet/worksheet/worksheet-questions-controller/hooks/use-handle-validate-button-click.js.map +1 -0
  93. package/dist/features/worksheet/worksheet/worksheet-questions-controller/hooks/use-play-validation-audio.js +23 -0
  94. package/dist/features/worksheet/worksheet/worksheet-questions-controller/hooks/use-play-validation-audio.js.map +1 -0
  95. package/dist/features/worksheet/worksheet/worksheet-questions-controller/hooks/use-validate-question.js +36 -0
  96. package/dist/features/worksheet/worksheet/worksheet-questions-controller/hooks/use-validate-question.js.map +1 -0
  97. package/dist/features/worksheet/worksheet/worksheet-questions-controller/student/controller-lesson-v3.js +184 -0
  98. package/dist/features/worksheet/worksheet/worksheet-questions-controller/student/controller-lesson-v3.js.map +1 -0
  99. package/dist/features/worksheet/worksheet/worksheet-questions-controller/student/controller-lesson-v3_1.js +258 -0
  100. package/dist/features/worksheet/worksheet/worksheet-questions-controller/student/controller-lesson-v3_1.js.map +1 -0
  101. package/dist/features/worksheet/worksheet/worksheet-questions-controller/student/controller.js +180 -0
  102. package/dist/features/worksheet/worksheet/worksheet-questions-controller/student/controller.js.map +1 -0
  103. package/dist/features/worksheet/worksheet/worksheet-questions-controller/teacher/controller-lesson-v3.js +77 -0
  104. package/dist/features/worksheet/worksheet/worksheet-questions-controller/teacher/controller-lesson-v3.js.map +1 -0
  105. package/dist/features/worksheet/worksheet/worksheet-questions-controller/teacher/controller-lesson-v3_1.js +103 -0
  106. package/dist/features/worksheet/worksheet/worksheet-questions-controller/teacher/controller-lesson-v3_1.js.map +1 -0
  107. package/dist/features/worksheet/worksheet/worksheet-questions-controller/teacher/controller.js +21 -0
  108. package/dist/features/worksheet/worksheet/worksheet-questions-controller/teacher/controller.js.map +1 -0
  109. package/dist/features/worksheet/worksheet/worksheet-questions-controller/worksheet-questions-controller-view.js +22 -0
  110. package/dist/features/worksheet/worksheet/worksheet-questions-controller/worksheet-questions-controller-view.js.map +1 -0
  111. package/dist/features/worksheet/worksheet/worksheet-questions-controller/worksheet-questions-controller.js +20 -345
  112. package/dist/features/worksheet/worksheet/worksheet-questions-controller/worksheet-questions-controller.js.map +1 -1
  113. package/dist/features/worksheet/worksheet/worksheet-questions-tools/questions-toolbar/questions-toolbar-styled.js +49 -0
  114. package/dist/features/worksheet/worksheet/worksheet-questions-tools/questions-toolbar/questions-toolbar-styled.js.map +1 -0
  115. package/dist/features/worksheet/worksheet/worksheet-questions-tools/questions-toolbar/questions-toolbar.js +184 -0
  116. package/dist/features/worksheet/worksheet/worksheet-questions-tools/questions-toolbar/questions-toolbar.js.map +1 -0
  117. package/dist/features/worksheet/worksheet/worksheet-questions-tools/scribble-switch.js +65 -0
  118. package/dist/features/worksheet/worksheet/worksheet-questions-tools/scribble-switch.js.map +1 -0
  119. package/dist/features/worksheet/worksheet/worksheet-questions-tools/worksheet-questions-styled.js +9 -0
  120. package/dist/features/worksheet/worksheet/worksheet-questions-tools/worksheet-questions-styled.js.map +1 -0
  121. package/dist/features/worksheet/worksheet/worksheet-questions-tools/worksheet-questions-tools.js +38 -0
  122. package/dist/features/worksheet/worksheet/worksheet-questions-tools/worksheet-questions-tools.js.map +1 -0
  123. package/dist/features/worksheet/worksheet/worksheet-sidebar/navigator.js +33 -20
  124. package/dist/features/worksheet/worksheet/worksheet-sidebar/navigator.js.map +1 -1
  125. package/dist/features/worksheet/worksheet/worksheet-store/helpers/get-computed-properties.js +73 -0
  126. package/dist/features/worksheet/worksheet/worksheet-store/helpers/get-computed-properties.js.map +1 -0
  127. package/dist/features/worksheet/worksheet/worksheet-store/helpers/get-derived-blocker.js +20 -0
  128. package/dist/features/worksheet/worksheet/worksheet-store/helpers/get-derived-blocker.js.map +1 -0
  129. package/dist/features/worksheet/worksheet/worksheet-store/helpers/get-last-attemptable-question-index.js +69 -0
  130. package/dist/features/worksheet/worksheet/worksheet-store/helpers/get-last-attemptable-question-index.js.map +1 -0
  131. package/dist/features/worksheet/worksheet/worksheet-store/helpers/get-last-unlocked-question-index.js +18 -0
  132. package/dist/features/worksheet/worksheet/worksheet-store/helpers/get-last-unlocked-question-index.js.map +1 -0
  133. package/dist/features/worksheet/worksheet/worksheet-store/helpers/get-merged-response-state.js +19 -0
  134. package/dist/features/worksheet/worksheet/worksheet-store/helpers/get-merged-response-state.js.map +1 -0
  135. package/dist/features/worksheet/worksheet/worksheet-store/helpers/get-questions-from-items.js +138 -0
  136. package/dist/features/worksheet/worksheet/worksheet-store/helpers/get-questions-from-items.js.map +1 -0
  137. package/dist/features/worksheet/worksheet/worksheet-store/helpers/get-renderable-questions.js +9 -0
  138. package/dist/features/worksheet/worksheet/worksheet-store/helpers/get-renderable-questions.js.map +1 -0
  139. package/dist/features/worksheet/worksheet/worksheet-store/worksheet-store.js +230 -0
  140. package/dist/features/worksheet/worksheet/worksheet-store/worksheet-store.js.map +1 -0
  141. package/dist/features/worksheet/worksheet/worksheet-styled.js +29 -83
  142. package/dist/features/worksheet/worksheet/worksheet-styled.js.map +1 -1
  143. package/dist/features/worksheet/worksheet/worksheet-summary-controller/worksheet-summary-controller.js +45 -24
  144. package/dist/features/worksheet/worksheet/worksheet-summary-controller/worksheet-summary-controller.js.map +1 -1
  145. package/dist/features/worksheet/worksheet/worksheet-teaching-tools/worksheet-teaching-tools-styled.js +19 -0
  146. package/dist/features/worksheet/worksheet/worksheet-teaching-tools/worksheet-teaching-tools-styled.js.map +1 -0
  147. package/dist/features/worksheet/worksheet/worksheet-teaching-tools/worksheet-teaching-tools.js +66 -0
  148. package/dist/features/worksheet/worksheet/worksheet-teaching-tools/worksheet-teaching-tools.js.map +1 -0
  149. package/dist/features/worksheet/worksheet/worksheet-types.js +3 -2
  150. package/dist/features/worksheet/worksheet/worksheet-types.js.map +1 -1
  151. package/dist/features/worksheet/worksheet/worksheet-view.js +89 -100
  152. package/dist/features/worksheet/worksheet/worksheet-view.js.map +1 -1
  153. package/dist/features/worksheet/worksheet/worksheet.js +126 -117
  154. package/dist/features/worksheet/worksheet/worksheet.js.map +1 -1
  155. package/dist/features/worksheet/worksheet-preview/dynamic-worksheet-preview/dynamic-worksheet-preview.js +29 -29
  156. package/dist/features/worksheet/worksheet-preview/dynamic-worksheet-preview/dynamic-worksheet-preview.js.map +1 -1
  157. package/dist/features/worksheet/worksheet-preview/hooks/use-worksheet-layout.js +16 -16
  158. package/dist/features/worksheet/worksheet-preview/hooks/use-worksheet-layout.js.map +1 -1
  159. package/dist/features/worksheet/worksheet-preview/worksheet-preview-view.js +24 -24
  160. package/dist/features/worksheet/worksheet-preview/worksheet-preview-view.js.map +1 -1
  161. package/dist/index.d.ts +67 -28
  162. package/dist/index.js +760 -745
  163. package/dist/index.js.map +1 -1
  164. package/dist/types/models/worksheet.js +2 -1
  165. package/dist/types/models/worksheet.js.map +1 -1
  166. package/package.json +2 -2
  167. package/dist/features/hooks/use-audio-player/use-audio-player.js +0 -164
  168. package/dist/features/hooks/use-audio-player/use-audio-player.js.map +0 -1
  169. package/dist/features/worksheet/worksheet/question-tips.js +0 -100
  170. package/dist/features/worksheet/worksheet/question-tips.js.map +0 -1
  171. package/dist/features/worksheet/worksheet/worksheet-questions-controller/scribble-switch.js +0 -53
  172. package/dist/features/worksheet/worksheet/worksheet-questions-controller/scribble-switch.js.map +0 -1
  173. package/dist/features/worksheet/worksheet/worksheet-questions-controller/use-handler-callbacks.js +0 -195
  174. package/dist/features/worksheet/worksheet/worksheet-questions-controller/use-handler-callbacks.js.map +0 -1
  175. package/dist/features/worksheet/worksheet/worksheet-sidebar/question-guide.js +0 -112
  176. package/dist/features/worksheet/worksheet/worksheet-sidebar/question-guide.js.map +0 -1
  177. package/dist/features/worksheet/worksheet/worksheet-sidebar/sidebar.js +0 -61
  178. package/dist/features/worksheet/worksheet/worksheet-sidebar/sidebar.js.map +0 -1
  179. package/dist/features/worksheet/worksheet/worksheet-sidebar/worksheet-sidebar-styled.js +0 -91
  180. package/dist/features/worksheet/worksheet/worksheet-sidebar/worksheet-sidebar-styled.js.map +0 -1
  181. package/dist/features/worksheet/worksheet/worksheet-store.js +0 -289
  182. package/dist/features/worksheet/worksheet/worksheet-store.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-last-attemptable-question-index.js","sources":["../../../../../../src/features/worksheet/worksheet/worksheet-store/helpers/get-last-attemptable-question-index.ts"],"sourcesContent":["import { isTeacherInterventionNeeded } from '../../worksheet-helpers';\nimport type {\n IWorksheetBehavior,\n IWorksheetQuestion,\n IWorksheetResponse,\n} from '../../worksheet-types';\nimport type { TUserTypes } from '../../../../ui/types';\n\ninterface IGetLastAttemptableQuestionIndex {\n (options: {\n questions: IWorksheetQuestion[];\n responses: Record<string, IWorksheetResponse>;\n behavior: IWorksheetBehavior;\n userType: TUserTypes;\n inClass: boolean;\n }): number;\n}\n\ninterface IGetLastAttemptableIndexTeacherValidation {\n (options: {\n questions: IWorksheetQuestion[];\n responses: Record<string, IWorksheetResponse>;\n userType: TUserTypes;\n }): number;\n}\n\ninterface IGetLastAttemptableIndexTeacherDiscussion {\n (options: {\n questions: IWorksheetQuestion[];\n responses: Record<string, IWorksheetResponse>;\n behavior: IWorksheetBehavior;\n inClass: boolean;\n }): number;\n}\n\ninterface IGetLastAttemptableIndexDefault {\n (options: {\n questions: IWorksheetQuestion[];\n responses: Record<string, IWorksheetResponse>;\n behavior: IWorksheetBehavior;\n }): number;\n}\n\n/**\n * Handles finding last attemptable question when teacher validation is enabled\n */\nconst getLastAttemptableIndexTeacherValidation: IGetLastAttemptableIndexTeacherValidation = ({\n questions,\n responses,\n userType,\n}) => {\n const questionIndex = [...questions].reverse().findIndex(q => {\n const qResp = responses[q.response_id];\n const { validatedByTeacher, assignStatus } = qResp ?? {};\n\n if (validatedByTeacher) {\n return true;\n }\n\n if (assignStatus === 'skipped') {\n return true;\n }\n\n return false;\n });\n\n if (questionIndex === -1) {\n return 0;\n }\n\n if (questionIndex === 0) {\n const unskippedQuestionIndex = [...questions].reverse().findIndex(q => {\n return responses[q.response_id]?.assignStatus !== 'skipped';\n });\n\n return questions.length - unskippedQuestionIndex - 1;\n }\n\n if (userType === 'STUDENT') {\n const lastUnlockedQuestionIndex = questions.length - questionIndex;\n const lastUnlockedQuestion = questions[lastUnlockedQuestionIndex]!;\n const { assignStatus } = responses[lastUnlockedQuestion.response_id] ?? {};\n\n if (lastUnlockedQuestion.is_optional && !assignStatus) {\n return lastUnlockedQuestionIndex - 1;\n }\n\n return lastUnlockedQuestionIndex;\n }\n\n return questions.length - questionIndex;\n};\n\n/**\n * Handles finding last attemptable question when teacher discussion is enabled\n */\nconst getLastAttemptableIndexTeacherDiscussion: IGetLastAttemptableIndexTeacherDiscussion = ({\n questions,\n responses,\n behavior,\n inClass,\n}) => {\n const { attemptsAfterTeacherInterventionNeeded } = behavior;\n\n // Find the first non-attemptable question from the start\n const firstNonAttemptableIndex = questions.findIndex(q => {\n const qResp = responses[q.response_id];\n const { attemptsHistory } = qResp ?? {};\n\n if (q.is_non_question) {\n return qResp?.responseGiven !== true;\n }\n\n if (q.item_type === 'exit-ticket') {\n return qResp?.skipped !== true && qResp?.response === undefined;\n }\n\n const lastAttemptScore = attemptsHistory?.slice(-1)[0]?.score;\n\n if (lastAttemptScore) {\n if ((lastAttemptScore.score ?? 0) === lastAttemptScore.max_score) {\n // Special handling for teacher discussion mode\n if (inClass && q.metadata.acknowledgements && !qResp?.validatedByTeacher) {\n return true;\n }\n\n return false;\n }\n\n const teacherInterventionNeeded = isTeacherInterventionNeeded({\n attemptsAfterTeacherInterventionNeeded,\n attemptsHistory,\n });\n\n if (!teacherInterventionNeeded) return true;\n\n return inClass;\n }\n\n return true;\n });\n\n // If all questions are attempted\n if (firstNonAttemptableIndex === -1) {\n return questions.length - 1;\n }\n\n // If first question is attemptable\n if (firstNonAttemptableIndex === 0) {\n return 0;\n }\n\n // Return the index before the first non-attemptable question\n return firstNonAttemptableIndex;\n};\n\n/**\n * Handles finding last attemptable question for default cases\n */\nconst getLastAttemptableIndexDefault: IGetLastAttemptableIndexDefault = ({\n questions,\n responses,\n behavior,\n}) => {\n const { maximumAttempts, validation, navigationMode } = behavior;\n\n const questionIndex = [...questions].reverse().findIndex(q => {\n const qResp = responses[q.response_id];\n const { attemptsHistory } = qResp ?? {};\n const lastAttemptScore = attemptsHistory?.slice(-1)[0]?.score;\n\n if (lastAttemptScore) {\n if ((lastAttemptScore.score ?? 0) === lastAttemptScore.max_score) return true;\n\n const maximumAttemptsReached = (attemptsHistory?.length ?? 0) >= maximumAttempts;\n\n if (maximumAttemptsReached) return true;\n\n return false;\n }\n\n if (!validation && navigationMode === 'LINEAR' && (qResp?.response || qResp?.skipped)) {\n return true;\n }\n\n return false;\n });\n\n if (questionIndex === -1) {\n return 0;\n }\n\n if (questionIndex === 0) {\n return questions.length - 1;\n }\n\n return questions.length - questionIndex;\n};\n\n/**\n * Main function that delegates to specialized functions based on behavior flags\n */\nexport const getLastAttemptableQuestionIndex: IGetLastAttemptableQuestionIndex = ({\n questions,\n responses,\n behavior,\n userType,\n inClass,\n}) => {\n const { teacherValidationEnabled, teacherDiscussionEnabled } = behavior;\n\n // Teacher validation mode takes precedence\n if (teacherValidationEnabled) {\n return getLastAttemptableIndexTeacherValidation({ questions, responses, userType });\n }\n\n // Teacher discussion mode\n if (teacherDiscussionEnabled) {\n return getLastAttemptableIndexTeacherDiscussion({ questions, responses, behavior, inClass });\n }\n\n // Default behavior\n return getLastAttemptableIndexDefault({ questions, responses, behavior });\n};\n"],"names":["getLastAttemptableIndexTeacherValidation","questions","responses","userType","questionIndex","q","qResp","validatedByTeacher","assignStatus","unskippedQuestionIndex","_a","lastUnlockedQuestionIndex","lastUnlockedQuestion","getLastAttemptableIndexTeacherDiscussion","behavior","inClass","attemptsAfterTeacherInterventionNeeded","firstNonAttemptableIndex","attemptsHistory","lastAttemptScore","isTeacherInterventionNeeded","getLastAttemptableIndexDefault","maximumAttempts","validation","navigationMode","getLastAttemptableQuestionIndex","teacherValidationEnabled","teacherDiscussionEnabled"],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { getLastAttemptableQuestionIndex as a } from "./get-last-attemptable-question-index.js";
2
+ const g = ({
3
+ questions: t,
4
+ responses: n,
5
+ behavior: e,
6
+ userType: o,
7
+ inClass: r
8
+ }) => e.navigationMode === "OPEN" ? t.length - 1 : a({
9
+ questions: t,
10
+ responses: n,
11
+ behavior: e,
12
+ userType: o,
13
+ inClass: r
14
+ });
15
+ export {
16
+ g as getLastUnlockedQuestionIndex
17
+ };
18
+ //# sourceMappingURL=get-last-unlocked-question-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-last-unlocked-question-index.js","sources":["../../../../../../src/features/worksheet/worksheet/worksheet-store/helpers/get-last-unlocked-question-index.ts"],"sourcesContent":["import type {\n IWorksheetBehavior,\n IWorksheetQuestion,\n IWorksheetResponse,\n} from '../../worksheet-types';\nimport type { TUserTypes } from '../../../../ui/types';\nimport { getLastAttemptableQuestionIndex } from './get-last-attemptable-question-index';\n\ninterface IGetLastUnlockedQuestionIndex {\n (options: {\n questions: IWorksheetQuestion[];\n responses: Record<string, IWorksheetResponse>;\n behavior: IWorksheetBehavior;\n userType: TUserTypes;\n inClass: boolean;\n }): number;\n}\n\nexport const getLastUnlockedQuestionIndex: IGetLastUnlockedQuestionIndex = ({\n questions,\n responses,\n behavior,\n userType,\n inClass,\n}) => {\n if (behavior.navigationMode === 'OPEN') {\n return questions.length - 1;\n }\n\n return getLastAttemptableQuestionIndex({\n questions,\n responses,\n behavior,\n userType,\n inClass,\n });\n};\n"],"names":["getLastUnlockedQuestionIndex","questions","responses","behavior","userType","inClass","getLastAttemptableQuestionIndex"],"mappings":";AAkBO,MAAMA,IAA8D,CAAC;AAAA,EAC1E,WAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAAC;AAAA,EACA,SAAAC;AACF,MACMF,EAAS,mBAAmB,SACvBF,EAAU,SAAS,IAGrBK,EAAgC;AAAA,EACrC,WAAAL;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAAC;AAAA,EACA,SAAAC;AAAA,CACD;"}
@@ -0,0 +1,19 @@
1
+ import { getQuestionMetadata as s } from "../../worksheet-helpers.js";
2
+ const i = (e, o, r) => {
3
+ const n = s(e.questions, o);
4
+ return n ? {
5
+ ...e,
6
+ responses: {
7
+ ...e.responses,
8
+ [o]: {
9
+ ...n,
10
+ ...e.responses[o],
11
+ ...r
12
+ }
13
+ }
14
+ } : e;
15
+ };
16
+ export {
17
+ i as getMergedResponseState
18
+ };
19
+ //# sourceMappingURL=get-merged-response-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-merged-response-state.js","sources":["../../../../../../src/features/worksheet/worksheet/worksheet-store/helpers/get-merged-response-state.ts"],"sourcesContent":["import { getQuestionMetadata } from '../../worksheet-helpers';\nimport type { IWorksheetResponse, IWorksheetStore } from '../../worksheet-types';\n\ninterface IGetMergedResponseState {\n (\n state: IWorksheetStore,\n responseId: string,\n newResponse: Partial<IWorksheetResponse>,\n ): IWorksheetStore;\n}\nexport const getMergedResponseState: IGetMergedResponseState = (state, responseId, newResponse) => {\n const questionMeta = getQuestionMetadata(state.questions, responseId);\n\n if (!questionMeta) return state;\n\n return {\n ...state,\n responses: {\n ...state.responses,\n [responseId]: {\n ...questionMeta,\n ...state.responses[responseId],\n ...newResponse,\n },\n },\n };\n};\n"],"names":["getMergedResponseState","state","responseId","newResponse","questionMeta","getQuestionMetadata"],"mappings":";AAUO,MAAMA,IAAkD,CAACC,GAAOC,GAAYC,MAAgB;AACjG,QAAMC,IAAeC,EAAoBJ,EAAM,WAAWC,CAAU;AAEhE,SAACE,IAEE;AAAA,IACL,GAAGH;AAAA,IACH,WAAW;AAAA,MACT,GAAGA,EAAM;AAAA,MACT,CAACC,CAAU,GAAG;AAAA,QACZ,GAAGE;AAAA,QACH,GAAGH,EAAM,UAAUC,CAAU;AAAA,QAC7B,GAAGC;AAAA,MACL;AAAA,IACF;AAAA,EAAA,IAXwBF;AAa5B;"}
@@ -0,0 +1,138 @@
1
+ import { EWorksheetActivity as S } from "../../../../../types/models/worksheet.js";
2
+ import { OPTIONAL_ITEM_TYPES as T } from "../../constants.js";
3
+ import { isConceptIntroWidget as I } from "../../worksheet-helpers.js";
4
+ import { QUESTION_TAGS as f } from "../../worksheet-types.js";
5
+ const L = (c) => {
6
+ switch (c) {
7
+ case "overview":
8
+ return "overview";
9
+ case "learning":
10
+ case "learning-we-do":
11
+ case "learning-your-turn":
12
+ case "learning-explore":
13
+ return "learning";
14
+ case "practice":
15
+ return "practice";
16
+ case "practice-basic":
17
+ case "practice-basic-optional":
18
+ return "practice-basic";
19
+ case "practice-regular":
20
+ case "practice-regular-optional":
21
+ return "practice-regular";
22
+ case "exit-ticket":
23
+ return "exit-ticket";
24
+ case "advanced-explore":
25
+ case "advanced-we-do":
26
+ case "advanced-your-turn":
27
+ case "advanced-practice":
28
+ return "advanced";
29
+ default:
30
+ return;
31
+ }
32
+ }, w = (c) => c.reduce((h, m) => {
33
+ const [l, g] = m.split(":"), s = l == null ? void 0 : l.trim(), t = g == null ? void 0 : g.trim();
34
+ return !s || !t ? h : {
35
+ ...h,
36
+ [s.toLowerCase()]: t
37
+ };
38
+ }, {}), V = (c, { nodeType: h, activityType: m }) => {
39
+ const l = c.reduce(
40
+ (s, t, o) => t.questions.reduce((n, e, i) => (n[e.response_id] = {
41
+ ...e,
42
+ // Some questions are set to limited number of attempts which can show feedback which is causing the question to be stuck in the errored state
43
+ feedback_attempts: void 0,
44
+ item_reference: t.reference,
45
+ item_number: o,
46
+ item_display_number: o + 1,
47
+ item_tags: t.tags ?? [],
48
+ item_tags_map: w(t.tags ?? []),
49
+ question_number: i,
50
+ total_questions: t.questions.length
51
+ }, n), s),
52
+ {}
53
+ );
54
+ if (h === "LEARNING" && (m === S.LESSON_V3 || m == S.LESSON_V3_1))
55
+ return c.reduce((s, t, o) => {
56
+ var N;
57
+ let n = !1, e;
58
+ const { content: i, itemType: r } = t, d = L(r), a = s[s.length - 1], v = d === (a == null ? void 0 : a.section_name) && (a != null && a.item_display_number) ? a.item_display_number + 1 : 1, O = i.match(/question-[^"]*/g), p = O == null ? void 0 : O.reduce(
59
+ (_, u, b) => {
60
+ const E = l[u.replace("question-", "")];
61
+ if (!E)
62
+ throw new Error(`Question not found for the response id: ${u}`);
63
+ const q = I(E.instructor_stimulus);
64
+ return n = n || q, q && m === S.LESSON_V3_1 ? (e = E.stimulus, _) : (_.push({
65
+ ...E,
66
+ concept_intro_stimulus: e,
67
+ is_non_question: m === S.LESSON_V3_1 && r === "overview",
68
+ item_display_number: v,
69
+ section_name: d,
70
+ item_type: r,
71
+ is_optional: r ? T.includes(r) : !1,
72
+ question_number: b - (n ? 1 : 0),
73
+ total_questions: O.length
74
+ }), e && (e = void 0), _);
75
+ },
76
+ []
77
+ );
78
+ if (n = !1, p != null && p[0] && o > 0 && c.length > 0) {
79
+ const _ = (N = c[o - 1]) == null ? void 0 : N.itemType, u = r != null && r.startsWith("advanced-") ? "advanced" : r, b = _ != null && _.startsWith("advanced-") ? "advanced" : _;
80
+ if ((u === "practice" || u === "practice-basic" || u === "practice-regular" || u === "exit-ticket" || u === "advanced") && u !== b)
81
+ return [
82
+ ...s,
83
+ {
84
+ ...p[0],
85
+ metadata: {
86
+ ...p[0].metadata,
87
+ teacher_tips: void 0,
88
+ hints: void 0,
89
+ solution: void 0
90
+ },
91
+ instructor_stimulus: "SystemIntro",
92
+ response_id: `${r}-system-intro`,
93
+ is_optional: r == null ? void 0 : r.startsWith("advanced-"),
94
+ is_non_question: m === S.LESSON_V3_1
95
+ },
96
+ ...p ?? []
97
+ ];
98
+ }
99
+ return [...s, ...p ?? []];
100
+ }, []);
101
+ const g = c.reduce((s, t) => {
102
+ const { content: o } = t, n = o.match(/question-[^"]*/g), e = n == null ? void 0 : n.map(
103
+ (i, r) => {
104
+ const d = l[i.replace("question-", "")];
105
+ if (!d)
106
+ throw new Error(`Question not found for the response id: ${i}`);
107
+ return {
108
+ ...d,
109
+ question_number: r,
110
+ total_questions: n.length
111
+ };
112
+ }
113
+ );
114
+ return [...s, ...e ?? []];
115
+ }, []);
116
+ if (h === "TRIAL_DIAGNOSTIC") {
117
+ const s = [], t = {};
118
+ return g.sort((o, n) => {
119
+ var a, v;
120
+ const e = o.item_tags_map[f.TRIAL_TOPIC], i = n.item_tags_map[f.TRIAL_TOPIC];
121
+ if (e && t[e] === void 0 && (t[e] = s.length, s.push(e)), i && t[i] === void 0 && (t[i] = s.length, s.push(i)), !e || !i)
122
+ return 0;
123
+ const r = `${t[e]}-${((a = o.item_tags_map[f.QUESTION_CODE]) == null ? void 0 : a.length) ?? 0}`, d = `${t[i]}-${((v = n.item_tags_map[f.QUESTION_CODE]) == null ? void 0 : v.length) ?? 0}`;
124
+ return r > d ? 1 : -1;
125
+ }).map((o) => {
126
+ const n = t[o.item_tags_map[f.TRIAL_TOPIC] ?? ""] ?? 0, e = o.item_tags_map[f.QUESTION_CODE] ?? "";
127
+ return {
128
+ ...o,
129
+ item_display_number: n * 3 + e.length
130
+ };
131
+ });
132
+ }
133
+ return g;
134
+ };
135
+ export {
136
+ V as getQuestionsFromItems
137
+ };
138
+ //# sourceMappingURL=get-questions-from-items.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-questions-from-items.js","sources":["../../../../../../src/features/worksheet/worksheet/worksheet-store/helpers/get-questions-from-items.ts"],"sourcesContent":["import { EWorksheetActivity, type TNodeTypes } from '../../../../../types/models/worksheet';\nimport { OPTIONAL_ITEM_TYPES } from '../../constants';\nimport { isConceptIntroWidget } from '../../worksheet-helpers';\nimport {\n QUESTION_TAGS,\n type ILearnosityItem,\n type IWorksheetProps,\n type IWorksheetQuestion,\n type TItemType,\n type TSectionName,\n} from '../../worksheet-types';\n\ninterface IGetSectionNameFromItemType {\n (itemType?: TItemType): TSectionName | undefined;\n}\n\nconst getSectionNameFromItemType: IGetSectionNameFromItemType = itemType => {\n switch (itemType) {\n case 'overview':\n return 'overview';\n case 'learning':\n case 'learning-we-do':\n case 'learning-your-turn':\n case 'learning-explore':\n return 'learning';\n case 'practice':\n return 'practice';\n case 'practice-basic':\n case 'practice-basic-optional':\n return 'practice-basic';\n case 'practice-regular':\n case 'practice-regular-optional':\n return 'practice-regular';\n case 'exit-ticket':\n return 'exit-ticket';\n case 'advanced-explore':\n case 'advanced-we-do':\n case 'advanced-your-turn':\n case 'advanced-practice':\n return 'advanced';\n default:\n return undefined;\n }\n};\n\nconst getTagsMap = (tags: string[]): Record<string, string> => {\n return tags.reduce((acc, tag) => {\n const [key, value] = tag.split(':');\n const trimmedKey = key?.trim();\n const trimmedValue = value?.trim();\n\n if (!trimmedKey || !trimmedValue) {\n return acc;\n }\n\n return {\n ...acc,\n [trimmedKey.toLowerCase()]: trimmedValue,\n };\n }, {});\n};\n\ninterface IGetQuestionsFromItems {\n (\n items: ILearnosityItem[],\n options: {\n nodeType: TNodeTypes;\n activityType: IWorksheetProps['activityType'];\n },\n ): IWorksheetQuestion[];\n}\nconst getQuestionsFromItems: IGetQuestionsFromItems = (items, { nodeType, activityType }) => {\n const questionsMap: Record<string, IWorksheetQuestion> = (() => {\n return items.reduce(\n (acc, item, itemIndex) =>\n item.questions.reduce((accInner, question, questionIndex) => {\n accInner[question.response_id] = {\n ...question,\n // Some questions are set to limited number of attempts which can show feedback which is causing the question to be stuck in the errored state\n feedback_attempts: undefined,\n item_reference: item.reference,\n item_number: itemIndex,\n item_display_number: itemIndex + 1,\n item_tags: item.tags ?? [],\n item_tags_map: getTagsMap(item.tags ?? []),\n question_number: questionIndex,\n total_questions: item.questions.length,\n };\n\n return accInner;\n }, acc),\n {} as Record<string, IWorksheetQuestion>,\n );\n })();\n\n if (\n nodeType === 'LEARNING' &&\n (activityType === EWorksheetActivity.LESSON_V3 ||\n activityType == EWorksheetActivity.LESSON_V3_1)\n ) {\n return items.reduce((acc, item, itemIndex) => {\n let hasIntroWidget = false;\n let conceptIntroStimulus: string | undefined;\n const { content, itemType } = item;\n const sectionName = getSectionNameFromItemType(itemType);\n const prevItem = acc[acc.length - 1];\n const itemDisplayNumber =\n sectionName === prevItem?.section_name && prevItem?.item_display_number\n ? prevItem.item_display_number + 1\n : 1;\n const orderedQuestionIds = content.match(/question-[^\"]*/g);\n const orderedQuestions = orderedQuestionIds?.reduce(\n (accQuestions, responseId, widgetIndex) => {\n const question = questionsMap[responseId.replace('question-', '')];\n\n if (!question) {\n throw new Error(`Question not found for the response id: ${responseId}`);\n }\n\n const isConceptIntro = isConceptIntroWidget(question.instructor_stimulus);\n\n hasIntroWidget = hasIntroWidget || isConceptIntro;\n\n if (isConceptIntro && activityType === EWorksheetActivity.LESSON_V3_1) {\n conceptIntroStimulus = question.stimulus;\n\n return accQuestions;\n }\n\n accQuestions.push({\n ...question,\n concept_intro_stimulus: conceptIntroStimulus,\n is_non_question:\n activityType === EWorksheetActivity.LESSON_V3_1 && itemType === 'overview',\n item_display_number: itemDisplayNumber,\n section_name: sectionName,\n item_type: itemType,\n is_optional: itemType ? OPTIONAL_ITEM_TYPES.includes(itemType) : false,\n question_number: widgetIndex - (hasIntroWidget ? 1 : 0),\n total_questions: orderedQuestionIds.length,\n } as IWorksheetQuestion);\n\n if (conceptIntroStimulus) conceptIntroStimulus = undefined;\n\n return accQuestions;\n },\n [] as IWorksheetQuestion[],\n );\n\n hasIntroWidget = false;\n\n if (orderedQuestions?.[0] && itemIndex > 0 && items.length > 0) {\n const prevItemType = items[itemIndex - 1]?.itemType;\n const itemTypeDerived = itemType?.startsWith('advanced-') ? 'advanced' : itemType;\n const prevItemTypeDerived = prevItemType?.startsWith('advanced-')\n ? 'advanced'\n : prevItemType;\n\n if (\n (itemTypeDerived === 'practice' ||\n itemTypeDerived === 'practice-basic' ||\n itemTypeDerived === 'practice-regular' ||\n itemTypeDerived === 'exit-ticket' ||\n itemTypeDerived === 'advanced') &&\n itemTypeDerived !== prevItemTypeDerived\n ) {\n return [\n ...acc,\n {\n ...orderedQuestions[0],\n metadata: {\n ...orderedQuestions[0].metadata,\n teacher_tips: undefined,\n hints: undefined,\n solution: undefined,\n },\n instructor_stimulus: 'SystemIntro',\n response_id: `${itemType}-system-intro`,\n is_optional: itemType?.startsWith('advanced-'),\n is_non_question: activityType === EWorksheetActivity.LESSON_V3_1,\n },\n ...(orderedQuestions ?? []),\n ];\n }\n }\n\n return [...acc, ...(orderedQuestions ?? [])];\n }, [] as IWorksheetQuestion[]);\n }\n\n const finalQuestions = items.reduce((acc, item) => {\n const { content } = item;\n const orderedQuestionIds = content.match(/question-[^\"]*/g);\n const orderedQuestions = orderedQuestionIds?.map<IWorksheetQuestion>(\n (responseId, widgetIndex) => {\n const question = questionsMap[responseId.replace('question-', '')];\n\n if (!question) {\n throw new Error(`Question not found for the response id: ${responseId}`);\n }\n\n return {\n ...question,\n question_number: widgetIndex,\n total_questions: orderedQuestionIds.length,\n };\n },\n );\n\n return [...acc, ...(orderedQuestions ?? [])];\n }, [] as IWorksheetQuestion[]);\n\n if (nodeType === 'TRIAL_DIAGNOSTIC') {\n const topics: string[] = [];\n const topicsOrder: Record<string, number> = {};\n\n return finalQuestions\n .sort((a, b) => {\n const aTopic = a.item_tags_map[QUESTION_TAGS.TRIAL_TOPIC];\n const bTopic = b.item_tags_map[QUESTION_TAGS.TRIAL_TOPIC];\n\n if (aTopic && topicsOrder[aTopic] === undefined) {\n topicsOrder[aTopic] = topics.length;\n topics.push(aTopic);\n }\n\n if (bTopic && topicsOrder[bTopic] === undefined) {\n topicsOrder[bTopic] = topics.length;\n topics.push(bTopic);\n }\n\n if (!aTopic || !bTopic) {\n return 0;\n }\n\n const aSortKey = `${topicsOrder[aTopic]}-${\n a.item_tags_map[QUESTION_TAGS.QUESTION_CODE]?.length ?? 0\n }`;\n const bSortKey = `${topicsOrder[bTopic]}-${\n b.item_tags_map[QUESTION_TAGS.QUESTION_CODE]?.length ?? 0\n }`;\n\n return aSortKey > bSortKey ? 1 : -1;\n })\n .map(question => {\n const topicOrder =\n topicsOrder[question.item_tags_map[QUESTION_TAGS.TRIAL_TOPIC] ?? ''] ?? 0;\n const questionCode = question.item_tags_map[QUESTION_TAGS.QUESTION_CODE] ?? '';\n\n return {\n ...question,\n item_display_number: topicOrder * 3 + questionCode.length,\n };\n });\n }\n\n return finalQuestions;\n};\n\nexport { getQuestionsFromItems };\n"],"names":["getSectionNameFromItemType","itemType","getTagsMap","tags","acc","tag","key","value","trimmedKey","trimmedValue","getQuestionsFromItems","items","nodeType","activityType","questionsMap","item","itemIndex","accInner","question","questionIndex","EWorksheetActivity","hasIntroWidget","conceptIntroStimulus","content","sectionName","prevItem","itemDisplayNumber","orderedQuestionIds","orderedQuestions","accQuestions","responseId","widgetIndex","isConceptIntro","isConceptIntroWidget","OPTIONAL_ITEM_TYPES","prevItemType","_a","itemTypeDerived","prevItemTypeDerived","finalQuestions","topics","topicsOrder","a","b","aTopic","QUESTION_TAGS","bTopic","aSortKey","bSortKey","_b","topicOrder","questionCode"],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ const u = ({
2
+ userType: e,
3
+ questions: r,
4
+ lastUnlockedQuestionIndex: t
5
+ }) => r.filter((s, n) => e === "TEACHER" ? !0 : n <= t);
6
+ export {
7
+ u as getRenderableQuestions
8
+ };
9
+ //# sourceMappingURL=get-renderable-questions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-renderable-questions.js","sources":["../../../../../../src/features/worksheet/worksheet/worksheet-store/helpers/get-renderable-questions.ts"],"sourcesContent":["import type { IWorksheetStore } from '../../worksheet-types';\n\ninterface IGetRenderableQuestions {\n (\n options: Pick<IWorksheetStore, 'questions' | 'lastUnlockedQuestionIndex' | 'userType'>,\n ): IWorksheetStore['questions'];\n}\nexport const getRenderableQuestions: IGetRenderableQuestions = ({\n userType,\n questions,\n lastUnlockedQuestionIndex,\n}) => {\n return questions.filter((_, index) => {\n const isUnlocked = userType === 'TEACHER' ? true : index <= lastUnlockedQuestionIndex;\n\n if (!isUnlocked) return false;\n\n return true;\n });\n};\n"],"names":["getRenderableQuestions","userType","questions","lastUnlockedQuestionIndex","_","index"],"mappings":"AAOO,MAAMA,IAAkD,CAAC;AAAA,EAC9D,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,2BAAAC;AACF,MACSD,EAAU,OAAO,CAACE,GAAGC,MACPJ,MAAa,YAAY,KAAOI,KAASF,CAK7D;"}
@@ -0,0 +1,230 @@
1
+ import { createContext as R } from "react";
2
+ import { createStore as U } from "zustand";
3
+ import { subscribeWithSelector as q } from "../../../../node_modules/zustand/esm/middleware.js";
4
+ import { scrollToQuestion as g } from "../worksheet-helpers.js";
5
+ import { getComputedProperties as v } from "./helpers/get-computed-properties.js";
6
+ import { getDerivedBlocker as S } from "./helpers/get-derived-blocker.js";
7
+ import { getLastUnlockedQuestionIndex as T } from "./helpers/get-last-unlocked-question-index.js";
8
+ import { getMergedResponseState as f } from "./helpers/get-merged-response-state.js";
9
+ import { getRenderableQuestions as V } from "./helpers/get-renderable-questions.js";
10
+ const F = (k) => {
11
+ const d = /* @__PURE__ */ new Set(), Q = (r, e) => {
12
+ const o = setTimeout(() => {
13
+ d.delete(o), r();
14
+ }, e);
15
+ return d.add(o), o;
16
+ }, x = () => {
17
+ d.forEach((r) => clearTimeout(r)), d.clear();
18
+ };
19
+ return U()(
20
+ q((r) => ({
21
+ // Initialize with exact props passed in
22
+ ...k,
23
+ ...v(k),
24
+ // Actions
25
+ mergeWorksheetProps: (e) => {
26
+ r((o) => ({
27
+ ...o,
28
+ ...e,
29
+ ...v(e, o)
30
+ }));
31
+ },
32
+ setResponses: (e) => {
33
+ r((o) => {
34
+ var u;
35
+ const i = {
36
+ ...o,
37
+ responses: typeof e == "function" ? e(o.responses) : e
38
+ }, { questions: t, responses: n, behavior: s, userType: c } = i, l = T({
39
+ questions: t,
40
+ responses: n,
41
+ behavior: s,
42
+ userType: c,
43
+ inClass: !!i.inClass
44
+ });
45
+ return {
46
+ ...i,
47
+ lastUnlockedQuestionIndex: l,
48
+ renderableQuestions: V({
49
+ questions: t,
50
+ lastUnlockedQuestionIndex: l,
51
+ userType: c
52
+ }),
53
+ blocker: S({
54
+ currentBlocker: o == null ? void 0 : o.blocker,
55
+ teacherValidationEnabled: s.teacherValidationEnabled,
56
+ userType: c,
57
+ lastUnlockedQuestion: t[l],
58
+ lastUnlockedQuestionResponse: n[((u = t[l]) == null ? void 0 : u.response_id) ?? ""]
59
+ })
60
+ };
61
+ });
62
+ },
63
+ updateResponse: ({ responseId: e, response: o, score: i, answerChecked: t, timeSpent: n }) => {
64
+ r((s) => {
65
+ var C;
66
+ const c = !!t, l = s.responses[e], u = f(s, e, {
67
+ response: o,
68
+ score: i,
69
+ responseEdited: !c,
70
+ attemptsHistory: c ? [...(l == null ? void 0 : l.attemptsHistory) ?? [], { response: o, score: i }] : l == null ? void 0 : l.attemptsHistory,
71
+ skipped: !o,
72
+ timeSpent: n,
73
+ retryEnabled: c ? !1 : l == null ? void 0 : l.retryEnabled
74
+ }), { questions: a, responses: b, behavior: h, userType: p } = u, m = T({
75
+ questions: a,
76
+ responses: b,
77
+ behavior: h,
78
+ userType: p,
79
+ inClass: !!u.inClass
80
+ }), y = b[e];
81
+ return y && s.onResponseChange && s.onResponseChange({
82
+ responseId: e,
83
+ response: y,
84
+ question: a.find((E) => E.response_id === e),
85
+ isNewAttempt: c
86
+ }), {
87
+ ...u,
88
+ lastUnlockedQuestionIndex: m,
89
+ renderableQuestions: V({
90
+ questions: a,
91
+ userType: p,
92
+ lastUnlockedQuestionIndex: m
93
+ }),
94
+ blocker: S({
95
+ currentBlocker: s == null ? void 0 : s.blocker,
96
+ teacherValidationEnabled: h.teacherValidationEnabled,
97
+ userType: p,
98
+ lastUnlockedQuestion: a[m],
99
+ lastUnlockedQuestionResponse: b[((C = a[m]) == null ? void 0 : C.response_id) ?? ""]
100
+ })
101
+ };
102
+ });
103
+ },
104
+ updateMediaState: (e, o, i) => {
105
+ const t = o === "SIMULATION" ? "simState" : void 0;
106
+ t && r((n) => {
107
+ if (n.onResponseChange) {
108
+ const s = f(n, e, { [t]: i }), c = s == null ? void 0 : s.responses[e];
109
+ return c && n.onResponseChange({
110
+ responseId: e,
111
+ response: c,
112
+ isNewAttempt: !1,
113
+ question: n.questions.find((l) => l.response_id === e)
114
+ }), s;
115
+ }
116
+ return n.onMediaStateChange && n.onMediaStateChange(
117
+ n.questions.find((s) => s.response_id === e),
118
+ o,
119
+ i
120
+ ), n;
121
+ });
122
+ },
123
+ setDiscussionQuestionOffset: (e, o) => {
124
+ r((i) => {
125
+ const t = f(i, e, {
126
+ discussionQuestionOffset: o
127
+ });
128
+ if (i.onResponseChange) {
129
+ const n = t == null ? void 0 : t.responses[e];
130
+ n && i.onResponseChange({
131
+ responseId: e,
132
+ response: n,
133
+ isNewAttempt: !1,
134
+ question: i.questions.find((s) => s.response_id === e)
135
+ });
136
+ }
137
+ return t;
138
+ });
139
+ },
140
+ showSummary: () => {
141
+ r((e) => ({
142
+ ...e,
143
+ summaryVisible: !0
144
+ }));
145
+ },
146
+ hideSummary: () => {
147
+ r((e) => ({
148
+ ...e,
149
+ summaryVisible: !1
150
+ }));
151
+ },
152
+ toggleSummary: () => {
153
+ r((e) => ({
154
+ ...e,
155
+ summaryVisible: !e.summaryVisible
156
+ }));
157
+ },
158
+ toggleCalculator: () => {
159
+ r((e) => ({
160
+ ...e,
161
+ calculatorVisible: !e.calculatorVisible
162
+ }));
163
+ },
164
+ toggleScribble: () => {
165
+ r((e) => ({
166
+ ...e,
167
+ scribblingEnabled: !e.scribblingEnabled
168
+ }));
169
+ },
170
+ setBlocker: (e) => {
171
+ r((o) => ({
172
+ ...o,
173
+ blocker: e
174
+ }));
175
+ },
176
+ removeBlocker: () => {
177
+ r((e) => {
178
+ var o;
179
+ if (e.blocker) {
180
+ const i = (o = e.questions[e.lastUnlockedQuestionIndex]) == null ? void 0 : o.response_id;
181
+ i && Q(() => {
182
+ g(i);
183
+ }, 50);
184
+ }
185
+ return {
186
+ ...e,
187
+ blocker: void 0
188
+ };
189
+ });
190
+ },
191
+ markForReview: (e, o) => {
192
+ r((i) => f(i, e, { markedForReview: o }));
193
+ },
194
+ changeQuestion: (e, o = !0, i = 0) => {
195
+ r((t) => {
196
+ var s;
197
+ const n = {
198
+ ...t,
199
+ summaryVisible: !1
200
+ };
201
+ return o && t.layout.questionsScrollable ? i > 0 ? Q(() => {
202
+ g(e);
203
+ }, i) : requestAnimationFrame(() => g(e)) : t.activeQuestionId !== e && (n.activeQuestionId = e, n.activeQuestionIndex = n.questions.findIndex(
204
+ (c) => c.response_id === e
205
+ ), n.activeQuestionTool = void 0, (s = n.onActiveQuestionChange) == null || s.call(n, n.questions[n.activeQuestionIndex])), n;
206
+ });
207
+ },
208
+ setActiveQuestionTool(e) {
209
+ r((o) => ({
210
+ ...o,
211
+ activeQuestionTool: e
212
+ }));
213
+ },
214
+ unsetActiveQuestionTool() {
215
+ r((e) => ({
216
+ ...e,
217
+ activeQuestionTool: void 0
218
+ }));
219
+ },
220
+ destroy: () => {
221
+ x();
222
+ }
223
+ }))
224
+ );
225
+ }, L = R(null);
226
+ export {
227
+ L as WorksheetContext,
228
+ F as createWorksheetStore
229
+ };
230
+ //# sourceMappingURL=worksheet-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worksheet-store.js","sources":["../../../../../src/features/worksheet/worksheet/worksheet-store/worksheet-store.ts"],"sourcesContent":["import { createContext } from 'react';\nimport { createStore } from 'zustand';\nimport { subscribeWithSelector } from 'zustand/middleware';\n\nimport { scrollToQuestion } from '../worksheet-helpers';\nimport type { IWorksheetStore, TWorksheetStoreProps } from '../worksheet-types';\nimport { getComputedProperties } from './helpers/get-computed-properties';\nimport { getDerivedBlocker } from './helpers/get-derived-blocker';\nimport { getLastUnlockedQuestionIndex } from './helpers/get-last-unlocked-question-index';\nimport { getMergedResponseState } from './helpers/get-merged-response-state';\nimport { getRenderableQuestions } from './helpers/get-renderable-questions';\n\n// Store creator function with strict typing\nexport const createWorksheetStore = (initProps: TWorksheetStoreProps) => {\n // Register store instance for memory leak monitoring\n\n // Track active timeouts to enable cleanup\n const activeTimeouts = new Set<NodeJS.Timeout>();\n\n const createManagedTimeout = (callback: () => void, delay: number): NodeJS.Timeout => {\n const timeoutId = setTimeout(() => {\n activeTimeouts.delete(timeoutId);\n callback();\n }, delay);\n\n activeTimeouts.add(timeoutId);\n\n return timeoutId;\n };\n\n const clearAllTimeouts = () => {\n activeTimeouts.forEach(timeoutId => clearTimeout(timeoutId));\n activeTimeouts.clear();\n };\n\n return createStore<IWorksheetStore>()(\n subscribeWithSelector(set => {\n return {\n // Initialize with exact props passed in\n ...initProps,\n ...getComputedProperties(initProps),\n\n // Actions\n mergeWorksheetProps: (data: TWorksheetStoreProps) => {\n set(state => ({\n ...state,\n ...data,\n ...getComputedProperties(data, state),\n }));\n },\n\n setResponses: responses => {\n set(state => {\n const newState = {\n ...state,\n responses: typeof responses === 'function' ? responses(state.responses) : responses,\n };\n const { questions, responses: newResponses, behavior, userType } = newState;\n const lastUnlockedQuestionIndex = getLastUnlockedQuestionIndex({\n questions,\n responses: newResponses,\n behavior,\n userType,\n inClass: !!newState.inClass,\n });\n\n return {\n ...newState,\n lastUnlockedQuestionIndex,\n renderableQuestions: getRenderableQuestions({\n questions,\n lastUnlockedQuestionIndex,\n userType,\n }),\n blocker: getDerivedBlocker({\n currentBlocker: state?.blocker,\n teacherValidationEnabled: behavior.teacherValidationEnabled,\n userType,\n lastUnlockedQuestion: questions[lastUnlockedQuestionIndex]!,\n lastUnlockedQuestionResponse:\n newResponses[questions[lastUnlockedQuestionIndex]?.response_id ?? ''],\n }),\n };\n });\n },\n\n updateResponse: ({ responseId, response, score, answerChecked, timeSpent }) => {\n set(state => {\n const isNewAttempt = !!answerChecked;\n const prevResponse = state.responses[responseId];\n\n const newState = getMergedResponseState(state, responseId, {\n response,\n score,\n responseEdited: !isNewAttempt,\n attemptsHistory: isNewAttempt\n ? [...(prevResponse?.attemptsHistory ?? []), { response, score }]\n : prevResponse?.attemptsHistory,\n skipped: !response,\n timeSpent,\n retryEnabled: isNewAttempt ? false : prevResponse?.retryEnabled,\n });\n const { questions, responses, behavior, userType } = newState;\n const lastUnlockedQuestionIndex = getLastUnlockedQuestionIndex({\n questions,\n responses,\n behavior,\n userType,\n inClass: !!newState.inClass,\n });\n const newResponse = responses[responseId];\n\n if (newResponse && state.onResponseChange) {\n state.onResponseChange({\n responseId,\n response: newResponse,\n question: questions.find(q => q.response_id === responseId)!,\n isNewAttempt,\n });\n }\n\n return {\n ...newState,\n lastUnlockedQuestionIndex,\n renderableQuestions: getRenderableQuestions({\n questions,\n userType,\n lastUnlockedQuestionIndex,\n }),\n blocker: getDerivedBlocker({\n currentBlocker: state?.blocker,\n teacherValidationEnabled: behavior.teacherValidationEnabled,\n userType,\n lastUnlockedQuestion: questions[lastUnlockedQuestionIndex]!,\n lastUnlockedQuestionResponse:\n responses[questions[lastUnlockedQuestionIndex]?.response_id ?? ''],\n }),\n };\n });\n },\n\n updateMediaState: (responseId, mediaType, mediaState) => {\n const key = mediaType === 'SIMULATION' ? 'simState' : undefined;\n\n if (!key) return;\n\n set(state => {\n if (state.onResponseChange) {\n const newState = getMergedResponseState(state, responseId, { [key]: mediaState });\n const response = newState?.responses[responseId];\n\n if (response) {\n state.onResponseChange({\n responseId,\n response,\n isNewAttempt: false,\n question: state.questions.find(q => q.response_id === responseId)!,\n });\n }\n\n return newState;\n }\n\n if (state.onMediaStateChange) {\n state.onMediaStateChange(\n state.questions.find(q => q.response_id === responseId)!,\n mediaType,\n mediaState,\n );\n }\n\n return state;\n });\n },\n\n setDiscussionQuestionOffset: (responseId, offset) => {\n set(state => {\n const newState = getMergedResponseState(state, responseId, {\n discussionQuestionOffset: offset,\n });\n\n if (state.onResponseChange) {\n const response = newState?.responses[responseId];\n\n if (response) {\n state.onResponseChange({\n responseId,\n response,\n isNewAttempt: false,\n question: state.questions.find(q => q.response_id === responseId)!,\n });\n }\n }\n\n return newState;\n });\n },\n\n showSummary: () => {\n set(state => ({\n ...state,\n summaryVisible: true,\n }));\n },\n\n hideSummary: () => {\n set(state => ({\n ...state,\n summaryVisible: false,\n }));\n },\n\n toggleSummary: () => {\n set(state => ({\n ...state,\n summaryVisible: !state.summaryVisible,\n }));\n },\n\n toggleCalculator: () => {\n set(state => ({\n ...state,\n calculatorVisible: !state.calculatorVisible,\n }));\n },\n\n toggleScribble: () => {\n set(state => ({\n ...state,\n scribblingEnabled: !state.scribblingEnabled,\n }));\n },\n\n setBlocker: blocker => {\n set(state => ({\n ...state,\n blocker,\n }));\n },\n\n removeBlocker: () => {\n set(state => {\n if (state.blocker) {\n const lastUnlockedQuestionId =\n state.questions[state.lastUnlockedQuestionIndex]?.response_id;\n\n if (lastUnlockedQuestionId) {\n createManagedTimeout(() => {\n scrollToQuestion(lastUnlockedQuestionId);\n }, 50);\n }\n }\n\n return {\n ...state,\n blocker: undefined,\n };\n });\n },\n\n markForReview: (responseId: string, markedForReview: boolean) => {\n set(state => getMergedResponseState(state, responseId, { markedForReview }));\n },\n\n changeQuestion: (questionId, shouldScroll = true, scrollDelay = 0) => {\n set(state => {\n const newState = {\n ...state,\n summaryVisible: false,\n };\n\n if (shouldScroll && state.layout.questionsScrollable) {\n if (scrollDelay > 0) {\n createManagedTimeout(() => {\n scrollToQuestion(questionId);\n }, scrollDelay);\n } else {\n requestAnimationFrame(() => scrollToQuestion(questionId));\n }\n } else if (state.activeQuestionId !== questionId) {\n newState.activeQuestionId = questionId;\n newState.activeQuestionIndex = newState.questions.findIndex(\n question => question.response_id === questionId,\n );\n newState.activeQuestionTool = undefined;\n\n newState.onActiveQuestionChange?.(newState.questions[newState.activeQuestionIndex]!);\n }\n\n return newState;\n });\n },\n\n setActiveQuestionTool(tool) {\n set(state => ({\n ...state,\n activeQuestionTool: tool,\n }));\n },\n\n unsetActiveQuestionTool() {\n set(state => ({\n ...state,\n activeQuestionTool: undefined,\n }));\n },\n\n destroy: () => {\n clearAllTimeouts();\n },\n };\n }),\n );\n};\n\n// Create context with store type\nexport const WorksheetContext = createContext<ReturnType<typeof createWorksheetStore> | null>(null);\n"],"names":["createWorksheetStore","initProps","activeTimeouts","createManagedTimeout","callback","delay","timeoutId","clearAllTimeouts","createStore","subscribeWithSelector","set","getComputedProperties","data","state","responses","newState","questions","newResponses","behavior","userType","lastUnlockedQuestionIndex","getLastUnlockedQuestionIndex","getRenderableQuestions","getDerivedBlocker","_a","responseId","response","score","answerChecked","timeSpent","isNewAttempt","prevResponse","getMergedResponseState","newResponse","q","mediaType","mediaState","key","offset","blocker","lastUnlockedQuestionId","scrollToQuestion","markedForReview","questionId","shouldScroll","scrollDelay","question","tool","WorksheetContext","createContext"],"mappings":"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"}