analytica-frontend-lib 1.6.21 → 1.6.22

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 (405) hide show
  1. package/dist/AccessReportModal/index.js +1 -1
  2. package/dist/AccessReportModal/index.mjs +1 -1
  3. package/dist/AccessibilityWidget/index.js +1 -1
  4. package/dist/AccessibilityWidget/index.mjs +1 -1
  5. package/dist/Accordation/index.js +1 -1
  6. package/dist/Accordation/index.mjs +1 -1
  7. package/dist/ActivitiesHistory/index.js +19 -19
  8. package/dist/ActivitiesHistory/index.mjs +18 -18
  9. package/dist/ActivityCardQuestionBanks/index.js +19 -19
  10. package/dist/ActivityCardQuestionBanks/index.mjs +18 -18
  11. package/dist/ActivityCardQuestionPreview/index.js +19 -19
  12. package/dist/ActivityCardQuestionPreview/index.mjs +18 -18
  13. package/dist/ActivityCreate/ActivityCreate.utils/index.js +3 -3
  14. package/dist/ActivityCreate/ActivityCreate.utils/index.mjs +2 -2
  15. package/dist/ActivityCreate/ActivityCreateContent/index.js +19 -19
  16. package/dist/ActivityCreate/ActivityCreateContent/index.mjs +18 -18
  17. package/dist/ActivityCreate/index.js +19 -19
  18. package/dist/ActivityCreate/index.mjs +18 -18
  19. package/dist/ActivityDetails/index.js +19 -19
  20. package/dist/ActivityDetails/index.mjs +18 -18
  21. package/dist/ActivityFilters/index.js +19 -19
  22. package/dist/ActivityFilters/index.mjs +18 -18
  23. package/dist/ActivityPageLayout/index.js +19 -19
  24. package/dist/ActivityPageLayout/index.mjs +18 -18
  25. package/dist/ActivityPreview/index.js +19 -19
  26. package/dist/ActivityPreview/index.mjs +18 -18
  27. package/dist/Alert/index.js +1 -1
  28. package/dist/Alert/index.mjs +1 -1
  29. package/dist/AlertDialog/index.js +1 -1
  30. package/dist/AlertDialog/index.mjs +1 -1
  31. package/dist/AlertManager/index.js +19 -19
  32. package/dist/AlertManager/index.mjs +18 -18
  33. package/dist/AlertManagerView/index.js +1 -1
  34. package/dist/AlertManagerView/index.mjs +1 -1
  35. package/dist/Alternative/index.js +1 -1
  36. package/dist/Alternative/index.mjs +1 -1
  37. package/dist/AnnouncementModal/index.js +1 -1
  38. package/dist/AnnouncementModal/index.mjs +1 -1
  39. package/dist/AnnouncementsGate/index.js +1 -1
  40. package/dist/AnnouncementsGate/index.mjs +1 -1
  41. package/dist/AnswerKeyModal/index.js +1 -1
  42. package/dist/AnswerKeyModal/index.mjs +1 -1
  43. package/dist/AppHeader/index.js +1 -1
  44. package/dist/AppHeader/index.mjs +1 -1
  45. package/dist/AppLayout/index.js +1 -1
  46. package/dist/AppLayout/index.mjs +1 -1
  47. package/dist/Avatar/index.js +1 -1
  48. package/dist/Avatar/index.mjs +1 -1
  49. package/dist/Badge/index.js +1 -1
  50. package/dist/Badge/index.mjs +1 -1
  51. package/dist/BreadcrumbMenu/index.js +1 -1
  52. package/dist/BreadcrumbMenu/index.mjs +1 -1
  53. package/dist/Button/index.js +1 -1
  54. package/dist/Button/index.mjs +1 -1
  55. package/dist/Calendar/index.js +1 -1
  56. package/dist/Calendar/index.mjs +1 -1
  57. package/dist/CalendarCard/index.js +1 -1
  58. package/dist/CalendarCard/index.mjs +1 -1
  59. package/dist/Card/index.js +1 -1
  60. package/dist/Card/index.mjs +1 -1
  61. package/dist/ChartComponents/index.js +1 -1
  62. package/dist/ChartComponents/index.mjs +1 -1
  63. package/dist/Chat/index.js +1 -1
  64. package/dist/Chat/index.mjs +1 -1
  65. package/dist/Chatbot/index.js +1 -1
  66. package/dist/Chatbot/index.mjs +1 -1
  67. package/dist/CheckBox/index.js +1 -1
  68. package/dist/CheckBox/index.mjs +1 -1
  69. package/dist/CheckBoxGroup/index.js +19 -19
  70. package/dist/CheckBoxGroup/index.mjs +18 -18
  71. package/dist/Chips/index.js +1 -1
  72. package/dist/Chips/index.mjs +1 -1
  73. package/dist/ChoroplethMap/index.js +1 -1
  74. package/dist/ChoroplethMap/index.mjs +1 -1
  75. package/dist/ColorPicker/index.js +1 -1
  76. package/dist/ColorPicker/index.mjs +1 -1
  77. package/dist/ComparatorChart/ComparatorView/index.js +1 -1
  78. package/dist/ComparatorChart/ComparatorView/index.mjs +1 -1
  79. package/dist/CorrectActivityModal/index.js +6 -6
  80. package/dist/CorrectActivityModal/index.mjs +5 -5
  81. package/dist/Divider/index.js +1 -1
  82. package/dist/Divider/index.mjs +1 -1
  83. package/dist/DownloadButton/index.js +1 -1
  84. package/dist/DownloadButton/index.mjs +1 -1
  85. package/dist/DownloadModal/index.js +1 -1
  86. package/dist/DownloadModal/index.mjs +1 -1
  87. package/dist/DragHandleButton/index.js +1 -1
  88. package/dist/DragHandleButton/index.mjs +1 -1
  89. package/dist/DropdownMenu/index.js +1 -1
  90. package/dist/DropdownMenu/index.mjs +1 -1
  91. package/dist/EmptyState/index.js +1 -1
  92. package/dist/EmptyState/index.mjs +1 -1
  93. package/dist/EnemClassroomStartModal/index.d.ts +0 -2
  94. package/dist/EnemClassroomStartModal/index.d.ts.map +1 -1
  95. package/dist/EnemClassroomStartModal/index.js +4 -6
  96. package/dist/EnemClassroomStartModal/index.js.map +1 -1
  97. package/dist/EnemClassroomStartModal/index.mjs +3 -5
  98. package/dist/EssayThemePicker/index.js +1 -1
  99. package/dist/EssayThemePicker/index.mjs +1 -1
  100. package/dist/ExamDetailsLayout/ExamDetailsPage/index.js +19 -19
  101. package/dist/ExamDetailsLayout/ExamDetailsPage/index.mjs +18 -18
  102. package/dist/ExamPageLayout/examsTableConfig/index.js +1 -1
  103. package/dist/ExamPageLayout/examsTableConfig/index.mjs +1 -1
  104. package/dist/ExamPageLayout/index.js +19 -19
  105. package/dist/ExamPageLayout/index.mjs +18 -18
  106. package/dist/FileAttachment/index.js +1 -1
  107. package/dist/FileAttachment/index.mjs +1 -1
  108. package/dist/FileDropzone/index.js +1 -1
  109. package/dist/FileDropzone/index.mjs +1 -1
  110. package/dist/Forum/index.js +4 -4
  111. package/dist/Forum/index.mjs +3 -3
  112. package/dist/HtmlMathRenderer/index.js +1 -1
  113. package/dist/HtmlMathRenderer/index.mjs +1 -1
  114. package/dist/IconButton/index.js +1 -1
  115. package/dist/IconButton/index.mjs +1 -1
  116. package/dist/IconRoundedButton/index.js +1 -1
  117. package/dist/IconRoundedButton/index.mjs +1 -1
  118. package/dist/ImagePreviewCard/index.js +1 -1
  119. package/dist/ImagePreviewCard/index.mjs +1 -1
  120. package/dist/ImageUpload/index.js +1 -1
  121. package/dist/ImageUpload/index.mjs +1 -1
  122. package/dist/LatexRenderer/index.js +1 -1
  123. package/dist/LatexRenderer/index.mjs +1 -1
  124. package/dist/LevelBar/index.js +1 -1
  125. package/dist/LevelBar/index.mjs +1 -1
  126. package/dist/Menu/index.js +1 -1
  127. package/dist/Menu/index.mjs +1 -1
  128. package/dist/MetricBox/index.js +1 -1
  129. package/dist/MetricBox/index.mjs +1 -1
  130. package/dist/Modal/index.js +1 -1
  131. package/dist/Modal/index.mjs +1 -1
  132. package/dist/ModalComponents/index.js +1 -1
  133. package/dist/ModalComponents/index.mjs +1 -1
  134. package/dist/MultiSearchSelect/index.js +1 -1
  135. package/dist/MultiSearchSelect/index.mjs +1 -1
  136. package/dist/MultipleChoice/index.js +1 -1
  137. package/dist/MultipleChoice/index.mjs +1 -1
  138. package/dist/NavButton/index.js +1 -1
  139. package/dist/NavButton/index.mjs +1 -1
  140. package/dist/NoSearchResult/index.js +1 -1
  141. package/dist/NoSearchResult/index.mjs +1 -1
  142. package/dist/NotFound/index.js +1 -1
  143. package/dist/NotFound/index.mjs +1 -1
  144. package/dist/NotificationCard/index.js +1 -1
  145. package/dist/NotificationCard/index.mjs +1 -1
  146. package/dist/PerformanceDistributionChart/index.js +1 -1
  147. package/dist/PerformanceDistributionChart/index.mjs +1 -1
  148. package/dist/PerformanceQuestionsData/index.js +1 -1
  149. package/dist/PerformanceQuestionsData/index.mjs +1 -1
  150. package/dist/PerformanceRanking/index.js +1 -1
  151. package/dist/PerformanceRanking/index.mjs +1 -1
  152. package/dist/PerformanceReport/index.js +1 -1
  153. package/dist/PerformanceReport/index.mjs +1 -1
  154. package/dist/PerformanceReportModal/index.js +1 -1
  155. package/dist/PerformanceReportModal/index.mjs +1 -1
  156. package/dist/PeriodSelector/index.js +1 -1
  157. package/dist/PeriodSelector/index.mjs +1 -1
  158. package/dist/PrintableUsersTable/index.js +19 -19
  159. package/dist/PrintableUsersTable/index.mjs +18 -18
  160. package/dist/ProficiencyChart/index.js +1 -1
  161. package/dist/ProficiencyChart/index.mjs +1 -1
  162. package/dist/ProgressBar/index.js +1 -1
  163. package/dist/ProgressBar/index.mjs +1 -1
  164. package/dist/ProgressCircle/index.js +1 -1
  165. package/dist/ProgressCircle/index.mjs +1 -1
  166. package/dist/ProgressModal/index.js +1 -1
  167. package/dist/ProgressModal/index.mjs +1 -1
  168. package/dist/QuestionsData/index.js +1 -1
  169. package/dist/QuestionsData/index.mjs +1 -1
  170. package/dist/QuestionsPerformanceCard/index.js +19 -19
  171. package/dist/QuestionsPerformanceCard/index.mjs +18 -18
  172. package/dist/Quiz/QuizResult/index.d.ts.map +1 -1
  173. package/dist/Quiz/QuizResult/index.js +4 -4
  174. package/dist/Quiz/QuizResult/index.mjs +3 -3
  175. package/dist/Quiz/TeacherFeedbackSection/index.js +3 -3
  176. package/dist/Quiz/TeacherFeedbackSection/index.mjs +2 -2
  177. package/dist/Quiz/TeacherQuestionComment/index.js +3 -3
  178. package/dist/Quiz/TeacherQuestionComment/index.mjs +2 -2
  179. package/dist/Quiz/index.d.ts.map +1 -1
  180. package/dist/Quiz/index.js +6 -6
  181. package/dist/Quiz/index.mjs +5 -5
  182. package/dist/Quiz/useQuizStore/index.d.ts +6 -0
  183. package/dist/Quiz/useQuizStore/index.d.ts.map +1 -1
  184. package/dist/Quiz/useQuizStore/index.js +2 -2
  185. package/dist/Quiz/useQuizStore/index.mjs +1 -1
  186. package/dist/QuizTimer/index.js +3 -3
  187. package/dist/QuizTimer/index.mjs +2 -2
  188. package/dist/Radio/index.js +1 -1
  189. package/dist/Radio/index.mjs +1 -1
  190. package/dist/RangeGauge/index.js +1 -1
  191. package/dist/RangeGauge/index.mjs +1 -1
  192. package/dist/RecommendedLessonCreate/index.js +19 -19
  193. package/dist/RecommendedLessonCreate/index.mjs +18 -18
  194. package/dist/RecommendedLessonDetails/index.js +1 -1
  195. package/dist/RecommendedLessonDetails/index.mjs +1 -1
  196. package/dist/RecommendedLessonsHistory/index.js +19 -19
  197. package/dist/RecommendedLessonsHistory/index.mjs +18 -18
  198. package/dist/ReportDetailModal/index.js +1 -1
  199. package/dist/ReportDetailModal/index.mjs +1 -1
  200. package/dist/RestrictedAccess/index.js +1 -1
  201. package/dist/RestrictedAccess/index.mjs +1 -1
  202. package/dist/RichEditor/index.js +3 -3
  203. package/dist/RichEditor/index.mjs +2 -2
  204. package/dist/{RichEditorCore-F5QPQLEK.js → RichEditorCore-NEIZKFKE.js} +2 -2
  205. package/dist/{RichEditorCore-F5QPQLEK.js.map → RichEditorCore-NEIZKFKE.js.map} +1 -1
  206. package/dist/{RichEditorCore-QZYPHNRY.mjs → RichEditorCore-TLAFZ5XG.mjs} +2 -2
  207. package/dist/ScoreCircle/index.js +1 -1
  208. package/dist/ScoreCircle/index.mjs +1 -1
  209. package/dist/Search/index.js +1 -1
  210. package/dist/Search/index.mjs +1 -1
  211. package/dist/SearchSelect/index.js +1 -1
  212. package/dist/SearchSelect/index.mjs +1 -1
  213. package/dist/Select/index.js +1 -1
  214. package/dist/Select/index.mjs +1 -1
  215. package/dist/SelectionButton/index.js +1 -1
  216. package/dist/SelectionButton/index.mjs +1 -1
  217. package/dist/SendActivityModal/SendActivityModal.js +19 -19
  218. package/dist/SendActivityModal/SendActivityModal.mjs +18 -18
  219. package/dist/SendActivityModal/index.js +19 -19
  220. package/dist/SendActivityModal/index.mjs +18 -18
  221. package/dist/SendLessonModal/index.js +19 -19
  222. package/dist/SendLessonModal/index.mjs +18 -18
  223. package/dist/SimpleBarChart/index.js +1 -1
  224. package/dist/SimpleBarChart/index.mjs +1 -1
  225. package/dist/SimulatedPerformance/SimulatedPerformanceView/index.js +19 -19
  226. package/dist/SimulatedPerformance/SimulatedPerformanceView/index.mjs +18 -18
  227. package/dist/SimulatedPerformance/useSimulatedPerformance/index.js +1 -1
  228. package/dist/SimulatedPerformance/useSimulatedPerformance/index.mjs +1 -1
  229. package/dist/SimulatedStudentSimulationsModal/index.js +19 -19
  230. package/dist/SimulatedStudentSimulationsModal/index.mjs +5 -5
  231. package/dist/SimulationsPage/index.js +19 -19
  232. package/dist/SimulationsPage/index.mjs +18 -18
  233. package/dist/Skeleton/index.js +1 -1
  234. package/dist/Skeleton/index.mjs +1 -1
  235. package/dist/StatisticsCard/index.js +1 -1
  236. package/dist/StatisticsCard/index.mjs +1 -1
  237. package/dist/Stepper/index.js +1 -1
  238. package/dist/Stepper/index.mjs +1 -1
  239. package/dist/StudentLessonProgressModal/index.js +1 -1
  240. package/dist/StudentLessonProgressModal/index.mjs +1 -1
  241. package/dist/StudentPerformanceDetailsModal/index.js +1 -1
  242. package/dist/StudentPerformanceDetailsModal/index.mjs +1 -1
  243. package/dist/StudentRanking/index.js +1 -1
  244. package/dist/StudentRanking/index.mjs +1 -1
  245. package/dist/SubjectIcons/index.js +1 -1
  246. package/dist/SubjectIcons/index.mjs +1 -1
  247. package/dist/SubjectMenuOverflow/index.js +1 -1
  248. package/dist/SubjectMenuOverflow/index.mjs +1 -1
  249. package/dist/Support/TicketModal/index.js +1 -1
  250. package/dist/Support/TicketModal/index.mjs +1 -1
  251. package/dist/Support/index.js +1 -1
  252. package/dist/Support/index.mjs +1 -1
  253. package/dist/Table/TablePagination/index.js +1 -1
  254. package/dist/Table/TablePagination/index.mjs +1 -1
  255. package/dist/Table/index.js +1 -1
  256. package/dist/Table/index.mjs +1 -1
  257. package/dist/TableProvider/index.js +19 -19
  258. package/dist/TableProvider/index.mjs +18 -18
  259. package/dist/Text/index.js +1 -1
  260. package/dist/Text/index.mjs +1 -1
  261. package/dist/TextArea/index.js +1 -1
  262. package/dist/TextArea/index.mjs +1 -1
  263. package/dist/ThemeToggle/index.js +1 -1
  264. package/dist/ThemeToggle/index.mjs +1 -1
  265. package/dist/TimeChart/index.js +1 -1
  266. package/dist/TimeChart/index.mjs +1 -1
  267. package/dist/TimeReport/index.js +1 -1
  268. package/dist/TimeReport/index.mjs +1 -1
  269. package/dist/Toast/Toaster/index.js +1 -1
  270. package/dist/Toast/Toaster/index.mjs +1 -1
  271. package/dist/Toast/index.js +1 -1
  272. package/dist/Toast/index.mjs +1 -1
  273. package/dist/ToggleSwitch/index.js +1 -1
  274. package/dist/ToggleSwitch/index.mjs +1 -1
  275. package/dist/TokenValidation/index.js +1 -1
  276. package/dist/TokenValidation/index.mjs +1 -1
  277. package/dist/Tooltip/index.js +1 -1
  278. package/dist/Tooltip/index.mjs +1 -1
  279. package/dist/TruncatedText/index.js +1 -1
  280. package/dist/TruncatedText/index.mjs +1 -1
  281. package/dist/TypeSelector/index.js +1 -1
  282. package/dist/TypeSelector/index.mjs +1 -1
  283. package/dist/UnifiedDraftModelPage/index.js +19 -19
  284. package/dist/UnifiedDraftModelPage/index.mjs +18 -18
  285. package/dist/UnifiedHistoryPage/index.js +19 -19
  286. package/dist/UnifiedHistoryPage/index.mjs +18 -18
  287. package/dist/VerticalBarChart/index.js +1 -1
  288. package/dist/VerticalBarChart/index.mjs +1 -1
  289. package/dist/VideoPlayer/index.js +1 -1
  290. package/dist/VideoPlayer/index.mjs +1 -1
  291. package/dist/Whiteboard/index.js +1 -1
  292. package/dist/Whiteboard/index.mjs +1 -1
  293. package/dist/{chunk-JBAGQ7L5.js → chunk-3VG5MEMY.js} +14 -13
  294. package/dist/chunk-3VG5MEMY.js.map +1 -0
  295. package/dist/{chunk-ED23HOE6.mjs → chunk-5NIU4XJY.mjs} +7 -6
  296. package/dist/chunk-5NIU4XJY.mjs.map +1 -0
  297. package/dist/{chunk-DDZDNGBU.mjs → chunk-64WGFT5E.mjs} +3 -1
  298. package/dist/chunk-64WGFT5E.mjs.map +1 -0
  299. package/dist/{chunk-QN32O3J3.js → chunk-6MK23BTK.js} +62 -62
  300. package/dist/{chunk-QN32O3J3.js.map → chunk-6MK23BTK.js.map} +1 -1
  301. package/dist/{chunk-XX4WE4TL.js → chunk-726PIA5M.js} +1 -1
  302. package/dist/chunk-726PIA5M.js.map +1 -0
  303. package/dist/{chunk-VZJKHIHN.mjs → chunk-7KALNPIG.mjs} +4 -4
  304. package/dist/{chunk-NQNEG4KR.mjs → chunk-7VKFZHWP.mjs} +11 -10
  305. package/dist/chunk-7VKFZHWP.mjs.map +1 -0
  306. package/dist/{chunk-GYQUB3VW.js → chunk-BBFV3NDF.js} +8 -6
  307. package/dist/chunk-BBFV3NDF.js.map +1 -0
  308. package/dist/{chunk-I3Z2BHGN.js → chunk-BJHYT75K.js} +3 -3
  309. package/dist/{chunk-I3Z2BHGN.js.map → chunk-BJHYT75K.js.map} +1 -1
  310. package/dist/{chunk-CFTQ24UT.mjs → chunk-CMYBNZ74.mjs} +2 -2
  311. package/dist/{chunk-R7NS5KFE.mjs → chunk-CWUNF7U6.mjs} +3 -3
  312. package/dist/{chunk-NAOHJW6H.mjs → chunk-DLHV7CZN.mjs} +6 -6
  313. package/dist/{chunk-7EXSCXPK.mjs → chunk-DMYETMZG.mjs} +2 -2
  314. package/dist/{chunk-RQPSA4QV.js → chunk-GQUTHDV2.js} +3 -3
  315. package/dist/{chunk-RQPSA4QV.js.map → chunk-GQUTHDV2.js.map} +1 -1
  316. package/dist/{chunk-OZWPOXVU.mjs → chunk-GVGDUCVF.mjs} +2 -2
  317. package/dist/{chunk-QFWY46XU.js → chunk-IMDS5NQL.js} +16 -16
  318. package/dist/{chunk-QFWY46XU.js.map → chunk-IMDS5NQL.js.map} +1 -1
  319. package/dist/{chunk-KYGFYAU7.js → chunk-JHN35HPH.js} +3 -3
  320. package/dist/{chunk-KYGFYAU7.js.map → chunk-JHN35HPH.js.map} +1 -1
  321. package/dist/{chunk-DMZTDCUF.js → chunk-JPQI2RIV.js} +3 -3
  322. package/dist/{chunk-DMZTDCUF.js.map → chunk-JPQI2RIV.js.map} +1 -1
  323. package/dist/{chunk-LXX5KU3O.mjs → chunk-LMDAF6LA.mjs} +2 -2
  324. package/dist/{chunk-FL4W4S6J.mjs → chunk-MOSP7FR5.mjs} +1 -1
  325. package/dist/chunk-MOSP7FR5.mjs.map +1 -0
  326. package/dist/{chunk-HZXXADG4.js → chunk-NLPBW3SW.js} +44 -43
  327. package/dist/chunk-NLPBW3SW.js.map +1 -0
  328. package/dist/{chunk-TAABXGZL.mjs → chunk-O3JP6ZMQ.mjs} +2 -2
  329. package/dist/{chunk-MFO4S7T5.js → chunk-PJOBOBNJ.js} +3 -3
  330. package/dist/{chunk-MFO4S7T5.js.map → chunk-PJOBOBNJ.js.map} +1 -1
  331. package/dist/{chunk-CWGYVJTQ.mjs → chunk-PORNR2NU.mjs} +3 -3
  332. package/dist/chunk-QF3UKRIJ.js +33 -0
  333. package/dist/chunk-QF3UKRIJ.js.map +1 -0
  334. package/dist/chunk-RAHXO5YU.mjs +33 -0
  335. package/dist/chunk-RAHXO5YU.mjs.map +1 -0
  336. package/dist/{chunk-BTZANNVO.js → chunk-RQ65U5G2.js} +3 -3
  337. package/dist/{chunk-BTZANNVO.js.map → chunk-RQ65U5G2.js.map} +1 -1
  338. package/dist/{chunk-Q56I63FO.mjs → chunk-RVGLLMWG.mjs} +2 -2
  339. package/dist/{chunk-VVRRAF6H.js → chunk-S2S7TK3L.js} +49 -36
  340. package/dist/chunk-S2S7TK3L.js.map +1 -0
  341. package/dist/{chunk-INIH23HU.js → chunk-VF6QXUX3.js} +2 -2
  342. package/dist/{chunk-INIH23HU.js.map → chunk-VF6QXUX3.js.map} +1 -1
  343. package/dist/{chunk-QWC5GC2Q.mjs → chunk-WY7V5UJN.mjs} +2 -2
  344. package/dist/{chunk-OCKO7T7L.js → chunk-XQAYZBLL.js} +3 -3
  345. package/dist/{chunk-OCKO7T7L.js.map → chunk-XQAYZBLL.js.map} +1 -1
  346. package/dist/{chunk-ATGLKKXI.js → chunk-Y7ZBWTD7.js} +17 -17
  347. package/dist/{chunk-ATGLKKXI.js.map → chunk-Y7ZBWTD7.js.map} +1 -1
  348. package/dist/{chunk-7XWWI5EY.js → chunk-YFIB3YNQ.js} +11 -11
  349. package/dist/{chunk-7XWWI5EY.js.map → chunk-YFIB3YNQ.js.map} +1 -1
  350. package/dist/{chunk-UCWTF336.mjs → chunk-YWGJAB63.mjs} +2 -2
  351. package/dist/{chunk-4MPXVPBQ.mjs → chunk-YYHS2TM6.mjs} +43 -30
  352. package/dist/chunk-YYHS2TM6.mjs.map +1 -0
  353. package/dist/components/Quiz/Quiz.utils.d.ts +8 -0
  354. package/dist/components/Quiz/Quiz.utils.d.ts.map +1 -1
  355. package/dist/hooks/useAppContent/index.js +19 -19
  356. package/dist/hooks/useAppContent/index.mjs +18 -18
  357. package/dist/hooks/useComparator/index.js +1 -1
  358. package/dist/hooks/useComparator/index.mjs +1 -1
  359. package/dist/hooks/useDraftAutoSave/index.js +3 -3
  360. package/dist/hooks/useDraftAutoSave/index.mjs +2 -2
  361. package/dist/index.js +19 -19
  362. package/dist/index.mjs +18 -18
  363. package/dist/types/enemClassroom/index.d.ts +29 -2
  364. package/dist/types/enemClassroom/index.d.ts.map +1 -1
  365. package/dist/types/enemClassroom/index.js +4 -2
  366. package/dist/types/enemClassroom/index.js.map +1 -1
  367. package/dist/types/enemClassroom/index.mjs +3 -1
  368. package/dist/types/enemClassroom.d.ts +29 -2
  369. package/dist/types/enemClassroom.d.ts.map +1 -1
  370. package/dist/types/questionTypes/index.js +1 -1
  371. package/dist/types/questionTypes/index.mjs +1 -1
  372. package/dist/utils/index.js +1 -1
  373. package/dist/utils/index.mjs +1 -1
  374. package/dist/utils/renderSubjectCell/index.js +1 -1
  375. package/dist/utils/renderSubjectCell/index.mjs +1 -1
  376. package/dist/utils/renderTextCell/index.js +1 -1
  377. package/dist/utils/renderTextCell/index.mjs +1 -1
  378. package/package.json +1 -1
  379. package/dist/chunk-4MPXVPBQ.mjs.map +0 -1
  380. package/dist/chunk-DDZDNGBU.mjs.map +0 -1
  381. package/dist/chunk-ED23HOE6.mjs.map +0 -1
  382. package/dist/chunk-FL4W4S6J.mjs.map +0 -1
  383. package/dist/chunk-GYQUB3VW.js.map +0 -1
  384. package/dist/chunk-HZXXADG4.js.map +0 -1
  385. package/dist/chunk-JBAGQ7L5.js.map +0 -1
  386. package/dist/chunk-ND5M3DZA.mjs +0 -21
  387. package/dist/chunk-ND5M3DZA.mjs.map +0 -1
  388. package/dist/chunk-NQNEG4KR.mjs.map +0 -1
  389. package/dist/chunk-NYKBCQUO.js +0 -21
  390. package/dist/chunk-NYKBCQUO.js.map +0 -1
  391. package/dist/chunk-VVRRAF6H.js.map +0 -1
  392. package/dist/chunk-XX4WE4TL.js.map +0 -1
  393. /package/dist/{RichEditorCore-QZYPHNRY.mjs.map → RichEditorCore-TLAFZ5XG.mjs.map} +0 -0
  394. /package/dist/{chunk-VZJKHIHN.mjs.map → chunk-7KALNPIG.mjs.map} +0 -0
  395. /package/dist/{chunk-CFTQ24UT.mjs.map → chunk-CMYBNZ74.mjs.map} +0 -0
  396. /package/dist/{chunk-R7NS5KFE.mjs.map → chunk-CWUNF7U6.mjs.map} +0 -0
  397. /package/dist/{chunk-NAOHJW6H.mjs.map → chunk-DLHV7CZN.mjs.map} +0 -0
  398. /package/dist/{chunk-7EXSCXPK.mjs.map → chunk-DMYETMZG.mjs.map} +0 -0
  399. /package/dist/{chunk-OZWPOXVU.mjs.map → chunk-GVGDUCVF.mjs.map} +0 -0
  400. /package/dist/{chunk-LXX5KU3O.mjs.map → chunk-LMDAF6LA.mjs.map} +0 -0
  401. /package/dist/{chunk-TAABXGZL.mjs.map → chunk-O3JP6ZMQ.mjs.map} +0 -0
  402. /package/dist/{chunk-CWGYVJTQ.mjs.map → chunk-PORNR2NU.mjs.map} +0 -0
  403. /package/dist/{chunk-Q56I63FO.mjs.map → chunk-RVGLLMWG.mjs.map} +0 -0
  404. /package/dist/{chunk-QWC5GC2Q.mjs.map → chunk-WY7V5UJN.mjs.map} +0 -0
  405. /package/dist/{chunk-UCWTF336.mjs.map → chunk-YWGJAB63.mjs.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-NYKBCQUO.js","../src/types/enemClassroom.ts"],"names":[],"mappings":"AAAA;ACWO,IAAM,wBAAA,EAA0B;AAAA,EACrC,MAAA,EAAQ,QAAA;AAAA,EACR,QAAA,EAAU;AACZ,CAAA;AAMO,IAAM,+BAAA,EAGT;AAAA,EACF,MAAA,EAAQ,WAAA;AAAA,EACR,QAAA,EAAU;AACZ,CAAA;AAGO,IAAM,oCAAA,EAAsC;AAAA,EACjD,WAAA,EAAa,aAAA;AAAA,EACb,WAAA,EAAa,aAAA;AAAA,EACb,QAAA,EAAU;AACZ,CAAA;ADnBA;AACA;AACE;AACA;AACA;AACF,sNAAC","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-NYKBCQUO.js","sourcesContent":[null,"/**\n * In-classroom ENEM simulation (\"Simulação do ENEM em sala de aula\").\n *\n * Shapes of the student-facing API (`/enem-classroom/*`), shared by the\n * student web app and the backoffice so both read the same vocabulary.\n */\n\n/**\n * Foreign language the student sits the exam in. Picks which of the two\n * language blocks of the exam the student receives.\n */\nexport const ENEM_CLASSROOM_LANGUAGE = {\n INGLES: 'INGLES',\n ESPANHOL: 'ESPANHOL',\n} as const;\n\nexport type EnemClassroomLanguage =\n (typeof ENEM_CLASSROOM_LANGUAGE)[keyof typeof ENEM_CLASSROOM_LANGUAGE];\n\n/** Human labels for each language, in the order the student sees them. */\nexport const ENEM_CLASSROOM_LANGUAGE_LABELS: Record<\n EnemClassroomLanguage,\n string\n> = {\n INGLES: 'Inglês',\n ESPANHOL: 'Espanhol',\n};\n\n/** Where the student stands in the exam. FINISHED is final. */\nexport const ENEM_CLASSROOM_PARTICIPATION_STATUS = {\n NOT_STARTED: 'NOT_STARTED',\n IN_PROGRESS: 'IN_PROGRESS',\n FINISHED: 'FINISHED',\n} as const;\n\nexport type EnemClassroomParticipationStatus =\n (typeof ENEM_CLASSROOM_PARTICIPATION_STATUS)[keyof typeof ENEM_CLASSROOM_PARTICIPATION_STATUS];\n\n/**\n * One socio-economic question asked before the exam starts. Free text with a\n * \"skip\" option — every field is written by the backoffice.\n */\nexport interface EnemClassroomSurveyQuestion {\n id: string;\n position: number;\n /** Short name of the step in the stepper (\"Curso\"). */\n stepLabel: string;\n /** The question itself (\"Você já tem o curso que quer fazer em mente?\"). */\n prompt: string;\n /** Label of the option that opens the text field (\"Se sim, escreva o seu curso\"). */\n inputLabel: string;\n /** Placeholder of the text field (\"Escreva o curso\"). */\n inputPlaceholder: string;\n /** Label of the option that skips the question (\"Não, ainda estou pensando\"). */\n skipLabel: string;\n}\n\n/** The exam as the student sees it before starting. */\nexport interface EnemClassroomExam {\n id: string;\n title: string;\n /** Introduction video shown on the first step; null when there is none. */\n videoUrl: string | null;\n /** How long the student has once they start. */\n durationMinutes: number;\n /**\n * Whether the student picks English or Spanish before starting (ENEM's\n * day 1). Off, the exam has no foreign-language block and the choice step\n * is not shown (day 2).\n */\n languageChoice: boolean;\n /** What the panel card says while the exam waits to be started; written by the backoffice. */\n bannerText: string;\n surveyQuestions: EnemClassroomSurveyQuestion[];\n}\n\n/** A survey answer; `null` means the student skipped the question. */\nexport interface EnemClassroomSurveyAnswer {\n questionId: string;\n answer: string | null;\n}\n\n/** The student's own record of the exam. */\nexport interface EnemClassroomParticipation {\n status: EnemClassroomParticipationStatus;\n language: EnemClassroomLanguage | null;\n /** ISO 8601 */\n startedAt: string | null;\n /** ISO 8601. `startedAt + durationMinutes`; the exam is submitted at this point. */\n deadlineAt: string | null;\n /** The shared activity behind the exam — what drafts and answers address. */\n activityId: string;\n surveyAnswers: EnemClassroomSurveyAnswer[];\n}\n\n/** `GET /enem-classroom/current` */\nexport interface EnemClassroomCurrentResponse {\n message: string;\n data: {\n /** Null when the institution has no active exam. */\n exam: EnemClassroomExam | null;\n /** Null until the student starts. */\n participation: EnemClassroomParticipation | null;\n };\n}\n\n/** `POST /enem-classroom/exams/:id/start` body */\nexport interface EnemClassroomStartPayload {\n /** Null when the exam offers no language choice. */\n language: EnemClassroomLanguage | null;\n surveyAnswers: EnemClassroomSurveyAnswer[];\n}\n\n/** `POST /enem-classroom/exams/:id/start` response */\nexport interface EnemClassroomStartResponse {\n message: string;\n data: {\n activityId: string;\n startedAt: string;\n deadlineAt: string;\n };\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-VVRRAF6H.js","../src/components/EnemClassroomStartModal/EnemClassroomStartModal.tsx"],"names":[],"mappings":"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","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-VVRRAF6H.js","sourcesContent":[null,"import { useCallback, useEffect, useMemo, useState, ChangeEvent } from 'react';\nimport Modal from '../Modal/Modal';\nimport Stepper from '../Stepper/Stepper';\nimport Button from '../Button/Button';\nimport Input from '../Input/Input';\nimport CheckBox from '../CheckBox/CheckBox';\nimport Text from '../Text/Text';\nimport VideoPlayer from '../VideoPlayer/VideoPlayer';\nimport { CaretLeftIcon } from '@phosphor-icons/react/dist/csr/CaretLeft';\nimport { CaretRightIcon } from '@phosphor-icons/react/dist/csr/CaretRight';\nimport { CheckIcon } from '@phosphor-icons/react/dist/csr/Check';\nimport { cn } from '../../utils/utils';\nimport warningClassroomIcon from '../../assets/img/enemClassroom/warning-classroom.png';\nimport warningTimerIcon from '../../assets/img/enemClassroom/warning-timer.png';\nimport warningIrreversibleIcon from '../../assets/img/enemClassroom/warning-irreversible.png';\nimport flagEnglish from '../../assets/img/enemClassroom/flag-english.png';\nimport flagSpanish from '../../assets/img/enemClassroom/flag-spanish.png';\nimport surveyCourseIllustration from '../../assets/img/enemClassroom/survey-course.svg';\nimport surveyUniversityIllustration from '../../assets/img/enemClassroom/survey-university.png';\nimport {\n ENEM_CLASSROOM_LANGUAGE,\n ENEM_CLASSROOM_LANGUAGE_LABELS,\n type EnemClassroomExam,\n type EnemClassroomLanguage,\n type EnemClassroomStartPayload,\n type EnemClassroomSurveyQuestion,\n} from '../../types/enemClassroom';\n\n/** Title shared by every step, as in the design. */\nexport const ENEM_CLASSROOM_MODAL_TITLE = 'Simulação do ENEM em sala de aula!';\n\n/**\n * The three warnings of the introduction step. The exam only counts when\n * taken in class, so they are shown before anything else.\n */\nconst INTRO_WARNINGS = [\n {\n icon: warningClassroomIcon,\n title: 'Só vale em sala de aula',\n description:\n 'Essa simulação precisa ser feita com seu professor presente. Não vale fazer em casa!',\n },\n {\n icon: warningTimerIcon,\n title: 'O cronômetro liga na hora',\n description:\n 'Assim que clicar em começar, o tempo já corre e não para, mesmo se fechar o navegador.',\n },\n {\n icon: warningIrreversibleIcon,\n title: 'Não tem como desfazer',\n description:\n 'Iniciar fora do horário estabelecido pelo seu professor em sala de aula pode atrapalhar seu resultado!',\n },\n] as const;\n\n/** Flag shown next to each language, as in the design. */\nconst LANGUAGE_FLAGS: Record<EnemClassroomLanguage, string> = {\n [ENEM_CLASSROOM_LANGUAGE.INGLES]: flagEnglish,\n [ENEM_CLASSROOM_LANGUAGE.ESPANHOL]: flagSpanish,\n};\n\n/**\n * Illustration of each survey step, in the order the steps are asked: the\n * course question, then the university one.\n *\n * Fixed here rather than sent by the backoffice, so it is keyed by position —\n * reordering the questions there moves the illustration with the position,\n * not with the question. A question past the end simply gets none.\n */\nconst SURVEY_ILLUSTRATIONS = [\n surveyCourseIllustration,\n surveyUniversityIllustration,\n] as const;\n\n/**\n * The white card the warnings and the options sit on. Same vocabulary as\n * SelectionButton, so the modal reads like the rest of the design system\n * against the modal's `secondary-50` background.\n */\nconst CARD_CLASSES =\n 'rounded-xl border border-border-50 bg-background shadow-soft-shadow-1';\n\n/**\n * Gradiente da identidade da simulação em sala de aula — os mesmos tons do\n * card do painel do aluno. Não sai dos tokens de tema porque é a marca da\n * prova, não a da instituição.\n */\n/*\n * Gradiente literal, e não `bg-gradient-to-r from-… to-…`: o Tailwind v4\n * interpola `in oklab`, o que muda os tons do meio em relação ao sRGB do CSS\n * que veio do design.\n */\nconst GRADIENT_CTA_CLASSES =\n 'bg-[linear-gradient(270deg,#B21FF6_0%,#F95493_100%)] hover:opacity-90 transition-opacity';\n\n/**\n * One selectable option: a card carrying an optional icon and a label.\n *\n * The radio control itself is visually hidden — in the design the card's own\n * border carries the selection. The native input stays in the tree so the\n * options remain a real radio group: arrow keys move between them and screen\n * readers announce \"1 of 2\", which a set of toggle buttons would not.\n */\nconst OptionCard = ({\n name,\n value,\n label,\n iconSrc,\n checked,\n onSelect,\n testId,\n}: {\n name: string;\n value: string;\n label: string;\n iconSrc?: string;\n checked: boolean;\n onSelect: () => void;\n testId?: string;\n}) => (\n <label\n className={cn(\n CARD_CLASSES,\n 'flex flex-row items-center gap-3 px-4 py-3.5',\n 'cursor-pointer transition-colors hover:bg-background-100',\n 'focus-within:ring-2 focus-within:ring-indicator-info',\n checked && 'border-primary-700 ring-1 ring-primary-700'\n )}\n >\n <input\n type=\"radio\"\n name={name}\n value={value}\n checked={checked}\n onChange={onSelect}\n className=\"sr-only\"\n data-testid={testId}\n />\n {iconSrc && (\n <img src={iconSrc} alt=\"\" aria-hidden className=\"w-6 h-6 flex-shrink-0\" />\n )}\n <Text size=\"sm\" weight=\"semibold\" className=\"text-text-900\">\n {label}\n </Text>\n </label>\n);\n\n/**\n * How a survey question was answered. The student either writes an answer or\n * ticks \"ainda estou pensando\" — the tick clears and disables the field, so\n * the two never disagree.\n */\ninterface SurveyAnswerDraft {\n skipped: boolean;\n text: string;\n}\n\n/**\n * One line of the summary: the step's name over what the student answered.\n */\nconst SummaryRow = ({ label, value }: { label: string; value: string }) => (\n <div className=\"flex flex-col rounded-lg bg-primary-50 px-3 py-2\">\n <Text as=\"dt\" size=\"sm\" weight=\"bold\" className=\"text-primary-800\">\n {label}\n </Text>\n <Text as=\"dd\" size=\"sm\" className=\"text-text-600\">\n {value}\n </Text>\n </div>\n);\n\n/** The introduction is always first; the first choice comes right after it. */\nconst INTRO_STEP = 0;\nconst FIRST_CHOICE_STEP = 1;\n\n/** One screen of the flow. Which ones exist depends on the exam. */\ntype FlowStep =\n | { kind: 'intro' }\n | { kind: 'language' }\n | { kind: 'survey'; question: EnemClassroomSurveyQuestion; index: number }\n | { kind: 'summary' };\n\nexport interface EnemClassroomStartModalProps {\n isOpen: boolean;\n onClose: () => void;\n exam: EnemClassroomExam;\n /** Called with everything the start endpoint needs. */\n onStart: (payload: EnemClassroomStartPayload) => void;\n /** Disables the final button while the start request is in flight. */\n isStarting?: boolean;\n}\n\n/**\n * Whether a survey draft is complete: skipped, or answered with some text.\n */\nconst isSurveyAnswerComplete = (draft: SurveyAnswerDraft | undefined) =>\n draft?.skipped === true || (draft?.text.trim().length ?? 0) > 0;\n\n/**\n * The text shown for a survey answer on the summary screen.\n */\nconst describeSurveyAnswer = (\n question: EnemClassroomSurveyQuestion,\n draft: SurveyAnswerDraft | undefined\n) => (draft && !draft.skipped ? draft.text.trim() : question.skipLabel);\n\n/**\n * Start flow of the in-classroom ENEM simulation.\n *\n * Steps, in order: introduction (video + warnings), foreign language — only\n * when the exam offers the choice —, one step per survey question, and a\n * summary the student confirms before the exam opens. The stepper only lists\n * the steps that carry a choice; the summary is a screen of its own, as in\n * the design.\n *\n * Presentational: it collects the choices and hands them to `onStart`; the\n * caller talks to the API.\n *\n * @example\n * ```tsx\n * <EnemClassroomStartModal\n * isOpen={open}\n * onClose={() => setOpen(false)}\n * exam={exam}\n * onStart={(payload) => start(exam.id, payload)}\n * />\n * ```\n */\nconst EnemClassroomStartModal = ({\n isOpen,\n onClose,\n exam,\n onStart,\n isStarting = false,\n}: EnemClassroomStartModalProps) => {\n const surveyQuestions = useMemo(\n () => [...exam.surveyQuestions].sort((a, b) => a.position - b.position),\n [exam.surveyQuestions]\n );\n // The screens this exam has: no language step on an exam without the\n // choice, so the student goes from the warnings straight to the survey.\n const steps = useMemo<FlowStep[]>(\n () => [\n { kind: 'intro' },\n ...(exam.languageChoice ? [{ kind: 'language' } as const] : []),\n ...surveyQuestions.map((question, index) => ({\n kind: 'survey' as const,\n question,\n index,\n })),\n { kind: 'summary' },\n ],\n [exam.languageChoice, surveyQuestions]\n );\n const summaryStep = steps.length - 1;\n\n const [step, setStep] = useState(INTRO_STEP);\n const [language, setLanguage] = useState<EnemClassroomLanguage | null>(null);\n const [answers, setAnswers] = useState<Record<string, SurveyAnswerDraft>>({});\n\n // Every opening starts from the introduction with nothing filled in — and\n // so does a different exam handed in while the modal is open, whose steps\n // and questions are not the ones the answers were given to.\n useEffect(() => {\n if (isOpen) {\n setStep(INTRO_STEP);\n setLanguage(null);\n setAnswers({});\n }\n }, [isOpen, exam.id]);\n\n const stepperSteps = useMemo(\n () =>\n steps\n .filter((flowStep) => flowStep.kind !== 'summary')\n .map((flowStep) => {\n if (flowStep.kind === 'intro') {\n return {\n id: 'intro',\n label: 'Introdução',\n state: 'pending' as const,\n };\n }\n if (flowStep.kind === 'language') {\n return {\n id: 'language',\n label: 'Língua estrangeira',\n state: 'pending' as const,\n };\n }\n return {\n id: flowStep.question.id,\n label: flowStep.question.stepLabel,\n state: 'pending' as const,\n };\n }),\n [steps]\n );\n\n const currentStep = steps[step] ?? steps[INTRO_STEP];\n const currentQuestion =\n currentStep.kind === 'survey' ? currentStep.question : null;\n\n const canGoNext =\n currentStep.kind === 'language'\n ? language !== null\n : currentQuestion !== null &&\n isSurveyAnswerComplete(answers[currentQuestion.id]);\n\n const updateAnswer = useCallback(\n (questionId: string, patch: Partial<SurveyAnswerDraft>) => {\n setAnswers((prev) => {\n const current = prev[questionId] ?? { skipped: false, text: '' };\n return { ...prev, [questionId]: { ...current, ...patch } };\n });\n },\n []\n );\n\n const handleStart = useCallback(() => {\n // The language is only a choice on an exam that offers one.\n if (exam.languageChoice && !language) return;\n onStart({\n language: exam.languageChoice ? language : null,\n surveyAnswers: surveyQuestions.map((question) => {\n const draft = answers[question.id];\n const text = draft && !draft.skipped ? draft.text.trim() : '';\n return { questionId: question.id, answer: text || null };\n }),\n });\n }, [exam.languageChoice, language, surveyQuestions, answers, onStart]);\n\n const renderIntroStep = () => (\n <div className=\"flex flex-col gap-6\" data-testid=\"enem-classroom-intro\">\n {exam.videoUrl && (\n <VideoPlayer\n src={exam.videoUrl}\n title={exam.title}\n // O desenho mostra só o vídeo: o nome da prova já está no título do\n // modal. O `title` fica para rotular o player nos leitores de tela.\n hideHeader\n className=\"w-full rounded-xl overflow-hidden\"\n autoSave={false}\n />\n )}\n\n <div className=\"flex flex-col gap-4\">\n <Text size=\"lg\" weight=\"bold\" className=\"text-text-950\">\n Ei, lê isso antes de começar!\n </Text>\n {INTRO_WARNINGS.map(({ icon, title, description }) => (\n <div\n key={title}\n className={cn(CARD_CLASSES, 'flex flex-row gap-4 items-start p-4')}\n >\n <img\n src={icon}\n alt=\"\"\n aria-hidden\n className=\"flex-shrink-0 w-10 h-10\"\n />\n <div className=\"flex flex-col gap-1\">\n <Text size=\"md\" weight=\"bold\" className=\"text-text-950\">\n {title}\n </Text>\n <Text size=\"sm\" className=\"text-text-600\">\n {description}\n </Text>\n </div>\n </div>\n ))}\n </div>\n\n <Button\n size=\"large\"\n variant=\"solid\"\n action=\"primary\"\n className={cn('w-full', GRADIENT_CTA_CLASSES)}\n onClick={() => setStep(FIRST_CHOICE_STEP)}\n data-testid=\"enem-classroom-intro-continue\"\n >\n Estou em sala. Quero começar!\n </Button>\n </div>\n );\n\n const renderLanguageStep = () => (\n <div className=\"flex flex-col gap-4\" data-testid=\"enem-classroom-language\">\n <Text\n id=\"enem-classroom-language-prompt\"\n size=\"lg\"\n weight=\"bold\"\n className=\"text-text-950\"\n >\n Qual língua estrangeira você vai usar na simulação?\n </Text>\n <div\n role=\"radiogroup\"\n aria-labelledby=\"enem-classroom-language-prompt\"\n className=\"flex flex-col gap-4\"\n >\n {Object.values(ENEM_CLASSROOM_LANGUAGE).map((value) => (\n <OptionCard\n key={value}\n name=\"enem-classroom-language\"\n value={value}\n label={ENEM_CLASSROOM_LANGUAGE_LABELS[value]}\n iconSrc={LANGUAGE_FLAGS[value]}\n checked={language === value}\n onSelect={() => setLanguage(value)}\n testId={`enem-classroom-language-${value.toLowerCase()}`}\n />\n ))}\n </div>\n </div>\n );\n\n const renderSurveyStep = (\n question: EnemClassroomSurveyQuestion,\n index: number\n ) => {\n const draft = answers[question.id];\n const illustration = SURVEY_ILLUSTRATIONS[index];\n // The two ways of answering disable each other, so they can never\n // contradict — and either one on its own releases the step.\n const hasText = (draft?.text.trim().length ?? 0) > 0;\n const isSkipped = draft?.skipped === true;\n return (\n <div\n className=\"flex flex-col gap-4\"\n data-testid={`enem-classroom-survey-${question.id}`}\n >\n {illustration && (\n <img\n src={illustration}\n alt=\"\"\n aria-hidden\n className=\"w-[220px] max-w-full self-center\"\n data-testid=\"enem-classroom-survey-illustration\"\n />\n )}\n <Text\n id={`enem-classroom-survey-prompt-${question.id}`}\n size=\"lg\"\n weight=\"bold\"\n className=\"text-text-950\"\n >\n {question.prompt}\n </Text>\n <div className=\"flex flex-col gap-2\">\n <Text\n as=\"label\"\n htmlFor={`enem-classroom-survey-input-${question.id}`}\n size=\"sm\"\n className=\"text-text-600\"\n >\n {question.inputLabel}\n </Text>\n <Input\n id={`enem-classroom-survey-input-${question.id}`}\n variant=\"rounded\"\n placeholder={question.inputPlaceholder}\n value={draft?.text ?? ''}\n maxLength={255}\n disabled={isSkipped}\n onChange={(event: ChangeEvent<HTMLInputElement>) =>\n updateAnswer(question.id, { text: event.target.value })\n }\n data-testid=\"enem-classroom-survey-input\"\n />\n </div>\n\n <CheckBox\n label={question.skipLabel}\n checked={isSkipped}\n disabled={hasText}\n onChange={(event: ChangeEvent<HTMLInputElement>) =>\n updateAnswer(question.id, { skipped: event.target.checked })\n }\n data-testid=\"enem-classroom-survey-skip\"\n />\n </div>\n );\n };\n\n const renderSummaryStep = () => (\n <div\n className=\"flex flex-col items-center gap-6 text-center\"\n data-testid=\"enem-classroom-summary\"\n >\n <span className=\"flex items-center justify-center w-14 h-14 rounded-full bg-success-200 text-success-950\">\n <CheckIcon size={24} aria-hidden />\n </span>\n <div className=\"flex flex-col gap-2\">\n <Text size=\"xl\" weight=\"bold\" className=\"text-text-950\">\n Boa sorte!\n </Text>\n <Text size=\"sm\" className=\"text-text-600\">\n Sua simulação do ENEM já está para começar e o cronômetro vai iniciar.\n Respira fundo e dá o seu melhor!\n </Text>\n </div>\n\n <div\n className={cn(CARD_CLASSES, 'flex flex-col gap-3 w-full text-left p-4')}\n >\n <Text size=\"sm\" weight=\"bold\" className=\"text-text-950\">\n Suas respostas\n </Text>\n <dl className=\"flex flex-col gap-2\">\n {exam.languageChoice && (\n <SummaryRow\n label=\"Idioma\"\n value={language ? ENEM_CLASSROOM_LANGUAGE_LABELS[language] : '—'}\n />\n )}\n {surveyQuestions.map((question) => (\n <SummaryRow\n key={question.id}\n label={question.stepLabel}\n value={describeSurveyAnswer(question, answers[question.id])}\n />\n ))}\n </dl>\n <Button\n size=\"medium\"\n variant=\"outline\"\n action=\"primary\"\n className=\"self-center\"\n disabled={isStarting}\n onClick={() => setStep(FIRST_CHOICE_STEP)}\n data-testid=\"enem-classroom-review\"\n >\n Revisar minhas respostas\n </Button>\n </div>\n\n <Button\n size=\"large\"\n variant=\"solid\"\n action=\"primary\"\n className={cn('w-full', GRADIENT_CTA_CLASSES)}\n disabled={isStarting}\n onClick={handleStart}\n data-testid=\"enem-classroom-start\"\n >\n Iniciar a prova!\n </Button>\n </div>\n );\n\n const renderStepContent = () => {\n if (currentStep.kind === 'intro') return renderIntroStep();\n if (currentStep.kind === 'language') return renderLanguageStep();\n if (currentStep.kind === 'survey')\n return renderSurveyStep(currentStep.question, currentStep.index);\n return renderSummaryStep();\n };\n\n const showNavigation = step >= FIRST_CHOICE_STEP && step < summaryStep;\n const showStepper = step < summaryStep;\n\n const footer = showNavigation ? (\n <div className=\"flex flex-row justify-end gap-2 w-full\">\n <Button\n size=\"medium\"\n variant=\"outline\"\n action=\"primary\"\n iconLeft={<CaretLeftIcon size={16} aria-hidden />}\n onClick={() => setStep((current) => current - 1)}\n data-testid=\"enem-classroom-previous\"\n >\n Anterior\n </Button>\n <Button\n size=\"medium\"\n variant=\"solid\"\n action=\"primary\"\n iconRight={<CaretRightIcon size={16} aria-hidden />}\n disabled={!canGoNext}\n onClick={() => setStep((current) => current + 1)}\n data-testid=\"enem-classroom-next\"\n >\n Próximo\n </Button>\n </div>\n ) : undefined;\n\n return (\n <Modal\n isOpen={isOpen}\n onClose={onClose}\n /*\n * A tela de resumo abre com o header vazio, só o X — quem dá o título\n * ali é o \"Boa sorte!\". O texto continua no <h2>, apenas oculto: o\n * `aria-labelledby` do Modal aponta pra ele, e um h2 vazio deixaria o\n * dialog sem nome acessível.\n */\n title={\n showStepper ? (\n ENEM_CLASSROOM_MODAL_TITLE\n ) : (\n <span className=\"sr-only\">{ENEM_CLASSROOM_MODAL_TITLE}</span>\n )\n }\n size=\"lg\"\n footer={footer}\n contentClassName=\"flex flex-col gap-6\"\n >\n {showStepper && (\n <Stepper steps={stepperSteps} currentStep={step} size=\"small\" />\n )}\n {renderStepContent()}\n </Modal>\n );\n};\n\nexport default EnemClassroomStartModal;\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-XX4WE4TL.js","../src/components/Quiz/useQuizStore.ts"],"names":["QUESTION_DIFFICULTY","QUIZ_TYPE","QUESTION_TYPE","QUESTION_STATUS","ANSWER_STATUS","CORRECTION_SOURCE","AI_CORRECTION_STATUS","SUBTYPE_ENUM","answer"],"mappings":"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","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-XX4WE4TL.js","sourcesContent":[null,"import { create } from 'zustand';\nimport { devtools } from 'zustand/middleware';\nimport { QuizVariant } from './Quiz.types';\n\nexport enum QUESTION_DIFFICULTY {\n FACIL = 'FACIL',\n MEDIO = 'MEDIO',\n DIFICIL = 'DIFICIL',\n}\n\n// Enum para tipos de quiz\nexport enum QUIZ_TYPE {\n SIMULADO = 'SIMULADO',\n QUESTIONARIO = 'QUESTIONARIO',\n ATIVIDADE = 'ATIVIDADE',\n AULA_RECOMENDADA = 'AULA_RECOMENDADA',\n}\n\nexport enum QUESTION_TYPE {\n ALTERNATIVA = 'ALTERNATIVA',\n DISSERTATIVA = 'DISSERTATIVA',\n MULTIPLA_ESCOLHA = 'MULTIPLA_ESCOLHA',\n VERDADEIRO_FALSO = 'VERDADEIRO_FALSO',\n RELACIONAR = 'RELACIONAR',\n PREENCHER_LACUNAS = 'PREENCHER_LACUNAS',\n IMAGEM = 'IMAGEM',\n}\n\n/**\n * Determines if a user answer has meaningful content.\n * For option-based questions: checks if optionId is not null\n * For multiple choice questions: checks if selectedOptionIds has items\n * For free-text questions (DISSERTATIVA): checks if answer is non-empty string\n * For structured questions (RELACIONAR, PREENCHER_LACUNAS): checks if answer is valid JSON with values\n *\n * @param answer - The user answer item to check (can be null/undefined)\n * @returns true if the answer has meaningful content, false otherwise\n */\nexport const hasMeaningfulAnswer = (\n answer:\n | {\n optionId: string | null;\n answer: string | null;\n questionType: QUESTION_TYPE;\n selectedOptionIds?: string[] | null;\n }\n | null\n | undefined\n): boolean => {\n if (!answer) return false;\n\n // For MULTIPLA_ESCOLHA, check selectedOptionIds array or legacy optionId\n if (answer.questionType === QUESTION_TYPE.MULTIPLA_ESCOLHA) {\n return (\n (Array.isArray(answer.selectedOptionIds) &&\n answer.selectedOptionIds.length > 0) ||\n Boolean(answer.optionId)\n );\n }\n\n // For free-text question types, check the answer field\n const freeTextTypes = [\n QUESTION_TYPE.DISSERTATIVA,\n QUESTION_TYPE.RELACIONAR,\n QUESTION_TYPE.PREENCHER_LACUNAS,\n QUESTION_TYPE.IMAGEM,\n QUESTION_TYPE.VERDADEIRO_FALSO,\n ];\n\n if (freeTextTypes.includes(answer.questionType)) {\n // Check if answer has content (non-empty string)\n if (!answer.answer || answer.answer.trim() === '') return false;\n\n // For RELACIONAR/PREENCHER_LACUNAS/VERDADEIRO_FALSO, also check if JSON has actual values\n if (\n answer.questionType === QUESTION_TYPE.RELACIONAR ||\n answer.questionType === QUESTION_TYPE.PREENCHER_LACUNAS ||\n answer.questionType === QUESTION_TYPE.VERDADEIRO_FALSO\n ) {\n try {\n const parsed = JSON.parse(answer.answer);\n return typeof parsed === 'object' && Object.keys(parsed).length > 0;\n } catch {\n return false;\n }\n }\n\n // For DISSERTATIVA, non-empty string is meaningful\n return true;\n }\n\n // For option-based question types, check optionId (not null and not empty string)\n return answer.optionId !== null && answer.optionId !== '';\n};\n\nexport enum QUESTION_STATUS {\n PENDENTE_AVALIACAO = 'PENDENTE_AVALIACAO',\n RESPOSTA_CORRETA = 'RESPOSTA_CORRETA',\n RESPOSTA_INCORRETA = 'RESPOSTA_INCORRETA',\n NAO_RESPONDIDO = 'NAO_RESPONDIDO',\n}\n\nexport enum ANSWER_STATUS {\n RESPOSTA_CORRETA = 'RESPOSTA_CORRETA',\n RESPOSTA_INCORRETA = 'RESPOSTA_INCORRETA',\n PENDENTE_AVALIACAO = 'PENDENTE_AVALIACAO',\n NAO_RESPONDIDO = 'NAO_RESPONDIDO',\n}\n\n/**\n * Who produced the correction stored on a dissertative answer.\n *\n * Drives the tag shown next to the feedback. `IA_PROFESSOR` is not a third kind\n * of correction — it is an AI correction a teacher has since reviewed.\n */\nexport enum CORRECTION_SOURCE {\n /** Corrected by the AI, not yet reviewed by a teacher. */\n IA = 'IA',\n /** Corrected by the AI and afterwards reviewed by a teacher. */\n IA_PROFESSOR = 'IA_PROFESSOR',\n /** Corrected by a teacher, with no AI involvement. */\n PROFESSOR = 'PROFESSOR',\n}\n\n/**\n * Lifecycle of the asynchronous AI correction of a dissertative answer.\n *\n * `null` on an answer means the AI was never in play for it — the institution\n * has the feature off — which reads differently from `FAILED`: the first waits\n * on a teacher, the second fell back to waiting on one.\n */\nexport enum AI_CORRECTION_STATUS {\n /** Submitted; the AI correction is still running. */\n PENDING = 'PENDING',\n /** The AI returned a verdict. */\n DONE = 'DONE',\n /** The AI call failed; the answer awaits manual correction. */\n FAILED = 'FAILED',\n}\n\nexport enum SUBTYPE_ENUM {\n PROVA = 'PROVA',\n ENEM_PROVA_1 = 'ENEM_PROVA_1',\n ENEM_PROVA_2 = 'ENEM_PROVA_2',\n VESTIBULAR = 'VESTIBULAR',\n SIMULADO = 'SIMULADO',\n SIMULADAO = 'SIMULADAO',\n}\n\nexport interface QuestionResult {\n answers: {\n id: string;\n questionId: string;\n answer: string | null;\n selectedOptions: {\n optionId: string;\n option?: string;\n isCorrect?: boolean;\n correctValue?: string | null;\n }[];\n answerStatus: ANSWER_STATUS;\n statement: string;\n additionalContent: string | null;\n questionType: QUESTION_TYPE;\n difficultyLevel: QUESTION_DIFFICULTY;\n solutionExplanation: string | null;\n correctOption: string;\n createdAt: string;\n updatedAt: string;\n options?: {\n id: string;\n option: string;\n isCorrect: boolean;\n correctValue?: string | null;\n }[];\n matchingAnswers?: {\n optionId: string;\n selectedValue: string;\n }[];\n fillAnswers?: Record<string, string>;\n knowledgeMatrix: {\n areaKnowledge: {\n id: string;\n name: string;\n } | null;\n subject: {\n id: string;\n name: string;\n color: string;\n icon: string;\n } | null;\n topic: {\n id: string;\n name: string;\n } | null;\n subtopic: {\n id: string;\n name: string;\n } | null;\n content: {\n id: string;\n name: string;\n } | null;\n }[];\n teacherFeedback: string | null;\n /**\n * DISSERTATIVA only: what the AI wrote, kept apart from `teacherFeedback`\n * so a teacher's review never destroys the original verdict. The feedback\n * to render is `teacherFeedback ?? aiFeedback`; `correctionSource` says\n * which of the two produced it.\n */\n aiFeedback?: string | null;\n /** DISSERTATIVA only: the AI's original verdict, before any teacher review. */\n aiIsCorrect?: boolean | null;\n /** DISSERTATIVA only: whether the AI correction is running, done or failed. */\n aiCorrectionStatus?: AI_CORRECTION_STATUS | null;\n /** DISSERTATIVA only: drives the correction tag. */\n correctionSource?: CORRECTION_SOURCE | null;\n /** IMAGEM only: where the student clicked, in image percentage points. */\n imageAnswer?: { coordinateX: number; coordinateY: number } | null;\n /**\n * IMAGEM only: radius within which a click counts as correct, in the same\n * percentage space. Sent by the backend so the drawn target circle matches\n * the grade instead of each client inventing its own.\n */\n imageTolerance?: number | null;\n attachment: string | null;\n score: number | null;\n gradedAt: string | null;\n gradedBy: string | null;\n }[];\n statistics: {\n totalAnswered: number;\n correctAnswers: number;\n incorrectAnswers: number;\n pendingAnswers: number;\n score: number;\n timeSpent: number;\n };\n}\n\nexport interface Question {\n id: string;\n statement: string;\n questionType: QUESTION_TYPE;\n difficultyLevel: QUESTION_DIFFICULTY;\n description: string;\n examBoard: string | null;\n examYear: string | null;\n solutionExplanation: string | null;\n additionalContent: string | null;\n answer: null;\n answerStatus: ANSWER_STATUS;\n options: {\n id: string;\n option: string;\n correctValue?: string | null;\n }[];\n knowledgeMatrix: {\n areaKnowledge: {\n id: string;\n name: string;\n };\n subject: {\n id: string;\n name: string;\n color: string;\n icon: string;\n };\n topic: {\n id: string;\n name: string;\n };\n subtopic: {\n id: string;\n name: string;\n };\n content: {\n id: string;\n name: string;\n };\n }[];\n correctOptionIds?: string[];\n}\n\nexport interface QuizInterface {\n id: string;\n title: string;\n type: QUIZ_TYPE;\n subtype: SUBTYPE_ENUM | string;\n difficulty: string | null;\n notification: string | null;\n status: string;\n startDate: string | null;\n finalDate: string | null;\n canRetry: boolean;\n createdAt: string | null;\n updatedAt: string | null;\n questions: Question[];\n}\n\nexport interface UserAnswerItem {\n questionId: string;\n activityId: string;\n userId: string;\n answer: string | null;\n optionId: string | null;\n selectedOptionIds?: string[] | null;\n questionType: QUESTION_TYPE;\n answerStatus: ANSWER_STATUS;\n}\n\n/**\n * Draft answer item from the backend API\n * Used when loading saved drafts\n */\nexport interface DraftAnswerItem {\n questionId: string;\n answer: string | null;\n optionId: string | null;\n selectedOptionIds?: string[] | null;\n fillAnswers?: Record<string, string> | null;\n matchingAnswers?: Array<{ optionId: string; selectedValue: string }> | null;\n imageAnswer?: { coordinateX: number; coordinateY: number } | null;\n sequence?: number;\n timeSpent?: number;\n}\n\n/**\n * Payload for saving drafts to the backend\n */\nexport interface SaveDraftPayload {\n answers: Array<{\n questionId: string;\n answer?: string | null;\n optionId?: string | null;\n selectedOptionIds?: string[] | null;\n fillAnswers?: Record<string, string> | null;\n matchingAnswers?: Array<{ optionId: string; selectedValue: string }> | null;\n imageAnswer?: { coordinateX: number; coordinateY: number } | null;\n }>;\n}\n\n/**\n * API client interface for draft operations\n * Pass this to the store to enable auto-save functionality\n */\nexport interface DraftApiClient {\n /**\n * Persists the draft.\n *\n * `activityGone` reports that the activity no longer exists — the backend\n * answers 404 for it. The store uses that to stop autosaving instead of\n * retrying a request that can never succeed.\n */\n saveDraft: (\n activityId: string,\n payload: SaveDraftPayload\n ) => Promise<{ success: boolean; activityGone?: boolean }>;\n loadDraft: (activityId: string) => Promise<{\n hasDraft: boolean;\n answers: DraftAnswerItem[];\n } | null>;\n}\n\nexport interface QuizState {\n // Data\n quiz: QuizInterface | null;\n\n // UI State\n currentQuestionIndex: number;\n selectedAnswers: Record<string, string>;\n userAnswers: UserAnswerItem[];\n timeElapsed: number;\n isStarted: boolean;\n isFinished: boolean;\n userId: string;\n variant: QuizVariant;\n minuteCallback: (() => void) | null;\n dissertativeCharLimit?: number;\n timeLimit: number | null;\n onTimeUp: (() => void) | null;\n timeWarningThreshold: number | null;\n onTimeWarning: (() => void) | null;\n hasTimeWarningFired: boolean;\n // Actions\n setQuiz: (quiz: QuizInterface) => void;\n setQuestionResult: (questionResult: QuestionResult) => void;\n setUserId: (userId: string) => void;\n setUserAnswers: (userAnswers: UserAnswerItem[]) => void;\n setVariant: (variant: QuizVariant) => void;\n setDissertativeCharLimit: (limit?: number) => void;\n getDissertativeCharLimit: () => number | undefined;\n // Quiz Navigation\n goToNextQuestion: () => void;\n goToPreviousQuestion: () => void;\n goToQuestion: (index: number) => void;\n\n // Quiz Actions\n selectAnswer: (questionId: string, answerId: string) => void;\n selectMultipleAnswer: (questionId: string, answerIds: string[]) => void;\n selectDissertativeAnswer: (questionId: string, answer: string) => void;\n skipQuestion: () => void;\n skipCurrentQuestionIfUnanswered: () => void;\n addUserAnswer: (questionId: string, answerId?: string) => void;\n startQuiz: (options?: { initialElapsedSeconds?: number }) => void;\n finishQuiz: () => void;\n resetQuiz: () => void;\n\n // Timer\n updateTime: (time: number) => void;\n startTimer: () => void;\n stopTimer: () => void;\n setTimeLimit: (seconds: number | null) => void;\n setOnTimeUp: (callback: (() => void) | null) => void;\n getRemainingTime: () => number | null;\n setTimeWarning: (\n seconds: number | null,\n callback?: (() => void) | null\n ) => void;\n isTimeExceeded: () => boolean;\n\n // Minute Callback\n setMinuteCallback: (callback: (() => void) | null) => void;\n startMinuteCallback: () => void;\n stopMinuteCallback: () => void;\n\n // Getters\n getCurrentQuestion: () => Question | null;\n getTotalQuestions: () => number;\n getAnsweredQuestions: () => number;\n getUnansweredQuestions: () => number[];\n getSkippedQuestions: () => number;\n getProgress: () => number;\n isQuestionAnswered: (questionId: string) => boolean;\n isQuestionSkipped: (questionId: string) => boolean;\n getCurrentAnswer: () => UserAnswerItem | undefined;\n getAllCurrentAnswer: () => UserAnswerItem[] | undefined;\n getQuizTitle: () => string;\n formatTime: (seconds: number) => string;\n getUserAnswers: () => UserAnswerItem[];\n getUnansweredQuestionsFromUserAnswers: () => number[];\n getQuestionsGroupedBySubject: () => {\n [key: string]: (Question | QuestionResult['answers'][number])[];\n };\n getUserId: () => string;\n setCurrentQuestion: (question: Question) => void;\n\n // New methods for userAnswers\n getQuestionIndex: (questionId: string) => number;\n getUserAnswerByQuestionId: (questionId: string) => UserAnswerItem | null;\n isQuestionAnsweredByUserAnswers: (questionId: string) => boolean;\n getQuestionStatusFromUserAnswers: (\n questionId: string\n ) => 'answered' | 'unanswered' | 'skipped';\n getUserAnswersForActivity: () => UserAnswerItem[];\n // Answer status management\n setAnswerStatus: (questionId: string, status: ANSWER_STATUS) => void;\n getAnswerStatus: (questionId: string) => ANSWER_STATUS | null;\n\n // Question Result\n questionsResult: QuestionResult | null;\n currentQuestionResult: QuestionResult['answers'] | null;\n setQuestionsResult: (questionsResult: QuestionResult) => void;\n setCurrentQuestionResult: (\n currentQuestionResult: QuestionResult['answers']\n ) => void;\n getQuestionResultByQuestionId: (\n questionId: string\n ) => QuestionResult['answers'][number] | null;\n getQuestionResultStatistics: () => QuestionResult['statistics'] | null;\n getQuestionResult: () => QuestionResult | null;\n getCurrentQuestionResult: () => QuestionResult['answers'] | null;\n\n // Draft management\n applyDraftAnswers: (draftAnswers: DraftAnswerItem[]) => void;\n prepareDraftPayload: () => SaveDraftPayload;\n hasDraftChanges: () => boolean;\n\n // Draft API client (for auto-save functionality)\n draftApiClient: DraftApiClient | null;\n setDraftApiClient: (client: DraftApiClient | null) => void;\n saveDraft: () => Promise<void>;\n loadAndApplyDraft: () => Promise<void>;\n\n // Internal refs for draft management (not exposed, but tracked in state for reactivity)\n lastSavedDraftPayload: string;\n isSavingDraft: boolean;\n /**\n * Set once the backend reports the activity no longer exists. Autosave stops\n * for the rest of the session: `lastSavedDraftPayload` only advances on\n * success, so without this every question navigation and every\n * `visibilitychange` resends the same doomed payload — one student produced\n * 160 such requests in a day.\n */\n isDraftUnavailable: boolean;\n\n // Activity-level teacher feedback (general observation)\n activityFeedback: {\n teacherFeedback: string | null;\n attachment: string | null;\n } | null;\n setActivityFeedback: (\n feedback: {\n teacherFeedback: string | null;\n attachment: string | null;\n } | null\n ) => void;\n getActivityFeedback: () => {\n teacherFeedback: string | null;\n attachment: string | null;\n } | null;\n}\n\n// Constants\nexport const MINUTE_INTERVAL_MS = 60000; // 60 seconds = 1 minute\n\nexport const useQuizStore = create<QuizState>()(\n devtools(\n (set, get) => {\n let timerInterval: ReturnType<typeof setInterval> | null = null;\n let minuteCallbackInterval: ReturnType<typeof setInterval> | null = null;\n let timerStartedAt: number | null = null;\n let timerBaseElapsed = 0;\n\n const clampElapsed = (elapsed: number) => {\n const { timeLimit } = get();\n return timeLimit === null ? elapsed : Math.min(elapsed, timeLimit);\n };\n\n const handleVisibilityChange = () => {\n if (document.visibilityState === 'visible' && timerStartedAt !== null) {\n const now = Date.now();\n const elapsed = clampElapsed(\n timerBaseElapsed + Math.floor((now - timerStartedAt) / 1000)\n );\n set({ timeElapsed: elapsed });\n checkTimeThresholds(elapsed);\n }\n };\n\n /**\n * Soft threshold: notifies once and lets the clock keep running.\n *\n * Deliberately separate from `timeLimit` below, which is a hard stop that\n * submits the quiz. A progressive exam timer needs the opposite — the\n * student is told they went over the expected duration and carries on.\n */\n const checkTimeWarning = (elapsed: number) => {\n const { timeWarningThreshold, hasTimeWarningFired, onTimeWarning } =\n get();\n\n if (\n timeWarningThreshold !== null &&\n elapsed >= timeWarningThreshold &&\n !hasTimeWarningFired\n ) {\n set({ hasTimeWarningFired: true });\n onTimeWarning?.();\n }\n };\n\n const checkTimeThresholds = (elapsed: number) => {\n checkTimeWarning(elapsed);\n\n const { timeLimit, isFinished, onTimeUp } = get();\n if (timeLimit !== null && elapsed >= timeLimit && !isFinished) {\n get().finishQuiz();\n onTimeUp?.();\n }\n };\n\n const startTimer = () => {\n if (get().isFinished) {\n return;\n }\n\n if (timerInterval) {\n clearInterval(timerInterval);\n }\n\n timerStartedAt = Date.now();\n timerBaseElapsed = get().timeElapsed;\n\n document.addEventListener('visibilitychange', handleVisibilityChange);\n\n timerInterval = setInterval(() => {\n if (timerStartedAt === null) return;\n const now = Date.now();\n const elapsed = clampElapsed(\n timerBaseElapsed + Math.floor((now - timerStartedAt) / 1000)\n );\n set({ timeElapsed: elapsed });\n checkTimeThresholds(elapsed);\n }, 1000);\n };\n\n const stopTimer = () => {\n if (timerInterval) {\n clearInterval(timerInterval);\n timerInterval = null;\n }\n timerStartedAt = null;\n timerBaseElapsed = 0;\n document.removeEventListener(\n 'visibilitychange',\n handleVisibilityChange\n );\n };\n\n const setMinuteCallback = (callback: (() => void) | null) => {\n set({ minuteCallback: callback });\n };\n\n const startMinuteCallback = () => {\n const { minuteCallback, isFinished } = get();\n\n if (isFinished || !minuteCallback) {\n return;\n }\n\n if (minuteCallbackInterval) {\n clearInterval(minuteCallbackInterval);\n }\n\n minuteCallbackInterval = setInterval(() => {\n const {\n minuteCallback: currentCallback,\n isFinished: currentIsFinished,\n } = get();\n\n if (currentIsFinished || !currentCallback) {\n stopMinuteCallback();\n return;\n }\n\n currentCallback();\n }, MINUTE_INTERVAL_MS);\n };\n\n const stopMinuteCallback = () => {\n if (minuteCallbackInterval) {\n clearInterval(minuteCallbackInterval);\n minuteCallbackInterval = null;\n }\n };\n\n return {\n // Initial State\n quiz: null,\n currentQuestionIndex: 0,\n selectedAnswers: {},\n userAnswers: [],\n timeElapsed: 0,\n isStarted: false,\n isFinished: false,\n userId: '',\n variant: QuizVariant.DEFAULT,\n minuteCallback: null,\n dissertativeCharLimit: undefined,\n timeLimit: null,\n onTimeUp: null,\n timeWarningThreshold: null,\n onTimeWarning: null,\n hasTimeWarningFired: false,\n questionsResult: null,\n currentQuestionResult: null,\n draftApiClient: null,\n lastSavedDraftPayload: '',\n isSavingDraft: false,\n isDraftUnavailable: false,\n activityFeedback: null,\n // Setters\n setQuiz: (quiz) => set({ quiz }),\n setUserId: (userId) => set({ userId }),\n setUserAnswers: (userAnswers) => set({ userAnswers }),\n getUserId: () => get().userId,\n setVariant: (variant) => set({ variant }),\n setQuestionResult: (questionsResult) => set({ questionsResult }),\n setDissertativeCharLimit: (limit?: number) =>\n set({ dissertativeCharLimit: limit }),\n getDissertativeCharLimit: () => get().dissertativeCharLimit,\n setDraftApiClient: (client) => set({ draftApiClient: client }),\n\n // Draft save - called automatically on navigation\n saveDraft: async () => {\n const {\n draftApiClient,\n quiz,\n hasDraftChanges,\n prepareDraftPayload,\n lastSavedDraftPayload,\n isSavingDraft,\n isDraftUnavailable,\n } = get();\n\n // Skip if no API client configured or no quiz\n if (!draftApiClient || !quiz) return;\n\n // The activity is gone; there is nothing to save into.\n if (isDraftUnavailable) return;\n\n // Skip if already saving\n if (isSavingDraft) return;\n\n // Skip if no changes\n if (!hasDraftChanges()) return;\n\n const payload = prepareDraftPayload();\n const payloadString = JSON.stringify(payload);\n\n // Skip if payload hasn't changed\n if (payloadString === lastSavedDraftPayload) return;\n\n try {\n set({ isSavingDraft: true });\n const result = await draftApiClient.saveDraft(quiz.id, payload);\n\n if (result?.activityGone) {\n set({ isDraftUnavailable: true });\n return;\n }\n\n set({ lastSavedDraftPayload: payloadString });\n } catch (error) {\n // Silent fail - don't interrupt user experience\n console.warn('Erro ao salvar rascunho:', error);\n } finally {\n set({ isSavingDraft: false });\n }\n },\n\n // Load draft and apply to quiz, navigate to first unanswered question\n loadAndApplyDraft: async () => {\n const {\n draftApiClient,\n quiz,\n applyDraftAnswers,\n prepareDraftPayload,\n } = get();\n\n // Skip if no API client configured or no quiz\n if (!draftApiClient || !quiz) return;\n\n try {\n const draftData = await draftApiClient.loadDraft(quiz.id);\n\n if (draftData?.hasDraft && draftData.answers?.length > 0) {\n applyDraftAnswers(draftData.answers);\n\n // Update last saved payload to prevent immediate re-save\n const payload = prepareDraftPayload();\n set({ lastSavedDraftPayload: JSON.stringify(payload) });\n\n // Navigate to first unanswered question\n const questions = get().quiz?.questions || [];\n const updatedAnswers = get().userAnswers;\n\n const firstUnansweredIndex = questions.findIndex((question) => {\n const answer = updatedAnswers.find(\n (a) => a.questionId === question.id\n );\n if (!answer) return true;\n if (answer.optionId) return false;\n if (\n answer.selectedOptionIds &&\n answer.selectedOptionIds.length > 0\n )\n return false;\n if (answer.answer && answer.answer.trim() !== '') return false;\n return true;\n });\n\n if (firstUnansweredIndex > 0) {\n // Navigate without triggering save (internal navigation)\n set({ currentQuestionIndex: firstUnansweredIndex });\n }\n }\n } catch (error) {\n // Silent fail - user can continue fresh\n console.warn('Erro ao carregar rascunho:', error);\n }\n },\n\n // Navigation\n goToNextQuestion: () => {\n const { currentQuestionIndex, getTotalQuestions, saveDraft } = get();\n const totalQuestions = getTotalQuestions();\n\n if (currentQuestionIndex < totalQuestions - 1) {\n // Save draft before navigating\n saveDraft();\n set({ currentQuestionIndex: currentQuestionIndex + 1 });\n }\n },\n\n goToPreviousQuestion: () => {\n const { currentQuestionIndex, saveDraft } = get();\n\n if (currentQuestionIndex > 0) {\n // Save draft before navigating\n saveDraft();\n set({ currentQuestionIndex: currentQuestionIndex - 1 });\n }\n },\n\n goToQuestion: (index) => {\n const { getTotalQuestions, currentQuestionIndex, saveDraft } = get();\n const totalQuestions = getTotalQuestions();\n\n if (\n index >= 0 &&\n index < totalQuestions &&\n index !== currentQuestionIndex\n ) {\n // Save draft before navigating\n saveDraft();\n set({ currentQuestionIndex: index });\n }\n },\n\n selectAnswer: (questionId, answerId) => {\n const { quiz, userAnswers } = get();\n\n if (!quiz) return;\n\n const activityId = quiz.id;\n const userId = get().getUserId();\n\n if (!userId || userId === '') {\n // Silent validation - userId not set\n return;\n }\n\n const question = quiz.questions.find((q) => q.id === questionId);\n if (!question) return;\n\n const existingAnswerIndex = userAnswers.findIndex(\n (answer) => answer.questionId === questionId\n );\n\n const newUserAnswer: UserAnswerItem = {\n questionId,\n activityId,\n userId,\n answer:\n question.questionType === QUESTION_TYPE.DISSERTATIVA\n ? answerId\n : null,\n optionId:\n question.questionType === QUESTION_TYPE.DISSERTATIVA\n ? null\n : answerId,\n questionType: question.questionType,\n answerStatus: ANSWER_STATUS.PENDENTE_AVALIACAO,\n };\n\n let updatedUserAnswers;\n if (existingAnswerIndex !== -1) {\n updatedUserAnswers = [...userAnswers];\n updatedUserAnswers[existingAnswerIndex] = newUserAnswer;\n } else {\n updatedUserAnswers = [...userAnswers, newUserAnswer];\n }\n\n set({\n userAnswers: updatedUserAnswers,\n });\n },\n\n selectMultipleAnswer: (questionId, answerIds) => {\n const { quiz, userAnswers } = get();\n\n if (!quiz) return;\n\n const activityId = quiz.id;\n const userId = get().getUserId();\n\n if (!userId || userId === '') {\n // Silent validation - userId not set\n return;\n }\n\n const question = quiz.questions.find((q) => q.id === questionId);\n if (!question) return;\n\n // Remove all existing answers for this questionId\n const filteredUserAnswers = userAnswers.filter(\n (answer) => answer.questionId !== questionId\n );\n\n // Don't persist empty MULTIPLA_ESCOLHA answers\n if (answerIds.length === 0) {\n set({\n userAnswers: filteredUserAnswers,\n });\n return;\n }\n\n // Create a single UserAnswerItem with selectedOptionIds array\n // This matches the backend API expected format for MULTIPLA_ESCOLHA\n // Also set optionId to first selection for backward compatibility\n const newUserAnswer: UserAnswerItem = {\n questionId,\n activityId,\n userId,\n answer: null,\n optionId: answerIds.length > 0 ? answerIds[0] : null,\n selectedOptionIds: answerIds,\n questionType: question.questionType,\n answerStatus: ANSWER_STATUS.PENDENTE_AVALIACAO,\n };\n\n const updatedUserAnswers = [...filteredUserAnswers, newUserAnswer];\n\n set({\n userAnswers: updatedUserAnswers,\n });\n },\n\n selectDissertativeAnswer: (questionId, answer) => {\n const { quiz, userAnswers, dissertativeCharLimit } = get();\n\n if (!quiz) return;\n\n const activityId = quiz.id;\n const userId = get().getUserId();\n\n if (!userId || userId === '') {\n // Silent validation - userId not set\n return;\n }\n\n const question = quiz.questions.find((q) => q.id === questionId);\n // Allow free-text question types: DISSERTATIVA, RELACIONAR, PREENCHER_LACUNAS, IMAGEM, VERDADEIRO_FALSO\n const allowedTypes = [\n QUESTION_TYPE.DISSERTATIVA,\n QUESTION_TYPE.RELACIONAR,\n QUESTION_TYPE.PREENCHER_LACUNAS,\n QUESTION_TYPE.IMAGEM,\n QUESTION_TYPE.VERDADEIRO_FALSO,\n ];\n if (!question || !allowedTypes.includes(question.questionType)) {\n // Silent validation - wrong question type\n return;\n }\n\n // Validate character limit if set (only for DISSERTATIVA)\n let validatedAnswer = answer;\n if (\n question.questionType === QUESTION_TYPE.DISSERTATIVA &&\n dissertativeCharLimit !== undefined &&\n answer.length > dissertativeCharLimit\n ) {\n validatedAnswer = answer.substring(0, dissertativeCharLimit);\n }\n\n const existingAnswerIndex = userAnswers.findIndex(\n (answerItem) => answerItem.questionId === questionId\n );\n\n const newUserAnswer: UserAnswerItem = {\n questionId,\n activityId,\n userId,\n answer: validatedAnswer,\n optionId: null,\n questionType: question.questionType,\n answerStatus: ANSWER_STATUS.PENDENTE_AVALIACAO,\n };\n\n let updatedUserAnswers;\n if (existingAnswerIndex !== -1) {\n updatedUserAnswers = [...userAnswers];\n updatedUserAnswers[existingAnswerIndex] = newUserAnswer;\n } else {\n updatedUserAnswers = [...userAnswers, newUserAnswer];\n }\n\n set({\n userAnswers: updatedUserAnswers,\n });\n },\n\n skipQuestion: () => {\n const { getCurrentQuestion, userAnswers, quiz } = get();\n const currentQuestion = getCurrentQuestion();\n\n if (!quiz) return;\n\n if (currentQuestion) {\n const activityId = quiz.id;\n const userId = get().getUserId();\n\n if (!userId || userId === '') {\n // Silent validation - userId not set\n return;\n }\n\n const existingAnswerIndex = userAnswers.findIndex(\n (answer) => answer.questionId === currentQuestion.id\n );\n const existingAnswer =\n existingAnswerIndex === -1\n ? null\n : userAnswers[existingAnswerIndex];\n\n // If the user already has an answer with meaningful content, preserve it\n if (hasMeaningfulAnswer(existingAnswer)) {\n // Keep existing answers - don't overwrite with empty skip\n return;\n }\n\n // Create empty \"skipped\" entry\n const newUserAnswer: UserAnswerItem = {\n questionId: currentQuestion.id,\n activityId,\n userId,\n answer: null,\n optionId: null,\n questionType: currentQuestion.questionType,\n answerStatus: ANSWER_STATUS.PENDENTE_AVALIACAO,\n };\n\n let updatedUserAnswers;\n if (existingAnswerIndex !== -1) {\n // Update existing empty entry to proper \"skipped\" format\n updatedUserAnswers = [...userAnswers];\n updatedUserAnswers[existingAnswerIndex] = newUserAnswer;\n } else {\n // Add new skipped entry\n updatedUserAnswers = [...userAnswers, newUserAnswer];\n }\n\n set({\n userAnswers: updatedUserAnswers,\n });\n }\n },\n\n skipCurrentQuestionIfUnanswered: () => {\n const { getCurrentQuestion, getCurrentAnswer, skipQuestion } = get();\n const currentQuestion = getCurrentQuestion();\n const currentAnswer = getCurrentAnswer();\n\n // Se não há questão atual, não faz nada\n if (!currentQuestion) return;\n\n // Se não há resposta ou a resposta está vazia (null), marca como pulada\n // Considera selectedOptionIds para MULTIPLA_ESCOLHA\n if (\n !currentAnswer ||\n (currentAnswer.optionId === null &&\n currentAnswer.answer === null &&\n (!currentAnswer.selectedOptionIds ||\n currentAnswer.selectedOptionIds.length === 0))\n ) {\n skipQuestion();\n }\n },\n\n addUserAnswer: (questionId, answerId) => {\n const { quiz, userAnswers } = get();\n\n if (!quiz) return;\n\n // Add to userAnswers array with new structure\n const activityId = quiz.id;\n const userId = get().getUserId();\n\n if (!userId || userId === '') {\n // Silent validation - userId not set\n return;\n }\n\n const question = quiz.questions.find((q) => q.id === questionId);\n if (!question) return;\n\n const existingAnswerIndex = userAnswers.findIndex(\n (answer) => answer.questionId === questionId\n );\n\n const newUserAnswer: UserAnswerItem = {\n questionId,\n activityId,\n userId,\n answer:\n question.questionType === QUESTION_TYPE.DISSERTATIVA\n ? answerId || null\n : null,\n optionId:\n question.questionType !== QUESTION_TYPE.DISSERTATIVA\n ? answerId || null\n : null,\n questionType: question.questionType,\n answerStatus: ANSWER_STATUS.PENDENTE_AVALIACAO,\n };\n\n if (existingAnswerIndex !== -1) {\n // Update existing answer\n const updatedUserAnswers = [...userAnswers];\n updatedUserAnswers[existingAnswerIndex] = newUserAnswer;\n set({ userAnswers: updatedUserAnswers });\n } else {\n // Add new answer\n set({ userAnswers: [...userAnswers, newUserAnswer] });\n }\n },\n\n startQuiz: (options) => {\n // `initialElapsedSeconds` seeds the stopwatch when resuming an exam\n // the student had already started, so the count picks up from the\n // second it stopped at instead of restarting. startTimer() reads\n // timeElapsed as its base, so setting it here is enough.\n const initialElapsedSeconds = options?.initialElapsedSeconds ?? 0;\n set({ isStarted: true, timeElapsed: initialElapsedSeconds });\n startTimer();\n startMinuteCallback();\n checkTimeWarning(initialElapsedSeconds);\n },\n\n finishQuiz: () => {\n set({ isFinished: true });\n stopTimer();\n stopMinuteCallback();\n },\n\n resetQuiz: () => {\n stopTimer();\n stopMinuteCallback();\n set({\n quiz: null,\n currentQuestionIndex: 0,\n selectedAnswers: {},\n userAnswers: [],\n timeElapsed: 0,\n isStarted: false,\n isFinished: false,\n userId: '',\n variant: QuizVariant.DEFAULT,\n minuteCallback: null,\n dissertativeCharLimit: undefined,\n timeLimit: null,\n onTimeUp: null,\n timeWarningThreshold: null,\n onTimeWarning: null,\n hasTimeWarningFired: false,\n questionsResult: null,\n currentQuestionResult: null,\n // Note: draftApiClient is NOT reset here - it's managed by useDraftAutoSave hook\n lastSavedDraftPayload: '',\n isSavingDraft: false,\n // Scoped to the activity that was open: the next quiz has its own\n // existence, so leaving this set would silently disable autosave\n // for it too.\n isDraftUnavailable: false,\n activityFeedback: null,\n });\n },\n\n // Timer\n updateTime: (time) => {\n timerBaseElapsed = time;\n if (timerStartedAt !== null) {\n timerStartedAt = Date.now();\n }\n set({ timeElapsed: time });\n checkTimeThresholds(time);\n },\n startTimer,\n stopTimer,\n setTimeLimit: (seconds) => set({ timeLimit: seconds }),\n setOnTimeUp: (callback) => set({ onTimeUp: callback }),\n getRemainingTime: () => {\n const { timeLimit, timeElapsed } = get();\n if (timeLimit === null) return null;\n return Math.max(0, timeLimit - timeElapsed);\n },\n setTimeWarning: (seconds, callback) =>\n set({\n timeWarningThreshold: seconds,\n onTimeWarning: callback ?? null,\n // A new threshold is a new warning: rearm it, otherwise raising the\n // limit mid-exam would leave the student without the notice.\n hasTimeWarningFired: false,\n }),\n isTimeExceeded: () => {\n const { timeWarningThreshold, timeElapsed } = get();\n if (timeWarningThreshold === null) return false;\n return timeElapsed >= timeWarningThreshold;\n },\n\n // Minute Callback\n setMinuteCallback,\n startMinuteCallback,\n stopMinuteCallback,\n\n // Getters\n getCurrentQuestion: () => {\n const { currentQuestionIndex, quiz } = get();\n\n if (!quiz) {\n return null;\n }\n\n return quiz.questions[currentQuestionIndex];\n },\n\n getTotalQuestions: () => {\n const { quiz } = get();\n\n return quiz?.questions?.length || 0;\n },\n\n getAnsweredQuestions: () => {\n const { userAnswers } = get();\n const answeredQuestionIds = new Set(\n userAnswers\n .filter((answer) => hasMeaningfulAnswer(answer))\n .map((answer) => answer.questionId)\n );\n return answeredQuestionIds.size;\n },\n\n getUnansweredQuestions: () => {\n const { quiz, userAnswers } = get();\n if (!quiz) return [];\n\n const unansweredQuestions: number[] = [];\n\n quiz.questions.forEach((question, index) => {\n const userAnswer = userAnswers.find(\n (answer) => answer.questionId === question.id\n );\n const isAnswered = hasMeaningfulAnswer(userAnswer);\n // Question is skipped if it has a userAnswer entry but no meaningful content\n const isSkipped = userAnswer && !hasMeaningfulAnswer(userAnswer);\n\n if (!isAnswered && !isSkipped) {\n unansweredQuestions.push(index + 1); // index + 1 para mostrar número da questão\n }\n });\n return unansweredQuestions;\n },\n\n getSkippedQuestions: () => {\n const { userAnswers } = get();\n const skippedQuestionIds = new Set(\n userAnswers\n .filter((answer) => !hasMeaningfulAnswer(answer))\n .map((answer) => answer.questionId)\n );\n return skippedQuestionIds.size;\n },\n\n getProgress: () => {\n const { getTotalQuestions, getAnsweredQuestions } = get();\n const total = getTotalQuestions();\n const answered = getAnsweredQuestions();\n\n return total > 0 ? (answered / total) * 100 : 0;\n },\n\n isQuestionAnswered: (questionId) => {\n const { userAnswers } = get();\n const userAnswer = userAnswers.find(\n (answer) => answer.questionId === questionId\n );\n return hasMeaningfulAnswer(userAnswer);\n },\n\n isQuestionSkipped: (questionId) => {\n const { userAnswers } = get();\n const userAnswer = userAnswers.find(\n (answer) => answer.questionId === questionId\n );\n // Question is skipped if it has a userAnswer entry but no meaningful content\n return userAnswer ? !hasMeaningfulAnswer(userAnswer) : false;\n },\n\n getCurrentAnswer: () => {\n const { getCurrentQuestion, userAnswers } = get();\n const currentQuestion = getCurrentQuestion();\n\n if (!currentQuestion) return undefined;\n\n const userAnswer = userAnswers.find(\n (answer) => answer.questionId === currentQuestion.id\n );\n\n // Retorna undefined se a resposta está vazia (não respondida)\n if (!hasMeaningfulAnswer(userAnswer)) {\n return undefined;\n }\n\n return userAnswer;\n },\n\n getAllCurrentAnswer: () => {\n const { getCurrentQuestion, userAnswers } = get();\n const currentQuestion = getCurrentQuestion();\n\n if (!currentQuestion) return undefined;\n\n const userAnswer = userAnswers.filter(\n (answer) => answer.questionId === currentQuestion.id\n );\n\n return userAnswer;\n },\n\n getQuizTitle: () => {\n const { quiz } = get();\n\n return quiz?.title || 'Quiz';\n },\n\n formatTime: (seconds: number) => {\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = seconds % 60;\n return `${minutes.toString().padStart(2, '0')}:${remainingSeconds.toString().padStart(2, '0')}`;\n },\n\n getUserAnswers: () => {\n const { userAnswers } = get();\n return userAnswers;\n },\n\n getUnansweredQuestionsFromUserAnswers: () => {\n const { quiz, userAnswers } = get();\n if (!quiz) return [];\n\n const unansweredQuestions: number[] = [];\n\n quiz.questions.forEach((question, index) => {\n const userAnswer = userAnswers.find(\n (answer) => answer.questionId === question.id\n );\n const hasAnswer = hasMeaningfulAnswer(userAnswer);\n // Question is skipped if it has a userAnswer entry but no meaningful content\n const isSkipped = userAnswer && !hasMeaningfulAnswer(userAnswer);\n\n // Se não há resposta do usuário OU se a questão foi pulada\n if (!hasAnswer || isSkipped) {\n unansweredQuestions.push(index + 1); // index + 1 para mostrar número da questão\n }\n });\n\n return unansweredQuestions;\n },\n\n getQuestionsGroupedBySubject: () => {\n const { getQuestionResult, quiz, variant } = get();\n const questions =\n variant == 'result'\n ? getQuestionResult()?.answers\n : quiz?.questions;\n if (!questions) return {};\n const groupedQuestions: {\n [key: string]: (Question | QuestionResult['answers'][number])[];\n } = {};\n questions.forEach((question) => {\n const subjectId =\n question.knowledgeMatrix?.[0]?.subject?.id || 'Sem matéria';\n\n if (!groupedQuestions[subjectId]) {\n groupedQuestions[subjectId] = [];\n }\n\n groupedQuestions[subjectId].push(question);\n });\n\n return groupedQuestions;\n },\n\n // New methods for userAnswers\n getUserAnswerByQuestionId: (questionId) => {\n const { userAnswers } = get();\n return (\n userAnswers.find((answer) => answer.questionId === questionId) ||\n null\n );\n },\n isQuestionAnsweredByUserAnswers: (questionId) => {\n const { userAnswers } = get();\n const answer = userAnswers.find(\n (answer) => answer.questionId === questionId\n );\n return hasMeaningfulAnswer(answer);\n },\n getQuestionStatusFromUserAnswers: (questionId) => {\n const { userAnswers } = get();\n const answer = userAnswers.find(\n (answer) => answer.questionId === questionId\n );\n if (!answer) return 'unanswered';\n if (hasMeaningfulAnswer(answer)) return 'answered';\n return 'skipped';\n },\n getUserAnswersForActivity: () => {\n const { userAnswers } = get();\n return userAnswers;\n },\n setCurrentQuestion: (question) => {\n const { quiz, variant, questionsResult } = get();\n if (!quiz) return;\n let questionIndex: number;\n if (variant == 'result') {\n if (!questionsResult) return;\n const questionResult =\n questionsResult.answers.find((q) => q.id === question.id) ??\n questionsResult.answers.find((q) => q.questionId === question.id);\n if (!questionResult) return;\n questionIndex = quiz.questions.findIndex(\n (q) => q.id === questionResult.questionId\n );\n } else {\n questionIndex = quiz.questions.findIndex(\n (q) => q.id === question.id\n );\n }\n\n // Validate that the question was found before updating currentQuestionIndex\n if (questionIndex === -1) {\n // Silent validation - question not found\n return;\n }\n\n set({ currentQuestionIndex: questionIndex });\n },\n\n setAnswerStatus: (questionId, status) => {\n const { userAnswers } = get();\n const existingAnswerIndex = userAnswers.findIndex(\n (answer) => answer.questionId === questionId\n );\n\n if (existingAnswerIndex !== -1) {\n const updatedUserAnswers = [...userAnswers];\n updatedUserAnswers[existingAnswerIndex] = {\n ...updatedUserAnswers[existingAnswerIndex],\n answerStatus: status,\n };\n set({ userAnswers: updatedUserAnswers });\n }\n },\n\n getAnswerStatus: (questionId) => {\n const { userAnswers } = get();\n const userAnswer = userAnswers.find(\n (answer) => answer.questionId === questionId\n );\n return userAnswer ? userAnswer.answerStatus : null;\n },\n getQuestionIndex: (questionId) => {\n const { questionsResult, variant, quiz } = get();\n if (variant == 'result') {\n if (!questionsResult) return 0;\n\n let idx = questionsResult.answers.findIndex(\n (q) => q.questionId === questionId\n );\n if (idx === -1) {\n idx = questionsResult.answers.findIndex(\n (q) => q.id === questionId\n );\n }\n return idx !== -1 ? idx + 1 : 0;\n } else {\n if (!quiz) return 0;\n const idx = quiz.questions.findIndex((q) => q.id === questionId);\n return idx !== -1 ? idx + 1 : 0;\n }\n },\n\n // Question Result\n getQuestionResultByQuestionId: (questionId) => {\n const { questionsResult } = get();\n const question = questionsResult?.answers.find(\n (answer) => answer.questionId === questionId\n );\n\n return question || null;\n },\n getQuestionResultStatistics: () => {\n const { questionsResult } = get();\n return questionsResult?.statistics || null;\n },\n getQuestionResult: () => {\n const { questionsResult } = get();\n return questionsResult;\n },\n setQuestionsResult: (questionsResult) => {\n set({ questionsResult });\n },\n setCurrentQuestionResult: (currentQuestionResult) => {\n set({ currentQuestionResult });\n },\n getCurrentQuestionResult: () => {\n const { currentQuestionResult } = get();\n return currentQuestionResult;\n },\n\n // Draft management\n applyDraftAnswers: (draftAnswers) => {\n const { quiz, userId } = get();\n if (!quiz || !draftAnswers || draftAnswers.length === 0) return;\n\n const activityId = quiz.id;\n const newUserAnswers: UserAnswerItem[] = [];\n\n for (const draft of draftAnswers) {\n const question = quiz.questions.find(\n (q) => q.id === draft.questionId\n );\n if (!question) continue;\n\n // Parse answer if it's a JSON string (for complex answer types)\n let parsedAnswer = draft.answer;\n let selectedOptionIds = draft.selectedOptionIds;\n\n // Try to parse JSON answer for complex types\n if (draft.answer && !draft.optionId) {\n try {\n const parsed = JSON.parse(draft.answer);\n if (parsed.selectedOptionIds) {\n selectedOptionIds = parsed.selectedOptionIds;\n parsedAnswer = null;\n }\n } catch {\n // Not JSON, keep as plain text\n }\n }\n\n const userAnswer: UserAnswerItem = {\n questionId: draft.questionId,\n activityId,\n userId,\n answer: parsedAnswer,\n optionId: draft.optionId || null,\n selectedOptionIds: selectedOptionIds || null,\n questionType: question.questionType,\n answerStatus: ANSWER_STATUS.PENDENTE_AVALIACAO,\n };\n\n newUserAnswers.push(userAnswer);\n }\n\n set({ userAnswers: newUserAnswers });\n },\n\n prepareDraftPayload: () => {\n const { userAnswers } = get();\n\n const answers = userAnswers\n .filter((answer) => hasMeaningfulAnswer(answer))\n .map((answer) => {\n const draftAnswer: SaveDraftPayload['answers'][number] = {\n questionId: answer.questionId,\n };\n\n if (answer.optionId) {\n draftAnswer.optionId = answer.optionId;\n }\n\n if (answer.answer) {\n draftAnswer.answer = answer.answer;\n }\n\n if (\n answer.selectedOptionIds &&\n answer.selectedOptionIds.length > 0\n ) {\n draftAnswer.selectedOptionIds = answer.selectedOptionIds;\n }\n\n return draftAnswer;\n });\n\n return { answers };\n },\n\n hasDraftChanges: () => {\n const { userAnswers } = get();\n return userAnswers.some((answer) => hasMeaningfulAnswer(answer));\n },\n\n // Activity Feedback\n setActivityFeedback: (feedback) => set({ activityFeedback: feedback }),\n getActivityFeedback: () => get().activityFeedback,\n };\n },\n {\n name: 'quiz-store',\n }\n )\n);\n"]}