analytica-frontend-lib 1.6.21 → 1.6.23
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.
- package/dist/AccessReportModal/index.js +1 -1
- package/dist/AccessReportModal/index.mjs +1 -1
- package/dist/AccessibilityWidget/index.js +1 -1
- package/dist/AccessibilityWidget/index.mjs +1 -1
- package/dist/Accordation/index.js +1 -1
- package/dist/Accordation/index.mjs +1 -1
- package/dist/ActivitiesHistory/index.js +19 -19
- package/dist/ActivitiesHistory/index.mjs +18 -18
- package/dist/ActivityCardQuestionBanks/index.js +19 -19
- package/dist/ActivityCardQuestionBanks/index.mjs +18 -18
- package/dist/ActivityCardQuestionPreview/index.js +19 -19
- package/dist/ActivityCardQuestionPreview/index.mjs +18 -18
- package/dist/ActivityCreate/ActivityCreate.utils/index.js +3 -3
- package/dist/ActivityCreate/ActivityCreate.utils/index.mjs +2 -2
- package/dist/ActivityCreate/ActivityCreateContent/index.js +19 -19
- package/dist/ActivityCreate/ActivityCreateContent/index.mjs +18 -18
- package/dist/ActivityCreate/index.js +19 -19
- package/dist/ActivityCreate/index.mjs +18 -18
- package/dist/ActivityDetails/index.js +19 -19
- package/dist/ActivityDetails/index.mjs +18 -18
- package/dist/ActivityFilters/index.js +19 -19
- package/dist/ActivityFilters/index.mjs +18 -18
- package/dist/ActivityPageLayout/index.js +19 -19
- package/dist/ActivityPageLayout/index.mjs +18 -18
- package/dist/ActivityPreview/index.js +19 -19
- package/dist/ActivityPreview/index.mjs +18 -18
- package/dist/Alert/index.js +1 -1
- package/dist/Alert/index.mjs +1 -1
- package/dist/AlertDialog/index.js +1 -1
- package/dist/AlertDialog/index.mjs +1 -1
- package/dist/AlertManager/index.js +19 -19
- package/dist/AlertManager/index.mjs +18 -18
- package/dist/AlertManagerView/index.js +1 -1
- package/dist/AlertManagerView/index.mjs +1 -1
- package/dist/Alternative/index.js +1 -1
- package/dist/Alternative/index.mjs +1 -1
- package/dist/AnnouncementModal/index.js +1 -1
- package/dist/AnnouncementModal/index.mjs +1 -1
- package/dist/AnnouncementsGate/index.js +1 -1
- package/dist/AnnouncementsGate/index.mjs +1 -1
- package/dist/AnswerKeyModal/index.js +1 -1
- package/dist/AnswerKeyModal/index.mjs +1 -1
- package/dist/AppHeader/index.js +1 -1
- package/dist/AppHeader/index.mjs +1 -1
- package/dist/AppLayout/index.js +1 -1
- package/dist/AppLayout/index.mjs +1 -1
- package/dist/Avatar/index.js +1 -1
- package/dist/Avatar/index.mjs +1 -1
- package/dist/Badge/index.js +1 -1
- package/dist/Badge/index.mjs +1 -1
- package/dist/BreadcrumbMenu/index.js +1 -1
- package/dist/BreadcrumbMenu/index.mjs +1 -1
- package/dist/Button/index.js +1 -1
- package/dist/Button/index.mjs +1 -1
- package/dist/Calendar/index.js +1 -1
- package/dist/Calendar/index.mjs +1 -1
- package/dist/CalendarCard/index.js +1 -1
- package/dist/CalendarCard/index.mjs +1 -1
- package/dist/Card/index.js +1 -1
- package/dist/Card/index.mjs +1 -1
- package/dist/ChartComponents/index.js +1 -1
- package/dist/ChartComponents/index.mjs +1 -1
- package/dist/Chat/index.js +1 -1
- package/dist/Chat/index.mjs +1 -1
- package/dist/Chatbot/index.js +1 -1
- package/dist/Chatbot/index.mjs +1 -1
- package/dist/CheckBox/index.js +1 -1
- package/dist/CheckBox/index.mjs +1 -1
- package/dist/CheckBoxGroup/index.js +19 -19
- package/dist/CheckBoxGroup/index.mjs +18 -18
- package/dist/Chips/index.js +1 -1
- package/dist/Chips/index.mjs +1 -1
- package/dist/ChoroplethMap/index.js +1 -1
- package/dist/ChoroplethMap/index.mjs +1 -1
- package/dist/ColorPicker/index.js +1 -1
- package/dist/ColorPicker/index.mjs +1 -1
- package/dist/ComparatorChart/ComparatorView/index.js +1 -1
- package/dist/ComparatorChart/ComparatorView/index.mjs +1 -1
- package/dist/CorrectActivityModal/index.js +6 -6
- package/dist/CorrectActivityModal/index.mjs +5 -5
- package/dist/Divider/index.js +1 -1
- package/dist/Divider/index.mjs +1 -1
- package/dist/DownloadButton/index.js +1 -1
- package/dist/DownloadButton/index.mjs +1 -1
- package/dist/DownloadModal/index.js +1 -1
- package/dist/DownloadModal/index.mjs +1 -1
- package/dist/DragHandleButton/index.js +1 -1
- package/dist/DragHandleButton/index.mjs +1 -1
- package/dist/DropdownMenu/index.js +1 -1
- package/dist/DropdownMenu/index.mjs +1 -1
- package/dist/EmptyState/index.js +1 -1
- package/dist/EmptyState/index.mjs +1 -1
- package/dist/EnemClassroomStartModal/index.d.ts +0 -2
- package/dist/EnemClassroomStartModal/index.d.ts.map +1 -1
- package/dist/EnemClassroomStartModal/index.js +4 -6
- package/dist/EnemClassroomStartModal/index.js.map +1 -1
- package/dist/EnemClassroomStartModal/index.mjs +3 -5
- package/dist/EssayThemePicker/index.js +1 -1
- package/dist/EssayThemePicker/index.mjs +1 -1
- package/dist/ExamDetailsLayout/ExamDetailsPage/index.js +19 -19
- package/dist/ExamDetailsLayout/ExamDetailsPage/index.mjs +18 -18
- package/dist/ExamPageLayout/examsTableConfig/index.js +1 -1
- package/dist/ExamPageLayout/examsTableConfig/index.mjs +1 -1
- package/dist/ExamPageLayout/index.js +19 -19
- package/dist/ExamPageLayout/index.mjs +18 -18
- package/dist/FileAttachment/index.js +1 -1
- package/dist/FileAttachment/index.mjs +1 -1
- package/dist/FileDropzone/index.js +1 -1
- package/dist/FileDropzone/index.mjs +1 -1
- package/dist/Forum/index.js +4 -4
- package/dist/Forum/index.mjs +3 -3
- package/dist/HtmlMathRenderer/index.js +1 -1
- package/dist/HtmlMathRenderer/index.mjs +1 -1
- package/dist/IconButton/index.js +1 -1
- package/dist/IconButton/index.mjs +1 -1
- package/dist/IconRoundedButton/index.js +1 -1
- package/dist/IconRoundedButton/index.mjs +1 -1
- package/dist/ImagePreviewCard/index.js +1 -1
- package/dist/ImagePreviewCard/index.mjs +1 -1
- package/dist/ImageUpload/index.js +1 -1
- package/dist/ImageUpload/index.mjs +1 -1
- package/dist/LatexRenderer/index.js +1 -1
- package/dist/LatexRenderer/index.mjs +1 -1
- package/dist/LevelBar/index.js +1 -1
- package/dist/LevelBar/index.mjs +1 -1
- package/dist/Menu/index.js +1 -1
- package/dist/Menu/index.mjs +1 -1
- package/dist/MetricBox/index.js +1 -1
- package/dist/MetricBox/index.mjs +1 -1
- package/dist/Modal/index.js +1 -1
- package/dist/Modal/index.mjs +1 -1
- package/dist/ModalComponents/index.js +1 -1
- package/dist/ModalComponents/index.mjs +1 -1
- package/dist/MultiSearchSelect/index.js +1 -1
- package/dist/MultiSearchSelect/index.mjs +1 -1
- package/dist/MultipleChoice/index.js +1 -1
- package/dist/MultipleChoice/index.mjs +1 -1
- package/dist/NavButton/index.js +1 -1
- package/dist/NavButton/index.mjs +1 -1
- package/dist/NoSearchResult/index.js +1 -1
- package/dist/NoSearchResult/index.mjs +1 -1
- package/dist/NotFound/index.js +1 -1
- package/dist/NotFound/index.mjs +1 -1
- package/dist/NotificationCard/index.js +1 -1
- package/dist/NotificationCard/index.mjs +1 -1
- package/dist/PerformanceDistributionChart/index.js +1 -1
- package/dist/PerformanceDistributionChart/index.mjs +1 -1
- package/dist/PerformanceQuestionsData/index.js +1 -1
- package/dist/PerformanceQuestionsData/index.mjs +1 -1
- package/dist/PerformanceRanking/index.js +1 -1
- package/dist/PerformanceRanking/index.mjs +1 -1
- package/dist/PerformanceReport/index.js +1 -1
- package/dist/PerformanceReport/index.mjs +1 -1
- package/dist/PerformanceReportModal/index.js +1 -1
- package/dist/PerformanceReportModal/index.mjs +1 -1
- package/dist/PeriodSelector/index.js +1 -1
- package/dist/PeriodSelector/index.mjs +1 -1
- package/dist/PrintableUsersTable/index.js +19 -19
- package/dist/PrintableUsersTable/index.mjs +18 -18
- package/dist/ProficiencyChart/index.js +1 -1
- package/dist/ProficiencyChart/index.mjs +1 -1
- package/dist/ProgressBar/index.js +1 -1
- package/dist/ProgressBar/index.mjs +1 -1
- package/dist/ProgressCircle/index.js +1 -1
- package/dist/ProgressCircle/index.mjs +1 -1
- package/dist/ProgressModal/index.js +1 -1
- package/dist/ProgressModal/index.mjs +1 -1
- package/dist/QuestionsData/index.js +1 -1
- package/dist/QuestionsData/index.mjs +1 -1
- package/dist/QuestionsPerformanceCard/index.js +19 -19
- package/dist/QuestionsPerformanceCard/index.mjs +18 -18
- package/dist/Quiz/QuizResult/index.d.ts.map +1 -1
- package/dist/Quiz/QuizResult/index.js +4 -4
- package/dist/Quiz/QuizResult/index.mjs +3 -3
- package/dist/Quiz/TeacherFeedbackSection/index.js +3 -3
- package/dist/Quiz/TeacherFeedbackSection/index.mjs +2 -2
- package/dist/Quiz/TeacherQuestionComment/index.js +3 -3
- package/dist/Quiz/TeacherQuestionComment/index.mjs +2 -2
- package/dist/Quiz/index.d.ts.map +1 -1
- package/dist/Quiz/index.js +6 -6
- package/dist/Quiz/index.mjs +5 -5
- package/dist/Quiz/useQuizStore/index.d.ts +6 -0
- package/dist/Quiz/useQuizStore/index.d.ts.map +1 -1
- package/dist/Quiz/useQuizStore/index.js +2 -2
- package/dist/Quiz/useQuizStore/index.mjs +1 -1
- package/dist/QuizTimer/index.js +3 -3
- package/dist/QuizTimer/index.mjs +2 -2
- package/dist/Radio/index.js +1 -1
- package/dist/Radio/index.mjs +1 -1
- package/dist/RangeGauge/index.js +1 -1
- package/dist/RangeGauge/index.mjs +1 -1
- package/dist/RecommendedLessonCreate/index.js +19 -19
- package/dist/RecommendedLessonCreate/index.mjs +18 -18
- package/dist/RecommendedLessonDetails/index.js +1 -1
- package/dist/RecommendedLessonDetails/index.mjs +1 -1
- package/dist/RecommendedLessonsHistory/index.js +19 -19
- package/dist/RecommendedLessonsHistory/index.mjs +18 -18
- package/dist/ReportDetailModal/index.js +1 -1
- package/dist/ReportDetailModal/index.mjs +1 -1
- package/dist/RestrictedAccess/index.js +1 -1
- package/dist/RestrictedAccess/index.mjs +1 -1
- package/dist/RichEditor/index.js +3 -3
- package/dist/RichEditor/index.mjs +2 -2
- package/dist/{RichEditorCore-F5QPQLEK.js → RichEditorCore-NEIZKFKE.js} +2 -2
- package/dist/{RichEditorCore-F5QPQLEK.js.map → RichEditorCore-NEIZKFKE.js.map} +1 -1
- package/dist/{RichEditorCore-QZYPHNRY.mjs → RichEditorCore-TLAFZ5XG.mjs} +2 -2
- package/dist/ScoreCircle/index.js +1 -1
- package/dist/ScoreCircle/index.mjs +1 -1
- package/dist/Search/index.js +1 -1
- package/dist/Search/index.mjs +1 -1
- package/dist/SearchSelect/index.js +1 -1
- package/dist/SearchSelect/index.mjs +1 -1
- package/dist/Select/index.js +1 -1
- package/dist/Select/index.mjs +1 -1
- package/dist/SelectionButton/index.js +1 -1
- package/dist/SelectionButton/index.mjs +1 -1
- package/dist/SendActivityModal/SendActivityModal.js +19 -19
- package/dist/SendActivityModal/SendActivityModal.mjs +18 -18
- package/dist/SendActivityModal/index.js +19 -19
- package/dist/SendActivityModal/index.mjs +18 -18
- package/dist/SendLessonModal/index.js +19 -19
- package/dist/SendLessonModal/index.mjs +18 -18
- package/dist/SimpleBarChart/index.js +1 -1
- package/dist/SimpleBarChart/index.mjs +1 -1
- package/dist/SimulatedPerformance/SimulatedPerformanceView/index.js +19 -19
- package/dist/SimulatedPerformance/SimulatedPerformanceView/index.mjs +18 -18
- package/dist/SimulatedPerformance/useSimulatedPerformance/index.js +1 -1
- package/dist/SimulatedPerformance/useSimulatedPerformance/index.mjs +1 -1
- package/dist/SimulatedStudentSimulationsModal/index.js +19 -19
- package/dist/SimulatedStudentSimulationsModal/index.mjs +5 -5
- package/dist/SimulationsPage/index.js +19 -19
- package/dist/SimulationsPage/index.mjs +18 -18
- package/dist/Skeleton/index.js +1 -1
- package/dist/Skeleton/index.mjs +1 -1
- package/dist/StatisticsCard/index.js +1 -1
- package/dist/StatisticsCard/index.mjs +1 -1
- package/dist/Stepper/index.js +1 -1
- package/dist/Stepper/index.mjs +1 -1
- package/dist/StudentLessonProgressModal/index.js +1 -1
- package/dist/StudentLessonProgressModal/index.mjs +1 -1
- package/dist/StudentPerformanceDetailsModal/index.js +1 -1
- package/dist/StudentPerformanceDetailsModal/index.mjs +1 -1
- package/dist/StudentRanking/index.js +1 -1
- package/dist/StudentRanking/index.mjs +1 -1
- package/dist/SubjectIcons/index.js +1 -1
- package/dist/SubjectIcons/index.mjs +1 -1
- package/dist/SubjectMenuOverflow/index.js +1 -1
- package/dist/SubjectMenuOverflow/index.mjs +1 -1
- package/dist/Support/TicketModal/index.js +1 -1
- package/dist/Support/TicketModal/index.mjs +1 -1
- package/dist/Support/index.js +1 -1
- package/dist/Support/index.mjs +1 -1
- package/dist/Table/TablePagination/index.js +1 -1
- package/dist/Table/TablePagination/index.mjs +1 -1
- package/dist/Table/index.js +1 -1
- package/dist/Table/index.mjs +1 -1
- package/dist/TableProvider/index.js +19 -19
- package/dist/TableProvider/index.mjs +18 -18
- package/dist/Text/index.js +1 -1
- package/dist/Text/index.mjs +1 -1
- package/dist/TextArea/index.js +1 -1
- package/dist/TextArea/index.mjs +1 -1
- package/dist/ThemeToggle/index.js +1 -1
- package/dist/ThemeToggle/index.mjs +1 -1
- package/dist/TimeChart/index.js +1 -1
- package/dist/TimeChart/index.mjs +1 -1
- package/dist/TimeReport/index.js +1 -1
- package/dist/TimeReport/index.mjs +1 -1
- package/dist/Toast/Toaster/index.js +1 -1
- package/dist/Toast/Toaster/index.mjs +1 -1
- package/dist/Toast/index.js +1 -1
- package/dist/Toast/index.mjs +1 -1
- package/dist/ToggleSwitch/index.js +1 -1
- package/dist/ToggleSwitch/index.mjs +1 -1
- package/dist/TokenValidation/index.js +1 -1
- package/dist/TokenValidation/index.mjs +1 -1
- package/dist/Tooltip/index.js +1 -1
- package/dist/Tooltip/index.mjs +1 -1
- package/dist/TruncatedText/index.js +1 -1
- package/dist/TruncatedText/index.mjs +1 -1
- package/dist/TypeSelector/index.js +1 -1
- package/dist/TypeSelector/index.mjs +1 -1
- package/dist/UnifiedDraftModelPage/index.js +19 -19
- package/dist/UnifiedDraftModelPage/index.mjs +18 -18
- package/dist/UnifiedHistoryPage/index.js +19 -19
- package/dist/UnifiedHistoryPage/index.mjs +18 -18
- package/dist/VerticalBarChart/index.js +1 -1
- package/dist/VerticalBarChart/index.mjs +1 -1
- package/dist/VideoPlayer/index.js +1 -1
- package/dist/VideoPlayer/index.mjs +1 -1
- package/dist/Whiteboard/index.js +1 -1
- package/dist/Whiteboard/index.mjs +1 -1
- package/dist/{chunk-JBAGQ7L5.js → chunk-3VG5MEMY.js} +14 -13
- package/dist/chunk-3VG5MEMY.js.map +1 -0
- package/dist/{chunk-ED23HOE6.mjs → chunk-5NIU4XJY.mjs} +7 -6
- package/dist/chunk-5NIU4XJY.mjs.map +1 -0
- package/dist/{chunk-DDZDNGBU.mjs → chunk-64WGFT5E.mjs} +3 -1
- package/dist/chunk-64WGFT5E.mjs.map +1 -0
- package/dist/{chunk-QN32O3J3.js → chunk-6MK23BTK.js} +62 -62
- package/dist/{chunk-QN32O3J3.js.map → chunk-6MK23BTK.js.map} +1 -1
- package/dist/{chunk-XX4WE4TL.js → chunk-726PIA5M.js} +1 -1
- package/dist/chunk-726PIA5M.js.map +1 -0
- package/dist/{chunk-VZJKHIHN.mjs → chunk-7KALNPIG.mjs} +4 -4
- package/dist/{chunk-NQNEG4KR.mjs → chunk-7VKFZHWP.mjs} +11 -10
- package/dist/chunk-7VKFZHWP.mjs.map +1 -0
- package/dist/{chunk-GYQUB3VW.js → chunk-BBFV3NDF.js} +8 -6
- package/dist/chunk-BBFV3NDF.js.map +1 -0
- package/dist/{chunk-I3Z2BHGN.js → chunk-BJHYT75K.js} +3 -3
- package/dist/{chunk-I3Z2BHGN.js.map → chunk-BJHYT75K.js.map} +1 -1
- package/dist/{chunk-CFTQ24UT.mjs → chunk-CMYBNZ74.mjs} +2 -2
- package/dist/{chunk-R7NS5KFE.mjs → chunk-CWUNF7U6.mjs} +3 -3
- package/dist/{chunk-NAOHJW6H.mjs → chunk-DLHV7CZN.mjs} +6 -6
- package/dist/{chunk-7EXSCXPK.mjs → chunk-DMYETMZG.mjs} +2 -2
- package/dist/{chunk-RQPSA4QV.js → chunk-GQUTHDV2.js} +3 -3
- package/dist/{chunk-RQPSA4QV.js.map → chunk-GQUTHDV2.js.map} +1 -1
- package/dist/{chunk-OZWPOXVU.mjs → chunk-GVGDUCVF.mjs} +2 -2
- package/dist/{chunk-QFWY46XU.js → chunk-IMDS5NQL.js} +16 -16
- package/dist/{chunk-QFWY46XU.js.map → chunk-IMDS5NQL.js.map} +1 -1
- package/dist/{chunk-KYGFYAU7.js → chunk-JHN35HPH.js} +3 -3
- package/dist/{chunk-KYGFYAU7.js.map → chunk-JHN35HPH.js.map} +1 -1
- package/dist/{chunk-DMZTDCUF.js → chunk-JPQI2RIV.js} +3 -3
- package/dist/{chunk-DMZTDCUF.js.map → chunk-JPQI2RIV.js.map} +1 -1
- package/dist/{chunk-VVRRAF6H.js → chunk-KWH2WMV6.js} +97 -64
- package/dist/chunk-KWH2WMV6.js.map +1 -0
- package/dist/{chunk-LXX5KU3O.mjs → chunk-LMDAF6LA.mjs} +2 -2
- package/dist/{chunk-FL4W4S6J.mjs → chunk-MOSP7FR5.mjs} +1 -1
- package/dist/chunk-MOSP7FR5.mjs.map +1 -0
- package/dist/{chunk-HZXXADG4.js → chunk-NLPBW3SW.js} +44 -43
- package/dist/chunk-NLPBW3SW.js.map +1 -0
- package/dist/{chunk-TAABXGZL.mjs → chunk-O3JP6ZMQ.mjs} +2 -2
- package/dist/{chunk-MFO4S7T5.js → chunk-PJOBOBNJ.js} +3 -3
- package/dist/{chunk-MFO4S7T5.js.map → chunk-PJOBOBNJ.js.map} +1 -1
- package/dist/{chunk-CWGYVJTQ.mjs → chunk-PORNR2NU.mjs} +3 -3
- package/dist/chunk-QF3UKRIJ.js +33 -0
- package/dist/chunk-QF3UKRIJ.js.map +1 -0
- package/dist/chunk-RAHXO5YU.mjs +33 -0
- package/dist/chunk-RAHXO5YU.mjs.map +1 -0
- package/dist/{chunk-BTZANNVO.js → chunk-RQ65U5G2.js} +3 -3
- package/dist/{chunk-BTZANNVO.js.map → chunk-RQ65U5G2.js.map} +1 -1
- package/dist/{chunk-Q56I63FO.mjs → chunk-RVGLLMWG.mjs} +2 -2
- package/dist/{chunk-4MPXVPBQ.mjs → chunk-STYYUG3Q.mjs} +91 -58
- package/dist/chunk-STYYUG3Q.mjs.map +1 -0
- package/dist/{chunk-INIH23HU.js → chunk-VF6QXUX3.js} +2 -2
- package/dist/{chunk-INIH23HU.js.map → chunk-VF6QXUX3.js.map} +1 -1
- package/dist/{chunk-QWC5GC2Q.mjs → chunk-WY7V5UJN.mjs} +2 -2
- package/dist/{chunk-OCKO7T7L.js → chunk-XQAYZBLL.js} +3 -3
- package/dist/{chunk-OCKO7T7L.js.map → chunk-XQAYZBLL.js.map} +1 -1
- package/dist/{chunk-ATGLKKXI.js → chunk-Y7ZBWTD7.js} +17 -17
- package/dist/{chunk-ATGLKKXI.js.map → chunk-Y7ZBWTD7.js.map} +1 -1
- package/dist/{chunk-7XWWI5EY.js → chunk-YFIB3YNQ.js} +11 -11
- package/dist/{chunk-7XWWI5EY.js.map → chunk-YFIB3YNQ.js.map} +1 -1
- package/dist/{chunk-UCWTF336.mjs → chunk-YWGJAB63.mjs} +2 -2
- package/dist/components/Quiz/Quiz.utils.d.ts +8 -0
- package/dist/components/Quiz/Quiz.utils.d.ts.map +1 -1
- package/dist/hooks/useAppContent/index.js +19 -19
- package/dist/hooks/useAppContent/index.mjs +18 -18
- package/dist/hooks/useComparator/index.js +1 -1
- package/dist/hooks/useComparator/index.mjs +1 -1
- package/dist/hooks/useDraftAutoSave/index.js +3 -3
- package/dist/hooks/useDraftAutoSave/index.mjs +2 -2
- package/dist/index.js +19 -19
- package/dist/index.mjs +18 -18
- package/dist/types/enemClassroom/index.d.ts +29 -2
- package/dist/types/enemClassroom/index.d.ts.map +1 -1
- package/dist/types/enemClassroom/index.js +4 -2
- package/dist/types/enemClassroom/index.js.map +1 -1
- package/dist/types/enemClassroom/index.mjs +3 -1
- package/dist/types/enemClassroom.d.ts +29 -2
- package/dist/types/enemClassroom.d.ts.map +1 -1
- package/dist/types/questionTypes/index.js +1 -1
- package/dist/types/questionTypes/index.mjs +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/index.mjs +1 -1
- package/dist/utils/renderSubjectCell/index.js +1 -1
- package/dist/utils/renderSubjectCell/index.mjs +1 -1
- package/dist/utils/renderTextCell/index.js +1 -1
- package/dist/utils/renderTextCell/index.mjs +1 -1
- package/package.json +1 -1
- package/dist/chunk-4MPXVPBQ.mjs.map +0 -1
- package/dist/chunk-DDZDNGBU.mjs.map +0 -1
- package/dist/chunk-ED23HOE6.mjs.map +0 -1
- package/dist/chunk-FL4W4S6J.mjs.map +0 -1
- package/dist/chunk-GYQUB3VW.js.map +0 -1
- package/dist/chunk-HZXXADG4.js.map +0 -1
- package/dist/chunk-JBAGQ7L5.js.map +0 -1
- package/dist/chunk-ND5M3DZA.mjs +0 -21
- package/dist/chunk-ND5M3DZA.mjs.map +0 -1
- package/dist/chunk-NQNEG4KR.mjs.map +0 -1
- package/dist/chunk-NYKBCQUO.js +0 -21
- package/dist/chunk-NYKBCQUO.js.map +0 -1
- package/dist/chunk-VVRRAF6H.js.map +0 -1
- package/dist/chunk-XX4WE4TL.js.map +0 -1
- /package/dist/{RichEditorCore-QZYPHNRY.mjs.map → RichEditorCore-TLAFZ5XG.mjs.map} +0 -0
- /package/dist/{chunk-VZJKHIHN.mjs.map → chunk-7KALNPIG.mjs.map} +0 -0
- /package/dist/{chunk-CFTQ24UT.mjs.map → chunk-CMYBNZ74.mjs.map} +0 -0
- /package/dist/{chunk-R7NS5KFE.mjs.map → chunk-CWUNF7U6.mjs.map} +0 -0
- /package/dist/{chunk-NAOHJW6H.mjs.map → chunk-DLHV7CZN.mjs.map} +0 -0
- /package/dist/{chunk-7EXSCXPK.mjs.map → chunk-DMYETMZG.mjs.map} +0 -0
- /package/dist/{chunk-OZWPOXVU.mjs.map → chunk-GVGDUCVF.mjs.map} +0 -0
- /package/dist/{chunk-LXX5KU3O.mjs.map → chunk-LMDAF6LA.mjs.map} +0 -0
- /package/dist/{chunk-TAABXGZL.mjs.map → chunk-O3JP6ZMQ.mjs.map} +0 -0
- /package/dist/{chunk-CWGYVJTQ.mjs.map → chunk-PORNR2NU.mjs.map} +0 -0
- /package/dist/{chunk-Q56I63FO.mjs.map → chunk-RVGLLMWG.mjs.map} +0 -0
- /package/dist/{chunk-QWC5GC2Q.mjs.map → chunk-WY7V5UJN.mjs.map} +0 -0
- /package/dist/{chunk-UCWTF336.mjs.map → chunk-YWGJAB63.mjs.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/EnemClassroomStartModal/EnemClassroomStartModal.tsx"],"sourcesContent":["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 EnemClassroomStudentTexts,\n type EnemClassroomSurveyQuestion,\n} from '../../types/enemClassroom';\n\n/** Title shared by every step, as in the design. */\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. The first one is\n * the backoffice's to write (`studentTexts`); the other two are fixed.\n *\n * @param texts - The exam's texts\n * @returns The warnings in order\n */\nconst buildIntroWarnings = (texts: EnemClassroomStudentTexts) => [\n {\n icon: warningClassroomIcon,\n title: texts.introWarningTitle,\n description: texts.introWarningText,\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];\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 * Literal, e não `bg-gradient-to-r from-… to-…`: o Tailwind v4 interpola\n * `in oklab`, o que muda os tons do meio em relação ao sRGB do design.\n *\n * `border-0` porque o `solid/primary` do Button traz `border-primary-950`, que\n * o gradiente não cobre — ele só troca o fundo. Zerar a largura, em vez de\n * pintar a borda de transparente, também neutraliza as cores de hover e\n * active, que voltariam a aparecer.\n */\nconst GRADIENT_CTA_CLASSES =\n 'bg-[linear-gradient(270deg,#B21FF6_0%,#F95493_100%)] border-0 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 /**\n * Só o passo da introdução, e só quando há vídeo, prende o player no topo e\n * rola o conteúdo abaixo dele. Nos outros passos a rolagem segue sendo a do\n * Modal — tirá-la de lá sempre cortaria as perguntas em tela baixa.\n */\n const hasPinnedVideo = currentStep.kind === 'intro' && Boolean(exam.videoUrl);\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\n className=\"flex flex-col gap-6 min-h-0\"\n data-testid=\"enem-classroom-intro\"\n >\n {exam.videoUrl && (\n <Text\n size=\"md\"\n weight=\"semibold\"\n className=\"text-text-950\"\n data-testid=\"enem-classroom-intro-video-text\"\n >\n {exam.studentTexts.introVideoText}\n </Text>\n )}\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 flex-none\"\n autoSave={false}\n />\n )}\n\n {/*\n * Com vídeo, a rolagem é daqui para baixo: o player e o botão ficam\n * parados e só os avisos correm entre eles. Rolando o modal inteiro o\n * vídeo saía cortado pelo topo.\n */}\n <div\n className={cn(\n 'flex flex-col gap-4',\n hasPinnedVideo && 'flex-1 min-h-0 overflow-y-auto'\n )}\n >\n <Text size=\"lg\" weight=\"bold\" className=\"text-text-950\">\n {exam.studentTexts.introHeading}\n </Text>\n {buildIntroWarnings(exam.studentTexts).map(\n ({ icon, title, description }) => (\n <div\n key={title}\n className={cn(\n CARD_CLASSES,\n 'flex flex-row gap-4 items-start p-4'\n )}\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 )}\n </div>\n\n <Button\n size=\"large\"\n variant=\"solid\"\n action=\"primary\"\n className={cn('w-full flex-none', 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 ? exam.title : <span className=\"sr-only\">{exam.title}</span>\n }\n size=\"lg\"\n footer={footer}\n // Com o vídeo preso, quem rola é o bloco de avisos, não o Modal.\n contentClassName={cn(\n 'flex flex-col gap-6',\n hasPinnedVideo && 'overflow-hidden'\n )}\n >\n {showStepper && (\n <Stepper steps={stepperSteps} currentStep={step} size=\"small\" />\n )}\n {renderStepContent()}\n </Modal>\n );\n};\n\nexport default EnemClassroomStartModal;\n"],"mappings":"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","names":[]}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
var _react = require('react');
|
|
3
3
|
var _jsxruntime = require('react/jsx-runtime');
|
|
4
4
|
var RichEditorCore = _react.lazy.call(void 0,
|
|
5
|
-
() => Promise.resolve().then(() => _interopRequireWildcard(require("./RichEditorCore-
|
|
5
|
+
() => Promise.resolve().then(() => _interopRequireWildcard(require("./RichEditorCore-NEIZKFKE.js"))).then((module) => ({
|
|
6
6
|
default: module.RichEditor
|
|
7
7
|
}))
|
|
8
8
|
);
|
|
@@ -93,4 +93,4 @@ function MissingDependenciesErrorFallback(error) {
|
|
|
93
93
|
|
|
94
94
|
|
|
95
95
|
exports.RichEditor = RichEditor;
|
|
96
|
-
//# sourceMappingURL=chunk-
|
|
96
|
+
//# sourceMappingURL=chunk-VF6QXUX3.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-VF6QXUX3.js","../src/components/RichEditor/RichEditor.tsx"],"names":[],"mappings":"AAAA;ACAA,8BAAqD;AAuGzC,+CAAA;AApGZ,IAAM,eAAA,EAAiB,yBAAA;AAAA,EAAK,CAAA,EAAA,GAC1B,4DAAA,CAAO,8BAAkB,GAAA,CAAE,IAAA,CAAK,CAAC,MAAA,EAAA,GAAA,CAAY;AAAA,IAC3C,OAAA,EAAS,MAAA,CAAO;AAAA,EAClB,CAAA,CAAE;AACJ,CAAA;AAwCA,IAAM,wBAAA,EAAN,MAAA,QAAsC,iBAGpC;AAAA,EACA,WAAA,CAAY,KAAA,EAA2B;AACrC,IAAA,KAAA,CAAM,KAAK,CAAA;AACX,IAAA,IAAA,CAAK,MAAA,EAAQ,EAAE,QAAA,EAAU,KAAA,EAAO,KAAA,EAAO,KAAK,CAAA;AAAA,EAC9C;AAAA,EAEA,OAAO,wBAAA,CAAyB,KAAA,EAAkC;AAChE,IAAA,OAAO,EAAE,QAAA,EAAU,IAAA,EAAM,MAAM,CAAA;AAAA,EACjC;AAAA,EAEA,MAAA,CAAA,EAAS;AACP,IAAA,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO;AAC3C,MAAA,OAAO,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAAA,IAC7C;AACA,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,QAAA;AAAA,EACpB;AACF,CAAA;AAEA,IAAM,oBAAA,EAAsB;AAAA,EAC1B,eAAA;AAAA,EACA,cAAA;AAAA,EACA,qBAAA;AAAA,EACA,6BAAA;AAAA,EACA,8BAAA;AAAA,EACA,yBAAA;AAAA,EACA,8BAAA;AAAA,EACA,6BAAA;AAAA,EACA,6BAAA;AAAA,EACA,+BAAA;AAAA,EACA,wBAAA;AAAA,EACA,+BAAA;AAAA,EACA,yBAAA;AAAA,EACA;AACF,CAAA;AAEA,SAAS,wBAAA,CAAyB,EAAE,MAAM,CAAA,EAA8B;AACtE,EAAA,MAAM,cAAA,EACJ,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,SAAS,EAAA,GAChC,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,6BAA6B,CAAA;AAEtD,EAAA,MAAM,eAAA,EAAiB,CAAA,SAAA,EAAY,mBAAA,CAAoB,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AACD,EAAA;AAG9C,EAAA;AAEI,oBAAA;AACZ,MAAA;AAAA,MAAA;AACW,QAAA;AACL,QAAA;AACG,QAAA;AACD,QAAA;AAEP,QAAA;AAAC,UAAA;AAAA,UAAA;AACe,YAAA;AACC,YAAA;AACF,YAAA;AACX,YAAA;AAAA,UAAA;AACJ,QAAA;AAAA,MAAA;AAEJ,IAAA;AAEE,oBAAA;AAAc,sBAAA;AAKD,sBAAA;AAMI,MAAA;AAEX,wBAAA;AAAa,0BAAA;AAGG,0BAAA;AAGlB,QAAA;AAEE,wBAAA;AAAa,0BAAA;AAGG,0BAAA;AAGlB,QAAA;AACF,MAAA;AAEJ,IAAA;AAEJ,EAAA;AAEJ;AAE2B;AAER,EAAA;AACE,oBAAA;AACA,oBAAA;AACA,oBAAA;AACjB,EAAA;AAEJ;AAEmD;AAEZ,EAAA;AAMvC;AAEkE;AACjB,EAAA;AACjD;AD/EmE;AACA;AACA;AACA","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-VF6QXUX3.js","sourcesContent":[null,"import { lazy, Suspense, Component, ReactNode } from 'react';\n\n// Lazy load the editor core to catch missing dependencies\nconst RichEditorCore = lazy(() =>\n import('./RichEditorCore').then((module) => ({\n default: module.RichEditor,\n }))\n);\n\ninterface RichEditorProps {\n readonly content?: string;\n readonly onChange?: (data: { json: object; html: string }) => void;\n readonly placeholder?: string;\n /**\n * Optional callback to generate LaTeX using AI\n * If provided, the AI generation feature will be enabled in the formula dialog\n * @param description - Natural language description of the formula\n * @returns Promise resolving to the LaTeX string\n */\n readonly onGenerateLatexWithAI?: (description: string) => Promise<string>;\n /**\n * Optional callback to upload an image file and get back its public URL.\n * If provided, the file upload tab is enabled in the image dialog; otherwise\n * images can still be inserted by URL.\n * @param file - The image file selected by the user\n * @returns Promise resolving to the public URL of the uploaded image\n */\n readonly onUploadImage?: (file: File) => Promise<string>;\n /**\n * Enables pasting an image straight from the clipboard (Ctrl+V), uploading it\n * through `onUploadImage` and inserting the resulting URL. Off by default and\n * ignored without `onUploadImage`, since there would be nowhere to put the\n * file — the editor schema rejects base64 sources.\n */\n readonly allowImagePaste?: boolean;\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n}\n\ninterface ErrorBoundaryProps {\n children: ReactNode;\n fallback: (error: Error) => ReactNode;\n}\n\nclass RichEditorErrorBoundary extends Component<\n ErrorBoundaryProps,\n ErrorBoundaryState\n> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { hasError: true, error };\n }\n\n render() {\n if (this.state.hasError && this.state.error) {\n return this.props.fallback(this.state.error);\n }\n return this.props.children;\n }\n}\n\nconst TIPTAP_DEPENDENCIES = [\n '@tiptap/react',\n '@tiptap/core',\n '@tiptap/starter-kit',\n '@tiptap/extension-underline',\n '@tiptap/extension-text-align',\n '@tiptap/extension-color',\n '@tiptap/extension-text-style',\n '@tiptap/extension-highlight',\n '@tiptap/extension-subscript',\n '@tiptap/extension-superscript',\n '@tiptap/extension-link',\n '@tiptap/extension-placeholder',\n '@tiptap/extension-image',\n '@tiptap/extension-table',\n];\n\nfunction MissingDependenciesError({ error }: { readonly error: Error }) {\n const isTiptapError =\n error.message.includes('@tiptap') ||\n error.message.includes(\"Cannot find module '@tiptap\");\n\n const installCommand = `yarn add ${TIPTAP_DEPENDENCIES.join(' ')}`;\n const npmCommand = `npm install ${TIPTAP_DEPENDENCIES.join(' ')}`;\n\n return (\n <div className=\"border border-red-200 rounded-xl overflow-hidden bg-red-50 p-6\">\n <div className=\"flex items-start gap-3\">\n <div className=\"shrink-0 w-10 h-10 bg-red-100 rounded-full flex items-center justify-center\">\n <svg\n className=\"w-5 h-5 text-red-600\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"\n />\n </svg>\n </div>\n <div className=\"flex-1\">\n <h3 className=\"text-lg font-semibold text-red-800 mb-2\">\n {isTiptapError\n ? 'Dependências do TipTap não encontradas'\n : 'Erro ao carregar o RichEditor'}\n </h3>\n <p className=\"text-red-700 text-sm mb-4\">\n {isTiptapError\n ? 'O componente RichEditor requer as dependências do TipTap para funcionar. Instale-as executando um dos comandos abaixo:'\n : error.message}\n </p>\n {isTiptapError && (\n <div className=\"space-y-3\">\n <div>\n <p className=\"text-xs text-red-600 font-medium mb-1\">\n Usando Yarn:\n </p>\n <code className=\"block bg-red-100 text-red-800 px-3 py-2 rounded text-xs font-mono overflow-x-auto\">\n {installCommand}\n </code>\n </div>\n <div>\n <p className=\"text-xs text-red-600 font-medium mb-1\">\n Usando NPM:\n </p>\n <code className=\"block bg-red-100 text-red-800 px-3 py-2 rounded text-xs font-mono overflow-x-auto\">\n {npmCommand}\n </code>\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n\nfunction LoadingFallback() {\n return (\n <div className=\"border border-border-200 rounded-xl overflow-hidden bg-background-0 animate-pulse\">\n <div className=\"h-10 bg-background-100 border-b border-border-200\" />\n <div className=\"h-32 bg-background-50\" />\n <div className=\"h-8 bg-background-100 border-t border-border-200\" />\n </div>\n );\n}\n\nexport function RichEditor(props: RichEditorProps) {\n return (\n <RichEditorErrorBoundary fallback={MissingDependenciesErrorFallback}>\n <Suspense fallback={<LoadingFallback />}>\n <RichEditorCore {...props} />\n </Suspense>\n </RichEditorErrorBoundary>\n );\n}\n\nfunction MissingDependenciesErrorFallback(error: Readonly<Error>) {\n return <MissingDependenciesError error={error} />;\n}\n"]}
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
} from "./chunk-53ICLDGS.mjs";
|
|
7
7
|
import {
|
|
8
8
|
useQuizStore
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-MOSP7FR5.mjs";
|
|
10
10
|
|
|
11
11
|
// src/components/Quiz/TeacherFeedbackSection.tsx
|
|
12
12
|
import { forwardRef } from "react";
|
|
@@ -51,4 +51,4 @@ TeacherFeedbackSection.displayName = "TeacherFeedbackSection";
|
|
|
51
51
|
export {
|
|
52
52
|
TeacherFeedbackSection
|
|
53
53
|
};
|
|
54
|
-
//# sourceMappingURL=chunk-
|
|
54
|
+
//# sourceMappingURL=chunk-WY7V5UJN.mjs.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunk726PIA5Mjs = require('./chunk-726PIA5M.js');
|
|
4
4
|
|
|
5
5
|
// src/components/ActivityCreate/ActivityCreate.utils.ts
|
|
6
6
|
function extractLessonsFromResponse(responseData) {
|
|
@@ -29,7 +29,7 @@ function extractLessonsFromResponse(responseData) {
|
|
|
29
29
|
}
|
|
30
30
|
return [];
|
|
31
31
|
}
|
|
32
|
-
var VALID_QUESTION_TYPES = new Set(Object.values(
|
|
32
|
+
var VALID_QUESTION_TYPES = new Set(Object.values(_chunk726PIA5Mjs.QUESTION_TYPE));
|
|
33
33
|
var isValidQuestionType = (type) => {
|
|
34
34
|
return VALID_QUESTION_TYPES.has(type);
|
|
35
35
|
};
|
|
@@ -437,4 +437,4 @@ function shouldAddActivityToLessonDraft(activityDraftId, recommendedLessonDraftI
|
|
|
437
437
|
|
|
438
438
|
|
|
439
439
|
exports.extractLessonsFromResponse = extractLessonsFromResponse; exports.convertFiltersToBackendFormat = convertFiltersToBackendFormat; exports.convertBackendFiltersToActivityFiltersData = convertBackendFiltersToActivityFiltersData; exports.getSubjectName = getSubjectName; exports.getActivityTypeLabel = getActivityTypeLabel; exports.generateTitle = generateTitle; exports.generateMultiSubjectTitle = generateMultiSubjectTitle; exports.resolveActivitySubjectId = resolveActivitySubjectId; exports.getTypeFromUrl = getTypeFromUrl; exports.getTypeFromUrlString = getTypeFromUrlString; exports.convertQuestionToPreview = convertQuestionToPreview; exports.buildISODateTime = buildISODateTime; exports.buildFinalDateTime = buildFinalDateTime; exports.buildSendActivityPayload = buildSendActivityPayload; exports.hasQuestionsChanged = hasQuestionsChanged; exports.buildUrlWithParams = buildUrlWithParams; exports.shouldSkipAutoSave = shouldSkipAutoSave; exports.extractDraftFromResponse = extractDraftFromResponse; exports.getRecommendedClassEndpoint = getRecommendedClassEndpoint; exports.buildActivityDraftIds = buildActivityDraftIds; exports.buildLessonIds = buildLessonIds; exports.buildLessonDraftUpdatePayload = buildLessonDraftUpdatePayload; exports.formatNavigatePath = formatNavigatePath; exports.extractActivityIdFromResponse = extractActivityIdFromResponse; exports.buildSendToStudentsPayload = buildSendToStudentsPayload; exports.validateSendActivityResponses = validateSendActivityResponses; exports.formatErrorMessage = formatErrorMessage; exports.buildActivityDataFromDraft = buildActivityDataFromDraft; exports.buildPartialActivityUpdate = buildPartialActivityUpdate; exports.buildPayloadWithTypeOverride = buildPayloadWithTypeOverride; exports.shouldUpdateUrl = shouldUpdateUrl; exports.resolvePreFilters = resolvePreFilters; exports.getInitialFiltersData = getInitialFiltersData; exports.shouldTriggerSaveOnReorder = shouldTriggerSaveOnReorder; exports.hasRequiredSubjectIds = hasRequiredSubjectIds; exports.shouldSaveDraftBeforeAddingToLesson = shouldSaveDraftBeforeAddingToLesson; exports.shouldUseCustomAddActivityCallback = shouldUseCustomAddActivityCallback; exports.shouldAddActivityToLessonDraft = shouldAddActivityToLessonDraft;
|
|
440
|
-
//# sourceMappingURL=chunk-
|
|
440
|
+
//# sourceMappingURL=chunk-XQAYZBLL.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-OCKO7T7L.js","../src/components/ActivityCreate/ActivityCreate.utils.ts"],"names":[],"mappings":"AAAA;AACE;AACF,sDAA4B;AAC5B;AACA;AC8CO,SAAS,0BAAA,CACd,YAAA,EACU;AACV,EAAA,MAAM,MAAA,EAAQ,YAAA,CAAa,KAAA;AAG3B,EAAA,GAAA,iBAAI,KAAA,2BAAO,kBAAA,GAAmB,KAAA,CAAM,eAAA,CAAgB,OAAA,EAAS,CAAA,EAAG;AAC9D,IAAA,OAAO,KAAA,CAAM,eAAA;AAAA,EACf;AAGA,EAAA,GAAA,CAAI,YAAA,CAAa,gBAAA,GAAmB,YAAA,CAAa,eAAA,CAAgB,OAAA,EAAS,CAAA,EAAG;AAC3E,IAAA,OAAO,YAAA,CAAa,eAAA;AAAA,EACtB;AAGA,EAAA,GAAA,iBAAI,KAAA,6BAAO,UAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,OAAA,EAAS,CAAA,EAAG;AAC9C,IAAA,OAAO,KAAA,CAAM,OAAA,CACV,GAAA,CAAI,CAAC,IAAA,EAAA,GAAS;AACb,MAAA,GAAA,CACE,KAAA,GACA,OAAO,KAAA,IAAS,SAAA,GAChB,SAAA,GAAY,KAAA,GACZ,IAAA,CAAK,MAAA,EACL;AACA,QAAA,OAAO,IAAA,CAAK,MAAA;AAAA,MACd;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,MAAA,EAAA,GAA6B,OAAA,IAAW,IAAI,CAAA;AAAA,EACzD;AAGA,EAAA,GAAA,CAAI,YAAA,CAAa,QAAA,GAAW,YAAA,CAAa,OAAA,CAAQ,OAAA,EAAS,CAAA,EAAG;AAC3D,IAAA,OAAO,YAAA,CAAa,OAAA,CACjB,GAAA,CAAI,CAAC,IAAA,EAAA,GAAS;AACb,MAAA,GAAA,CACE,KAAA,GACA,OAAO,KAAA,IAAS,SAAA,GAChB,SAAA,GAAY,KAAA,GACZ,IAAA,CAAK,MAAA,EACL;AACA,QAAA,OAAO,IAAA,CAAK,MAAA;AAAA,MACd;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,MAAA,EAAA,GAA6B,OAAA,IAAW,IAAI,CAAA;AAAA,EACzD;AAEA,EAAA,OAAO,CAAC,CAAA;AACV;AAKA,IAAM,qBAAA,EAAuB,IAAI,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,8BAAa,CAAC,CAAA;AAOjE,IAAM,oBAAA,EAAsB,CAAC,IAAA,EAAA,GAAwC;AACnE,EAAA,OAAO,oBAAA,CAAqB,GAAA,CAAI,IAAqB,CAAA;AACvD,CAAA;AAyBO,SAAS,6BAAA,CACd,OAAA,EACsB;AACtB,EAAA,GAAA,CAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO;AAAA,MACL,aAAA,EAAe,CAAC,CAAA;AAAA,MAChB,aAAA,EAAe,CAAC,CAAA;AAAA,MAChB,QAAA,EAAU,CAAC,CAAA;AAAA,MACX,MAAA,EAAQ,CAAC,CAAA;AAAA,MACT,SAAA,EAAW,CAAC,CAAA;AAAA,MACZ,QAAA,EAAU,CAAC;AAAA,IACb,CAAA;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,aAAA,EAAe,OAAA,CAAQ,KAAA;AAAA,IACvB,aAAA,EAAe,OAAA,CAAQ,OAAA;AAAA,IACvB,QAAA,EAAU,OAAA,CAAQ,UAAA;AAAA,IAClB,MAAA,EAAQ,OAAA,CAAQ,QAAA;AAAA,IAChB,SAAA,EAAW,OAAA,CAAQ,WAAA;AAAA,IACnB,QAAA,EAAU,OAAA,CAAQ;AAAA,EACpB,CAAA;AACF;AAiBO,SAAS,0CAAA,CACd,cAAA,EAC4B;AAC5B,EAAA,GAAA,CAAI,CAAC,cAAA,EAAgB;AACnB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAA,CAAQ,cAAA,CAAe,cAAA,GAAiB,CAAC,CAAA,CAAA,CAAG,MAAA,CAAO,mBAAmB,CAAA;AAAA,IACtE,OAAA,EAAS,cAAA,CAAe,cAAA,GAAiB,CAAC,CAAA;AAAA,IAC1C,UAAA,EAAY,cAAA,CAAe,SAAA,GAAY,CAAC,CAAA;AAAA,IACxC,QAAA,EAAU,cAAA,CAAe,OAAA,GAAU,CAAC,CAAA;AAAA,IACpC,WAAA,EAAa,cAAA,CAAe,UAAA,GAAa,CAAC,CAAA;AAAA,IAC1C,UAAA,EAAY,cAAA,CAAe,SAAA,GAAY,CAAC,CAAA;AAAA,IACxC,OAAA,EAAS,CAAC;AAAA,EACZ,CAAA;AACF;AAiBO,SAAS,cAAA,CACd,SAAA,EACA,cAAA,EACe;AACf,EAAA,GAAA,CAAI,CAAC,UAAA,GAAa,CAAC,cAAA,CAAe,MAAA,EAAQ;AACxC,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,QAAA,EAAU,cAAA,CAAe,IAAA,CAAK,CAAC,IAAA,EAAA,GAAS,IAAA,CAAK,GAAA,IAAO,SAAS,CAAA;AACnE,EAAA,uBAAO,OAAA,6BAAS,OAAA,GAAQ,IAAA;AAC1B;AAcO,SAAS,oBAAA,CAAqB,IAAA,EAA4B;AAC/D,EAAA,MAAM,mBAAA,EAAmD;AAAA,IACvD,CAAA,yBAAsB,CAAA,EAAG,UAAA;AAAA,IACzB,CAAA,qBAAoB,CAAA,EAAG,QAAA;AAAA,IACvB,CAAA,2BAAuB,CAAA,EAAG;AAAA,EAC5B,CAAA;AACA,EAAA,OAAO,kBAAA,CAAmB,IAAI,CAAA;AAChC;AAkBO,SAAS,aAAA,CACd,IAAA,EACA,SAAA,EACA,cAAA,EACQ;AACR,EAAA,MAAM,UAAA,EAAY,oBAAA,CAAqB,IAAI,CAAA;AAC3C,EAAA,MAAM,YAAA,EAAc,cAAA,CAAe,SAAA,EAAW,cAAc,CAAA;AAC5D,EAAA,OAAO,YAAA,EAAc,CAAA,EAAA;AACvB;AAegB;AACJ,EAAA;AACZ;AAsBgB;AAIV,EAAA;AACK,IAAA;AACT,EAAA;AAEmB,EAAA;AACrB;AAc+B;AACf,EAAA;AACZ,IAAA;AACS,MAAA;AACT,IAAA;AACS,MAAA;AACT,IAAA;AACS,MAAA;AACX,EAAA;AACF;AAcgB;AACA,EAAA;AACP,IAAA;AACH,MAAA;AACG,IAAA;AACH,MAAA;AACF,IAAA;AACE,MAAA;AACJ,EAAA;AACF;AAqBgB;AAEZ,EAAA;AAEmB,IAAA;AACC,IAAA;AACK,IAAA;AAEpB,EAAA;AAEA,EAAA;AACQ,IAAA;AACO,IAAA;AACpB,IAAA;AACe,IAAA;AACA,IAAA;AACD,IAAA;AACK,IAAA;AAEK,MAAA;AAC+C,QAAA;AACrD,UAAA;AACI,UAAA;AACD,UAAA;AACb,QAAA;AACF,MAAA;AACkB,MAAA;AAIpB,IAAA;AACD,IAAA;AACL,EAAA;AACF;AASgB;AACP,EAAA;AACT;AASgB;AASK,EAAA;AACV,IAAA;AACT,EAAA;AACO,EAAA;AACT;AAEgB;AAUZ,EAAA;AAIK,EAAA;AACW,IAAA;AAAA;AAAA;AAAA;AAIE,IAAA;AAClB,IAAA;AACkB,IAAA;AACZ,IAAA;AACQ,IAAA;AACH,IAAA;AACA,IAAA;AACQ,IAAA;AACnB,IAAA;AAAA;AAAA;AAGkB,IAAA;AACpB,EAAA;AACF;AASgB;AAIK,EAAA;AACE,EAAA;AACC,EAAA;AACxB;AAsCgB;AACR,EAAA;AACJ,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACE,EAAA;AAEkB,EAAA;AACA,EAAA;AACF,EAAA;AAEhB,EAAA;AACY,IAAA;AAChB,EAAA;AACI,EAAA;AACY,IAAA;AAChB,EAAA;AACoB,EAAA;AACJ,IAAA;AAChB,EAAA;AACkB,EAAA;AACF,IAAA;AAChB,EAAA;AAEsB,EAAA;AACxB;AAEgB;AACR,EAAA;AACJ,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACE,EAAA;AAEA,EAAA;AACK,IAAA;AACT,EAAA;AACI,EAAA;AACK,IAAA;AACT,EAAA;AACqB,EAAA;AACZ,IAAA;AACT,EAAA;AACO,EAAA;AACT;AAKS;AAGU,EAAA;AACK,IAAA;AACtB,EAAA;AACe,EAAA;AAEX,IAAA;AAIJ,EAAA;AACO,EAAA;AACT;AAKS;AACO,EAAA;AACZ,IAAA;AACc,IAAA;AACI,IAAA;AACJ,IAAA;AACI,IAAA;AAGnB,EAAA;AACH;AAUgB;AAGO,EAAA;AACL,IAAA;AACE,IAAA;AAClB,EAAA;AAEmB,EAAA;AAEE,EAAA;AACnB,IAAA;AACU,IAAA;AACR,MAAA;AACF,IAAA;AACF,EAAA;AAEO,EAAA;AACT;AASgB;AAKZ,EAAA;AAGmB,EAAA;AACvB;AAqCgB;AAIK,EAAA;AACZ,EAAA;AACc,IAAA;AACA,MAAA;AACL,MAAA;AACZ,IAAA;AACF,IAAA;AACmB,MAAA;AACP,MAAA;AACZ,IAAA;AACF,EAAA;AACF;AASE;AAGgB,EAAA;AACA,IAAA;AACA,IAAA;AACN,EAAA;AAEZ;AASgB;AAWP,EAAA;AACe,IAAA;AACb,IAAA;AACI,IAAA;AACF,IAAA;AACE,IAAA;AACO,IAAA;AACF,MAAA;AACd,MAAA;AACF,IAAA;AACF,EAAA;AACF;AAQgB;AACF,EAAA;AACd;AAmBgB;AAGK,EAAA;AACF,EAAA;AACC,IAAA;AAClB,EAAA;AACO,EAAA;AACT;AASgB;AAIP,EAAA;AACL,IAAA;AACA,IAAA;AACF,EAAA;AACF;AASgB;AAIO,EAAA;AACH,IAAA;AAClB,EAAA;AACmB,EAAA;AACD,IAAA;AAClB,EAAA;AACF;AASgB;AAIP,EAAA;AACT;AAqBgB;AAYP,EAAA;AACK,IAAA;AACE,IAAA;AACC,IAAA;AACI,IAAA;AACF,IAAA;AACf,IAAA;AACiB,IAAA;AACnB,EAAA;AACF;AAUgB;AAaP,EAAA;AACK,IAAA;AACE,IAAA;AACC,IAAA;AACI,IAAA;AACR,IAAA;AACT,IAAA;AACiB,IAAA;AACnB,EAAA;AACF;AAYgB;AASR,EAAA;AACA,EAAA;AAIJ,EAAA;AAIK,EAAA;AACF,IAAA;AACG,IAAA;AACN,IAAA;AACF,EAAA;AACF;AAWgB;AAMM,EAAA;AACX,IAAA;AACT,EAAA;AACgB,EAAA;AAEb,EAAA;AAKL;AAgBgB;AAGG,EAAA;AACR,IAAA;AACT,EAAA;AAES,EAAA;AAIW,IAAA;AACpB,EAAA;AACO,EAAA;AACT;AASgB;AAIO,EAAA;AACZ,IAAA;AACT,EAAA;AACI,EAAA;AACK,IAAA;AACT,EAAA;AACO,EAAA;AACT;AAkBgB;AAGR,EAAA;AACJ,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACE,EAAA;AACkB,EAAA;AAEpB,EAAA;AAKJ;AAQgB;AAGO,EAAA;AACvB;AASgB;AAIP,EAAA;AACT;AASgB;AAIJ,EAAA;AACZ;AASgB;AAIJ,EAAA;AACZ;ADxtBwB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-OCKO7T7L.js","sourcesContent":[null,"import type {\n ActivityFiltersData,\n PreviewQuestion,\n QuestionActivity as Question,\n SendActivityFormData,\n} from '../..';\nimport type { Lesson } from '../../types/lessons';\nimport { ActivityMode, ActivitySubtype } from '../SendActivityModal/types';\nimport { QUESTION_TYPE } from '../Quiz/useQuizStore';\nimport type {\n BackendFiltersFormat,\n ActivityDraftResponse,\n} from './ActivityCreate.types';\nimport { ActivityType } from './ActivityCreate.types';\nimport type { CreateActivityPayload } from '../../types/sendActivity';\n\n/**\n * Response format for recommended class lesson data\n */\ninterface LessonResponseData {\n draft?: {\n selectedLessons?: Lesson[];\n lessons?: Array<{\n lessonId: string;\n sequence: number;\n lesson?: Lesson;\n }>;\n };\n selectedLessons?: Lesson[];\n lessons?: Array<{\n lessonId: string;\n sequence: number;\n lesson?: Lesson;\n }>;\n}\n\n/**\n * Extract lessons from recommended class API response\n * Handles multiple response formats for backward compatibility\n *\n * @param responseData - Response data from recommended class API\n * @returns Array of Lesson objects\n *\n * @example\n * ```ts\n * const lessons = extractLessonsFromResponse({\n * draft: { selectedLessons: [...] }\n * });\n * ```\n */\nexport function extractLessonsFromResponse(\n responseData: LessonResponseData\n): Lesson[] {\n const draft = responseData.draft;\n\n // Try draft.selectedLessons first\n if (draft?.selectedLessons && draft.selectedLessons.length > 0) {\n return draft.selectedLessons;\n }\n\n // Try responseData.selectedLessons\n if (responseData.selectedLessons && responseData.selectedLessons.length > 0) {\n return responseData.selectedLessons;\n }\n\n // Try draft.lessons (extract lesson property)\n if (draft?.lessons && draft.lessons.length > 0) {\n return draft.lessons\n .map((item) => {\n if (\n item &&\n typeof item === 'object' &&\n 'lesson' in item &&\n item.lesson\n ) {\n return item.lesson;\n }\n return null;\n })\n .filter((lesson): lesson is Lesson => lesson !== null);\n }\n\n // Try responseData.lessons (extract lesson property)\n if (responseData.lessons && responseData.lessons.length > 0) {\n return responseData.lessons\n .map((item) => {\n if (\n item &&\n typeof item === 'object' &&\n 'lesson' in item &&\n item.lesson\n ) {\n return item.lesson;\n }\n return null;\n })\n .filter((lesson): lesson is Lesson => lesson !== null);\n }\n\n return [];\n}\n\n/**\n * Set of valid QUESTION_TYPE enum values for runtime validation\n */\nconst VALID_QUESTION_TYPES = new Set(Object.values(QUESTION_TYPE));\n\n/**\n * Type guard to validate if a string is a valid QUESTION_TYPE\n * @param type - String to validate\n * @returns True if type is a valid QUESTION_TYPE enum value\n */\nconst isValidQuestionType = (type: string): type is QUESTION_TYPE => {\n return VALID_QUESTION_TYPES.has(type as QUESTION_TYPE);\n};\n\n/**\n * Knowledge area interface for subject lookup\n */\nexport interface KnowledgeArea {\n id: string;\n name: string;\n}\n\n/**\n * Convert ActivityFiltersData to backend format\n *\n * @param filters - ActivityFiltersData to convert, can be null\n * @returns BackendFiltersFormat object with converted filter data\n *\n * @example\n * ```ts\n * const backendFilters = convertFiltersToBackendFormat({\n * types: ['ALTERNATIVA'],\n * subjectIds: ['math'],\n * // ...\n * });\n * ```\n */\nexport function convertFiltersToBackendFormat(\n filters: ActivityFiltersData | null\n): BackendFiltersFormat {\n if (!filters) {\n return {\n questionTypes: [],\n questionBanks: [],\n subjects: [],\n topics: [],\n subtopics: [],\n contents: [],\n };\n }\n\n return {\n questionTypes: filters.types,\n questionBanks: filters.bankIds,\n subjects: filters.subjectIds,\n topics: filters.topicIds,\n subtopics: filters.subtopicIds,\n contents: filters.contentIds,\n };\n}\n\n/**\n * Convert backend filters format to ActivityFiltersData\n *\n * @param backendFilters - BackendFiltersFormat to convert, can be null\n * @returns ActivityFiltersData object with converted filter data, or null if input is null\n *\n * @example\n * ```ts\n * const activityFilters = convertBackendFiltersToActivityFiltersData({\n * questionTypes: ['ALTERNATIVA'],\n * subjects: ['math'],\n * // ...\n * });\n * ```\n */\nexport function convertBackendFiltersToActivityFiltersData(\n backendFilters: BackendFiltersFormat | null\n): ActivityFiltersData | null {\n if (!backendFilters) {\n return null;\n }\n\n return {\n types: (backendFilters.questionTypes || []).filter(isValidQuestionType),\n bankIds: backendFilters.questionBanks || [],\n subjectIds: backendFilters.subjects || [],\n topicIds: backendFilters.topics || [],\n subtopicIds: backendFilters.subtopics || [],\n contentIds: backendFilters.contents || [],\n yearIds: [],\n };\n}\n\n/**\n * Get subject name from subjectId by searching in knowledge areas\n *\n * @param subjectId - The subject ID to look up\n * @param knowledgeAreas - Array of knowledge areas to search in\n * @returns The subject name if found, null otherwise\n *\n * @example\n * ```ts\n * const subjectName = getSubjectName('math', [\n * { id: 'math', name: 'Matemática' }\n * ]);\n * // Returns: 'Matemática'\n * ```\n */\nexport function getSubjectName(\n subjectId: string | null,\n knowledgeAreas: KnowledgeArea[]\n): string | null {\n if (!subjectId || !knowledgeAreas.length) {\n return null;\n }\n const subject = knowledgeAreas.find((area) => area.id === subjectId);\n return subject?.name || null;\n}\n\n/**\n * Get activity type label using object literal mapping\n *\n * @param type - Activity type (ActivityType enum)\n * @returns Label string for the activity type\n *\n * @example\n * ```ts\n * const label = getActivityTypeLabel(ActivityType.RASCUNHO);\n * // Returns: 'Rascunho'\n * ```\n */\nexport function getActivityTypeLabel(type: ActivityType): string {\n const activityTypeLabels: Record<ActivityType, string> = {\n [ActivityType.RASCUNHO]: 'Rascunho',\n [ActivityType.MODELO]: 'Modelo',\n [ActivityType.ATIVIDADE]: 'Atividade',\n };\n return activityTypeLabels[type];\n}\n\n/**\n * Generate activity title based on type and subject\n *\n * @param type - Activity type (ActivityType enum)\n * @param subjectId - Subject ID to get name from\n * @param knowledgeAreas - Array of knowledge areas for subject lookup\n * @returns Generated title string\n *\n * @example\n * ```ts\n * const title = generateTitle(ActivityType.RASCUNHO, 'math', [\n * { id: 'math', name: 'Matemática' }\n * ]);\n * // Returns: 'Rascunho - Matemática'\n * ```\n */\nexport function generateTitle(\n type: ActivityType,\n subjectId: string | null,\n knowledgeAreas: KnowledgeArea[]\n): string {\n const typeLabel = getActivityTypeLabel(type);\n const subjectName = getSubjectName(subjectId, knowledgeAreas);\n return subjectName ? `${typeLabel} - ${subjectName}` : typeLabel;\n}\n\n/**\n * Builds a draft title when the selection spans several subjects and no single\n * subject name applies.\n *\n * @param type - Activity type used for the label prefix\n * @returns Title string for a multi-subject draft\n *\n * @example\n * ```ts\n * generateMultiSubjectTitle(ActivityType.RASCUNHO);\n * // Returns: 'Rascunho - Diversos componentes curriculares'\n * ```\n */\nexport function generateMultiSubjectTitle(type: ActivityType): string {\n return `${getActivityTypeLabel(type)} - Diversos componentes curriculares`;\n}\n\n/**\n * Resolves the legacy single `subjectId` to send with an activity.\n *\n * The backend derives an activity's real subjects from the subjects of its\n * questions, so this field is only the legacy \"primary subject\" fallback and is\n * optional. It is therefore sent only when it is unambiguous: the subject the\n * activity already carries, or the one selected subject when exactly one is\n * filtered. With several filtered, electing one of them would be arbitrary —\n * the junction table already has the right answer.\n *\n * @param activitySubjectId - Subject already stored on the activity/draft\n * @param subjectIds - Subjects currently selected in the filters\n * @returns The subject id to send, or null to omit it\n *\n * @example\n * ```ts\n * resolveActivitySubjectId(undefined, ['bio']); // 'bio'\n * resolveActivitySubjectId(undefined, ['bio', 'fis']); // null\n * ```\n */\nexport function resolveActivitySubjectId(\n activitySubjectId: string | undefined,\n subjectIds: string[] | undefined\n): string | null {\n if (activitySubjectId) {\n return activitySubjectId;\n }\n\n return subjectIds?.length === 1 ? subjectIds[0] : null;\n}\n\n/**\n * Converte ActivityType para o formato usado na URL\n *\n * @param type - ActivityType enum value\n * @returns String representation for URL (rascunho or modelo)\n *\n * @example\n * ```ts\n * const urlType = getTypeFromUrl(ActivityType.RASCUNHO);\n * // Returns: 'rascunho'\n * ```\n */\nexport function getTypeFromUrl(type: ActivityType): string {\n switch (type) {\n case ActivityType.RASCUNHO:\n return 'rascunho';\n case ActivityType.MODELO:\n return 'modelo';\n default:\n return 'rascunho';\n }\n}\n\n/**\n * Converte string da URL para ActivityType\n *\n * @param type - String from URL (rascunho or modelo)\n * @returns ActivityType enum value\n *\n * @example\n * ```ts\n * const activityType = getTypeFromUrlString('rascunho');\n * // Returns: ActivityType.RASCUNHO\n * ```\n */\nexport function getTypeFromUrlString(type: string | undefined): ActivityType {\n switch (type) {\n case 'rascunho':\n return ActivityType.RASCUNHO;\n case 'modelo':\n return ActivityType.MODELO;\n default:\n return ActivityType.RASCUNHO;\n }\n}\n\n/**\n * Convert Question to PreviewQuestion format\n *\n * @param question - Question object to convert\n * @returns PreviewQuestion object with converted data\n *\n * @example\n * ```ts\n * const previewQuestion = convertQuestionToPreview({\n * id: 'q1',\n * statement: 'Test question',\n * questionType: 'ALTERNATIVA',\n * options: [{ id: 'opt1', option: 'Option 1' }],\n * knowledgeMatrix: [{\n * subject: { name: 'Math', color: '#000', icon: 'Math' }\n * }]\n * });\n * ```\n */\nexport function convertQuestionToPreview(question: Question): PreviewQuestion {\n const subjectInfo =\n question.knowledgeMatrix && question.knowledgeMatrix.length > 0\n ? {\n subjectName: question.knowledgeMatrix[0].subject?.name || undefined,\n subjectColor: question.knowledgeMatrix[0].subject?.color || undefined,\n iconName: question.knowledgeMatrix[0].subject?.icon || undefined,\n }\n : {};\n\n return {\n id: question.id,\n statement: question.statement,\n solutionExplanation: question.solutionExplanation ?? null,\n bank: question.questionBankYear?.questionBank?.name || undefined,\n year: question.questionBankYear?.year || undefined,\n questionType: question.questionType,\n question: question.options\n ? {\n options: question.options.map(\n (opt: { id: string; option: string; isCorrect?: boolean }) => ({\n id: opt.id,\n option: opt.option,\n isCorrect: opt.isCorrect,\n })\n ),\n correctOptionIds: question.options\n .filter((opt: { isCorrect?: boolean }) => opt.isCorrect === true)\n .map((opt: { id: string }) => opt.id),\n }\n : undefined,\n ...subjectInfo,\n };\n}\n\n/**\n * Build ISO date time string from date and time parts\n *\n * @param date - Date string in YYYY-MM-DD format\n * @param time - Time string in HH:mm format\n * @returns ISO date time string\n */\nexport function buildISODateTime(date: string, time: string): string {\n return new Date(`${date}T${time}`).toISOString();\n}\n\n/**\n * Build final date time based on exam mode\n *\n * @param formData - Form data with finalDate and finalTime\n * @param isExamMode - Whether exam mode is enabled\n * @returns ISO date time string or null for exam mode\n */\nexport function buildFinalDateTime(\n finalDate: string,\n finalTime: string,\n isExamMode: boolean,\n isInPersonExam = false\n): string | null {\n // A prova digital é aplicada num dia só: não tem prazo final a gravar. A\n // impressa tem — o aluno responde em casa ao longo de um período, e é esse\n // prazo que fecha o envio das fotos e alimenta o \"Andamento da atividade\".\n if (isExamMode && !isInPersonExam) {\n return null;\n }\n return buildISODateTime(finalDate, finalTime);\n}\n\nexport function buildSendActivityPayload(\n formData: SendActivityFormData,\n subjectId: string | null,\n questionIds: string[],\n startDateTime: string,\n finalDateTime: string | null,\n activityType?: 'ATIVIDADE' | 'PROVA',\n essayThemeId?: string | null\n): CreateActivityPayload {\n const isDigital =\n formData.subtype === ActivitySubtype.PROVA\n ? formData.mode !== ActivityMode.PRESENCIAL\n : true;\n\n return {\n title: formData.title,\n // The legacy primary subject is `.optional()` on the backend, which accepts\n // an absent key but rejects an explicit null — so it is omitted when the\n // selection spans several subjects and none is authoritative.\n ...(subjectId ? { subjectId } : {}),\n questionIds,\n subtype: formData.subtype,\n type: activityType,\n notification: formData.notification || '',\n startDate: startDateTime,\n finalDate: finalDateTime,\n canRetry: formData.canRetry,\n isDigital,\n // The backend rejects a theme on a digital activity, so it only rides along\n // on the in-person booklet that actually carries the essay sheet.\n ...(!isDigital && essayThemeId ? { essayThemeId } : {}),\n };\n}\n\n/**\n * Check if questions have changed compared to last saved state\n *\n * @param currentQuestions - Current questions array\n * @param lastSavedQuestions - Last saved questions array\n * @returns True if questions have changed\n */\nexport function hasQuestionsChanged(\n currentQuestions: Array<{ id: string }>,\n lastSavedQuestions: Array<{ id: string }>\n): boolean {\n const currentIds = currentQuestions.map((q) => q.id).join(',');\n const lastSavedIds = lastSavedQuestions.map((q) => q.id).join(',');\n return currentIds !== lastSavedIds;\n}\n\n/**\n * Parameters for shouldSkipAutoSave check\n */\ninterface AutoSaveCheckParams {\n loadingInitialQuestions: boolean;\n questionsCount: number;\n hasFirstSaveBeenDone: boolean;\n appliedFilters: ActivityFiltersData | null;\n}\n\n/**\n * Check if auto-save should be skipped based on current state\n *\n * @param params - Parameters to check\n * @returns True if auto-save should be skipped\n */\n/**\n * Parameters for building URL with preserved query params\n */\ninterface BuildUrlParams {\n newType: string;\n newId: string;\n basePath: string;\n recommendedLessonDraftId?: string;\n recommendedLessonId?: string;\n classTypeParam?: string;\n onFinishPath?: string;\n}\n\n/**\n * Build URL preserving existing query parameters\n * Used when updating URL after saving draft to maintain context for navigation\n *\n * @param params - URL building parameters\n * @returns Complete URL string with query parameters\n */\nexport function buildUrlWithParams(params: BuildUrlParams): string {\n const {\n newType,\n newId,\n basePath,\n recommendedLessonDraftId,\n recommendedLessonId,\n classTypeParam,\n onFinishPath,\n } = params;\n\n const urlParams = new URLSearchParams();\n urlParams.set('type', newType);\n urlParams.set('id', newId);\n\n if (recommendedLessonDraftId) {\n urlParams.set('recommended-class-draft', recommendedLessonDraftId);\n }\n if (recommendedLessonId) {\n urlParams.set('recommended-class', recommendedLessonId);\n }\n if (classTypeParam) {\n urlParams.set('classType', classTypeParam);\n }\n if (onFinishPath) {\n urlParams.set('onFinish', onFinishPath);\n }\n\n return `${basePath}?${urlParams.toString()}`;\n}\n\nexport function shouldSkipAutoSave(params: AutoSaveCheckParams): boolean {\n const {\n loadingInitialQuestions,\n questionsCount,\n hasFirstSaveBeenDone,\n appliedFilters,\n } = params;\n\n if (loadingInitialQuestions) {\n return true;\n }\n if (questionsCount === 0 && !hasFirstSaveBeenDone) {\n return true;\n }\n if (!appliedFilters) {\n return true;\n }\n return false;\n}\n\n/**\n * Try to extract draft from standard response format\n */\nfunction tryExtractDraftFromStandardFormat(\n responseData: ActivityDraftResponse\n): ActivityDraftResponse['data']['draft'] | undefined {\n if (responseData.data?.draft) {\n return responseData.data.draft;\n }\n if ('draft' in responseData && typeof responseData === 'object') {\n return (\n responseData as unknown as {\n draft: ActivityDraftResponse['data']['draft'];\n }\n )?.draft;\n }\n return undefined;\n}\n\n/**\n * Log error details for draft extraction failure\n */\nfunction logDraftExtractionError(response: { data: ActivityDraftResponse }) {\n console.error('❌ Resposta inválida da API ao criar rascunho:', {\n response,\n responseData: response?.data,\n responseDataData: response?.data?.data,\n responseKeys: response?.data ? Object.keys(response.data) : [],\n responseDataKeys: response?.data?.data\n ? Object.keys(response.data.data)\n : [],\n });\n}\n\n/**\n * Extract draft from API response\n * Handles multiple response formats for backward compatibility\n *\n * @param response - API response object\n * @returns Extracted draft object\n * @throws Error if draft cannot be extracted\n */\nexport function extractDraftFromResponse(response: {\n data: ActivityDraftResponse;\n}): ActivityDraftResponse['data']['draft'] {\n if (!response?.data) {\n console.error('❌ Resposta vazia da API ao criar rascunho:', response);\n throw new Error('Invalid response: empty response from API');\n }\n\n const savedDraft = tryExtractDraftFromStandardFormat(response.data);\n\n if (!savedDraft?.id) {\n logDraftExtractionError(response);\n throw new Error(\n 'Invalid response: draft data is missing. Expected structure: response.data.data.draft'\n );\n }\n\n return savedDraft;\n}\n\n/**\n * Get the recommended class endpoint URL based on class type\n *\n * @param lessonDraftId - The lesson draft ID\n * @param classTypeParam - The class type parameter (modelo or undefined)\n * @returns The endpoint URL for the recommended class\n */\nexport function getRecommendedClassEndpoint(\n lessonDraftId: string,\n classTypeParam?: string\n): string {\n const baseUrl =\n classTypeParam === 'modelo'\n ? '/recommended-class/models'\n : '/recommended-class/drafts';\n return `${baseUrl}/${lessonDraftId}`;\n}\n\n/**\n * Activity draft item for lesson draft update\n */\ninterface ActivityDraftItem {\n activityDraftId: string;\n sequence: number;\n}\n\n/**\n * Lesson item for lesson draft update\n */\ninterface LessonItem {\n lessonId: string;\n sequence: number;\n}\n\n/**\n * Current lesson data from API\n */\ninterface CurrentLessonData {\n type: string;\n title: string;\n subjectId: string;\n filters: BackendFiltersFormat;\n activityDrafts?: ActivityDraftItem[];\n lessons?: LessonItem[];\n}\n\n/**\n * Build activity draft IDs array for lesson draft update\n *\n * @param existingActivities - Existing activity drafts from the lesson\n * @param newActivityDraftId - New activity draft ID to add\n * @returns Array of activity draft items with sequences\n */\nexport function buildActivityDraftIds(\n existingActivities: ActivityDraftItem[] | undefined,\n newActivityDraftId: string\n): ActivityDraftItem[] {\n const activities = existingActivities || [];\n return [\n ...activities.map((a) => ({\n activityDraftId: a.activityDraftId,\n sequence: a.sequence,\n })),\n {\n activityDraftId: newActivityDraftId,\n sequence: activities.length + 1,\n },\n ];\n}\n\n/**\n * Build lesson IDs array from current lesson data\n *\n * @param lessons - Lessons from the current lesson data\n * @returns Array of lesson items with sequences\n */\nexport function buildLessonIds(\n lessons: LessonItem[] | undefined\n): LessonItem[] {\n return (\n lessons?.map((l) => ({\n lessonId: l.lessonId,\n sequence: l.sequence,\n })) || []\n );\n}\n\n/**\n * Build update payload for lesson draft\n *\n * @param currentLesson - Current lesson data from API\n * @param newActivityDraftId - New activity draft ID to add\n * @returns Update payload for PATCH request\n */\nexport function buildLessonDraftUpdatePayload(\n currentLesson: CurrentLessonData,\n newActivityDraftId: string\n): {\n type: string;\n title: string;\n subjectId: string;\n filters: BackendFiltersFormat;\n lessonIds: LessonItem[];\n activityDraftIds: ActivityDraftItem[];\n} {\n return {\n type: currentLesson.type,\n title: currentLesson.title,\n subjectId: currentLesson.subjectId,\n filters: currentLesson.filters,\n lessonIds: buildLessonIds(currentLesson.lessons),\n activityDraftIds: buildActivityDraftIds(\n currentLesson.activityDrafts,\n newActivityDraftId\n ),\n };\n}\n\n/**\n * Format a path to ensure it starts with /\n *\n * @param path - The path to format\n * @returns Path starting with /\n */\nexport function formatNavigatePath(path: string): string {\n return path.startsWith('/') ? path : `/${path}`;\n}\n\n/**\n * Activity create response data structure\n */\ninterface ActivityCreateResponseData {\n data?: {\n data?: {\n id?: string;\n };\n };\n}\n\n/**\n * Extract activity ID from create activity response\n *\n * @param response - Response from create activity API\n * @returns Activity ID or throws error if not found\n */\nexport function extractActivityIdFromResponse(\n response: ActivityCreateResponseData\n): string {\n const activityId = response?.data?.data?.id;\n if (!activityId) {\n throw new Error('ID da atividade não retornado pela API');\n }\n return activityId;\n}\n\n/**\n * Build payload for sending activity to students\n *\n * @param activityId - Activity ID\n * @param students - Array of student IDs\n * @returns Send to students payload\n */\nexport function buildSendToStudentsPayload(\n activityId: string,\n students: string[]\n): { activityId: string; students: string[] } {\n return {\n activityId,\n students,\n };\n}\n\n/**\n * Validate send activity responses\n *\n * @param createResponse - Response from create activity API\n * @param sendResponse - Response from send to students API\n * @throws Error if any response is invalid\n */\nexport function validateSendActivityResponses(\n createResponse: { data?: unknown } | undefined,\n sendResponse: { data?: unknown } | undefined\n): void {\n if (!createResponse?.data) {\n throw new Error('Resposta inválida ao criar atividade');\n }\n if (!sendResponse?.data) {\n throw new Error('Resposta inválida ao enviar atividade para estudantes');\n }\n}\n\n/**\n * Format error message from unknown error\n *\n * @param error - Error object\n * @param defaultMessage - Default message if error is not an Error instance\n * @returns Formatted error message\n */\nexport function formatErrorMessage(\n error: unknown,\n defaultMessage: string\n): string {\n return error instanceof Error ? error.message : defaultMessage;\n}\n\n/**\n * Draft data from API response\n */\ninterface DraftData {\n id: string;\n type: ActivityType;\n title: string;\n subjectId: string;\n filters: BackendFiltersFormat;\n updatedAt?: string;\n}\n\n/**\n * Build ActivityData from draft response\n *\n * @param draft - Draft data from API\n * @param questionIds - Current question IDs\n * @returns ActivityData object\n */\nexport function buildActivityDataFromDraft(\n draft: DraftData,\n questionIds: string[]\n): {\n id: string;\n type: ActivityType;\n title: string;\n subjectId: string;\n filters: BackendFiltersFormat;\n questionIds: string[];\n updatedAt?: string;\n} {\n return {\n id: draft.id,\n type: draft.type,\n title: draft.title,\n subjectId: draft.subjectId,\n filters: draft.filters,\n questionIds,\n updatedAt: draft.updatedAt,\n };\n}\n\n/**\n * Build partial activity update (preserves filters)\n *\n * @param prevActivity - Previous activity state\n * @param draft - New draft data\n * @param questionIds - Current question IDs\n * @returns Updated activity data\n */\nexport function buildPartialActivityUpdate(\n prevActivity: { filters: BackendFiltersFormat },\n draft: DraftData,\n questionIds: string[]\n): {\n id: string;\n type: ActivityType;\n title: string;\n subjectId: string;\n filters: BackendFiltersFormat;\n questionIds: string[];\n updatedAt?: string;\n} {\n return {\n id: draft.id,\n type: draft.type,\n title: draft.title,\n subjectId: draft.subjectId,\n filters: prevActivity.filters,\n questionIds,\n updatedAt: draft.updatedAt,\n };\n}\n\n/**\n * Build draft payload with type override\n *\n * @param basePayload - Base payload\n * @param typeOverride - Type to override\n * @param customTitle - Custom title (optional)\n * @param subjectId - Subject ID for title generation\n * @param knowledgeAreas - Knowledge areas for title generation\n * @returns Updated payload\n */\nexport function buildPayloadWithTypeOverride<\n T extends { type: ActivityType; title: string },\n>(\n basePayload: T,\n typeOverride: ActivityType,\n customTitle: string | undefined,\n subjectId: string | null,\n knowledgeAreas: KnowledgeArea[]\n): T {\n const trimmedCustomTitle = customTitle?.trim();\n const generatedTitle = subjectId\n ? generateTitle(typeOverride, subjectId, knowledgeAreas)\n : generateMultiSubjectTitle(typeOverride);\n const title =\n trimmedCustomTitle && trimmedCustomTitle.length > 0\n ? trimmedCustomTitle\n : generatedTitle;\n\n return {\n ...basePayload,\n type: typeOverride,\n title,\n };\n}\n\n/**\n * Check if URL needs to be updated based on activity state\n *\n * @param activityId - Current activity ID\n * @param activityType - Current activity type\n * @param currentUrlType - Current URL type param\n * @param currentUrlId - Current URL id param\n * @returns True if URL needs update\n */\nexport function shouldUpdateUrl(\n activityId: string | undefined,\n activityType: ActivityType | undefined,\n currentUrlType: string | undefined,\n currentUrlId: string | undefined\n): boolean {\n if (!activityId || !activityType) {\n return false;\n }\n const urlType = getTypeFromUrl(activityType);\n return (\n !currentUrlType ||\n !currentUrlId ||\n currentUrlId !== activityId ||\n currentUrlType !== urlType\n );\n}\n\n/**\n * Pre-filters input type\n */\ntype PreFiltersInput =\n | BackendFiltersFormat\n | { filters?: BackendFiltersFormat | null }\n | null;\n\n/**\n * Resolve pre-filters from various input formats\n *\n * @param preFilters - Pre-filters in various formats\n * @returns Resolved BackendFiltersFormat or null\n */\nexport function resolvePreFilters(\n preFilters: PreFiltersInput\n): BackendFiltersFormat | null | undefined {\n if (!preFilters) {\n return null;\n }\n if (\n typeof preFilters === 'object' &&\n preFilters !== null &&\n 'filters' in preFilters\n ) {\n return preFilters.filters;\n }\n return preFilters as BackendFiltersFormat;\n}\n\n/**\n * Get initial filters data from activity or pre-filters\n *\n * @param activityFilters - Activity filters\n * @param resolvedPreFilters - Resolved pre-filters\n * @returns ActivityFiltersData or null\n */\nexport function getInitialFiltersData(\n activityFilters: BackendFiltersFormat | undefined,\n resolvedPreFilters: BackendFiltersFormat | null | undefined\n): ActivityFiltersData | null {\n if (activityFilters) {\n return convertBackendFiltersToActivityFiltersData(activityFilters);\n }\n if (resolvedPreFilters) {\n return convertBackendFiltersToActivityFiltersData(resolvedPreFilters);\n }\n return null;\n}\n\n/**\n * Parameters for checking if save should trigger on reorder\n */\ninterface ReorderSaveCheckParams {\n hasFirstSaveBeenDone: boolean;\n subjectIds: string[] | undefined;\n loadingInitialQuestions: boolean;\n isSaving: boolean;\n}\n\n/**\n * Check if save should be triggered after reordering questions\n *\n * @param params - Check parameters\n * @returns True if save should be triggered\n */\nexport function shouldTriggerSaveOnReorder(\n params: ReorderSaveCheckParams\n): boolean {\n const {\n hasFirstSaveBeenDone,\n subjectIds,\n loadingInitialQuestions,\n isSaving,\n } = params;\n const hasSubjectIds = Array.isArray(subjectIds) && subjectIds.length > 0;\n return (\n hasFirstSaveBeenDone &&\n hasSubjectIds &&\n !loadingInitialQuestions &&\n !isSaving\n );\n}\n\n/**\n * Check if filters have required subject IDs\n *\n * @param subjectIds - Subject IDs from filters\n * @returns True if at least one subject ID exists\n */\nexport function hasRequiredSubjectIds(\n subjectIds: string[] | undefined\n): boolean {\n return Array.isArray(subjectIds) && subjectIds.length > 0;\n}\n\n/**\n * Check if should save draft before adding to lesson\n *\n * @param questionsCount - Number of questions\n * @param activityDraftId - Current draft ID\n * @returns True if draft should be saved\n */\nexport function shouldSaveDraftBeforeAddingToLesson(\n questionsCount: number,\n activityDraftId: string | null | undefined\n): boolean {\n return questionsCount > 0 || !!activityDraftId;\n}\n\n/**\n * Check if should use custom callback for adding activity\n *\n * @param onAddActivityToLesson - Callback function\n * @param activityDraftId - Activity draft ID\n * @returns True if custom callback should be used\n */\nexport function shouldUseCustomAddActivityCallback(\n onAddActivityToLesson: ((id: string) => void) | undefined,\n activityDraftId: string | null | undefined\n): boolean {\n return !!(onAddActivityToLesson && activityDraftId);\n}\n\n/**\n * Check if should add activity to lesson draft automatically\n *\n * @param activityDraftId - Activity draft ID\n * @param recommendedLessonDraftId - Recommended lesson draft ID\n * @returns True if should add automatically\n */\nexport function shouldAddActivityToLessonDraft(\n activityDraftId: string | null | undefined,\n recommendedLessonDraftId: string | undefined\n): boolean {\n return !!(activityDraftId && recommendedLessonDraftId);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-XQAYZBLL.js","../src/components/ActivityCreate/ActivityCreate.utils.ts"],"names":[],"mappings":"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B,EAAA;AACA,IAAA;AACA,IAAA;AACN,EAAA;AAEZ;AASgB;AAWP,EAAA;AACe,IAAA;AACb,IAAA;AACI,IAAA;AACF,IAAA;AACE,IAAA;AACO,IAAA;AACF,MAAA;AACd,MAAA;AACF,IAAA;AACF,EAAA;AACF;AAQgB;AACF,EAAA;AACd;AAmBgB;AAGK,EAAA;AACF,EAAA;AACC,IAAA;AAClB,EAAA;AACO,EAAA;AACT;AASgB;AAIP,EAAA;AACL,IAAA;AACA,IAAA;AACF,EAAA;AACF;AASgB;AAIO,EAAA;AACH,IAAA;AAClB,EAAA;AACmB,EAAA;AACD,IAAA;AAClB,EAAA;AACF;AASgB;AAIP,EAAA;AACT;AAqBgB;AAYP,EAAA;AACK,IAAA;AACE,IAAA;AACC,IAAA;AACI,IAAA;AACF,IAAA;AACf,IAAA;AACiB,IAAA;AACnB,EAAA;AACF;AAUgB;AAaP,EAAA;AACK,IAAA;AACE,IAAA;AACC,IAAA;AACI,IAAA;AACR,IAAA;AACT,IAAA;AACiB,IAAA;AACnB,EAAA;AACF;AAYgB;AASR,EAAA;AACA,EAAA;AAIJ,EAAA;AAIK,EAAA;AACF,IAAA;AACG,IAAA;AACN,IAAA;AACF,EAAA;AACF;AAWgB;AAMM,EAAA;AACX,IAAA;AACT,EAAA;AACgB,EAAA;AAEb,EAAA;AAKL;AAgBgB;AAGG,EAAA;AACR,IAAA;AACT,EAAA;AAES,EAAA;AAIW,IAAA;AACpB,EAAA;AACO,EAAA;AACT;AASgB;AAIO,EAAA;AACZ,IAAA;AACT,EAAA;AACI,EAAA;AACK,IAAA;AACT,EAAA;AACO,EAAA;AACT;AAkBgB;AAGR,EAAA;AACJ,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACE,EAAA;AACkB,EAAA;AAEpB,EAAA;AAKJ;AAQgB;AAGO,EAAA;AACvB;AASgB;AAIP,EAAA;AACT;AASgB;AAIJ,EAAA;AACZ;AASgB;AAIJ,EAAA;AACZ;ADxtBwB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-XQAYZBLL.js","sourcesContent":[null,"import type {\n ActivityFiltersData,\n PreviewQuestion,\n QuestionActivity as Question,\n SendActivityFormData,\n} from '../..';\nimport type { Lesson } from '../../types/lessons';\nimport { ActivityMode, ActivitySubtype } from '../SendActivityModal/types';\nimport { QUESTION_TYPE } from '../Quiz/useQuizStore';\nimport type {\n BackendFiltersFormat,\n ActivityDraftResponse,\n} from './ActivityCreate.types';\nimport { ActivityType } from './ActivityCreate.types';\nimport type { CreateActivityPayload } from '../../types/sendActivity';\n\n/**\n * Response format for recommended class lesson data\n */\ninterface LessonResponseData {\n draft?: {\n selectedLessons?: Lesson[];\n lessons?: Array<{\n lessonId: string;\n sequence: number;\n lesson?: Lesson;\n }>;\n };\n selectedLessons?: Lesson[];\n lessons?: Array<{\n lessonId: string;\n sequence: number;\n lesson?: Lesson;\n }>;\n}\n\n/**\n * Extract lessons from recommended class API response\n * Handles multiple response formats for backward compatibility\n *\n * @param responseData - Response data from recommended class API\n * @returns Array of Lesson objects\n *\n * @example\n * ```ts\n * const lessons = extractLessonsFromResponse({\n * draft: { selectedLessons: [...] }\n * });\n * ```\n */\nexport function extractLessonsFromResponse(\n responseData: LessonResponseData\n): Lesson[] {\n const draft = responseData.draft;\n\n // Try draft.selectedLessons first\n if (draft?.selectedLessons && draft.selectedLessons.length > 0) {\n return draft.selectedLessons;\n }\n\n // Try responseData.selectedLessons\n if (responseData.selectedLessons && responseData.selectedLessons.length > 0) {\n return responseData.selectedLessons;\n }\n\n // Try draft.lessons (extract lesson property)\n if (draft?.lessons && draft.lessons.length > 0) {\n return draft.lessons\n .map((item) => {\n if (\n item &&\n typeof item === 'object' &&\n 'lesson' in item &&\n item.lesson\n ) {\n return item.lesson;\n }\n return null;\n })\n .filter((lesson): lesson is Lesson => lesson !== null);\n }\n\n // Try responseData.lessons (extract lesson property)\n if (responseData.lessons && responseData.lessons.length > 0) {\n return responseData.lessons\n .map((item) => {\n if (\n item &&\n typeof item === 'object' &&\n 'lesson' in item &&\n item.lesson\n ) {\n return item.lesson;\n }\n return null;\n })\n .filter((lesson): lesson is Lesson => lesson !== null);\n }\n\n return [];\n}\n\n/**\n * Set of valid QUESTION_TYPE enum values for runtime validation\n */\nconst VALID_QUESTION_TYPES = new Set(Object.values(QUESTION_TYPE));\n\n/**\n * Type guard to validate if a string is a valid QUESTION_TYPE\n * @param type - String to validate\n * @returns True if type is a valid QUESTION_TYPE enum value\n */\nconst isValidQuestionType = (type: string): type is QUESTION_TYPE => {\n return VALID_QUESTION_TYPES.has(type as QUESTION_TYPE);\n};\n\n/**\n * Knowledge area interface for subject lookup\n */\nexport interface KnowledgeArea {\n id: string;\n name: string;\n}\n\n/**\n * Convert ActivityFiltersData to backend format\n *\n * @param filters - ActivityFiltersData to convert, can be null\n * @returns BackendFiltersFormat object with converted filter data\n *\n * @example\n * ```ts\n * const backendFilters = convertFiltersToBackendFormat({\n * types: ['ALTERNATIVA'],\n * subjectIds: ['math'],\n * // ...\n * });\n * ```\n */\nexport function convertFiltersToBackendFormat(\n filters: ActivityFiltersData | null\n): BackendFiltersFormat {\n if (!filters) {\n return {\n questionTypes: [],\n questionBanks: [],\n subjects: [],\n topics: [],\n subtopics: [],\n contents: [],\n };\n }\n\n return {\n questionTypes: filters.types,\n questionBanks: filters.bankIds,\n subjects: filters.subjectIds,\n topics: filters.topicIds,\n subtopics: filters.subtopicIds,\n contents: filters.contentIds,\n };\n}\n\n/**\n * Convert backend filters format to ActivityFiltersData\n *\n * @param backendFilters - BackendFiltersFormat to convert, can be null\n * @returns ActivityFiltersData object with converted filter data, or null if input is null\n *\n * @example\n * ```ts\n * const activityFilters = convertBackendFiltersToActivityFiltersData({\n * questionTypes: ['ALTERNATIVA'],\n * subjects: ['math'],\n * // ...\n * });\n * ```\n */\nexport function convertBackendFiltersToActivityFiltersData(\n backendFilters: BackendFiltersFormat | null\n): ActivityFiltersData | null {\n if (!backendFilters) {\n return null;\n }\n\n return {\n types: (backendFilters.questionTypes || []).filter(isValidQuestionType),\n bankIds: backendFilters.questionBanks || [],\n subjectIds: backendFilters.subjects || [],\n topicIds: backendFilters.topics || [],\n subtopicIds: backendFilters.subtopics || [],\n contentIds: backendFilters.contents || [],\n yearIds: [],\n };\n}\n\n/**\n * Get subject name from subjectId by searching in knowledge areas\n *\n * @param subjectId - The subject ID to look up\n * @param knowledgeAreas - Array of knowledge areas to search in\n * @returns The subject name if found, null otherwise\n *\n * @example\n * ```ts\n * const subjectName = getSubjectName('math', [\n * { id: 'math', name: 'Matemática' }\n * ]);\n * // Returns: 'Matemática'\n * ```\n */\nexport function getSubjectName(\n subjectId: string | null,\n knowledgeAreas: KnowledgeArea[]\n): string | null {\n if (!subjectId || !knowledgeAreas.length) {\n return null;\n }\n const subject = knowledgeAreas.find((area) => area.id === subjectId);\n return subject?.name || null;\n}\n\n/**\n * Get activity type label using object literal mapping\n *\n * @param type - Activity type (ActivityType enum)\n * @returns Label string for the activity type\n *\n * @example\n * ```ts\n * const label = getActivityTypeLabel(ActivityType.RASCUNHO);\n * // Returns: 'Rascunho'\n * ```\n */\nexport function getActivityTypeLabel(type: ActivityType): string {\n const activityTypeLabels: Record<ActivityType, string> = {\n [ActivityType.RASCUNHO]: 'Rascunho',\n [ActivityType.MODELO]: 'Modelo',\n [ActivityType.ATIVIDADE]: 'Atividade',\n };\n return activityTypeLabels[type];\n}\n\n/**\n * Generate activity title based on type and subject\n *\n * @param type - Activity type (ActivityType enum)\n * @param subjectId - Subject ID to get name from\n * @param knowledgeAreas - Array of knowledge areas for subject lookup\n * @returns Generated title string\n *\n * @example\n * ```ts\n * const title = generateTitle(ActivityType.RASCUNHO, 'math', [\n * { id: 'math', name: 'Matemática' }\n * ]);\n * // Returns: 'Rascunho - Matemática'\n * ```\n */\nexport function generateTitle(\n type: ActivityType,\n subjectId: string | null,\n knowledgeAreas: KnowledgeArea[]\n): string {\n const typeLabel = getActivityTypeLabel(type);\n const subjectName = getSubjectName(subjectId, knowledgeAreas);\n return subjectName ? `${typeLabel} - ${subjectName}` : typeLabel;\n}\n\n/**\n * Builds a draft title when the selection spans several subjects and no single\n * subject name applies.\n *\n * @param type - Activity type used for the label prefix\n * @returns Title string for a multi-subject draft\n *\n * @example\n * ```ts\n * generateMultiSubjectTitle(ActivityType.RASCUNHO);\n * // Returns: 'Rascunho - Diversos componentes curriculares'\n * ```\n */\nexport function generateMultiSubjectTitle(type: ActivityType): string {\n return `${getActivityTypeLabel(type)} - Diversos componentes curriculares`;\n}\n\n/**\n * Resolves the legacy single `subjectId` to send with an activity.\n *\n * The backend derives an activity's real subjects from the subjects of its\n * questions, so this field is only the legacy \"primary subject\" fallback and is\n * optional. It is therefore sent only when it is unambiguous: the subject the\n * activity already carries, or the one selected subject when exactly one is\n * filtered. With several filtered, electing one of them would be arbitrary —\n * the junction table already has the right answer.\n *\n * @param activitySubjectId - Subject already stored on the activity/draft\n * @param subjectIds - Subjects currently selected in the filters\n * @returns The subject id to send, or null to omit it\n *\n * @example\n * ```ts\n * resolveActivitySubjectId(undefined, ['bio']); // 'bio'\n * resolveActivitySubjectId(undefined, ['bio', 'fis']); // null\n * ```\n */\nexport function resolveActivitySubjectId(\n activitySubjectId: string | undefined,\n subjectIds: string[] | undefined\n): string | null {\n if (activitySubjectId) {\n return activitySubjectId;\n }\n\n return subjectIds?.length === 1 ? subjectIds[0] : null;\n}\n\n/**\n * Converte ActivityType para o formato usado na URL\n *\n * @param type - ActivityType enum value\n * @returns String representation for URL (rascunho or modelo)\n *\n * @example\n * ```ts\n * const urlType = getTypeFromUrl(ActivityType.RASCUNHO);\n * // Returns: 'rascunho'\n * ```\n */\nexport function getTypeFromUrl(type: ActivityType): string {\n switch (type) {\n case ActivityType.RASCUNHO:\n return 'rascunho';\n case ActivityType.MODELO:\n return 'modelo';\n default:\n return 'rascunho';\n }\n}\n\n/**\n * Converte string da URL para ActivityType\n *\n * @param type - String from URL (rascunho or modelo)\n * @returns ActivityType enum value\n *\n * @example\n * ```ts\n * const activityType = getTypeFromUrlString('rascunho');\n * // Returns: ActivityType.RASCUNHO\n * ```\n */\nexport function getTypeFromUrlString(type: string | undefined): ActivityType {\n switch (type) {\n case 'rascunho':\n return ActivityType.RASCUNHO;\n case 'modelo':\n return ActivityType.MODELO;\n default:\n return ActivityType.RASCUNHO;\n }\n}\n\n/**\n * Convert Question to PreviewQuestion format\n *\n * @param question - Question object to convert\n * @returns PreviewQuestion object with converted data\n *\n * @example\n * ```ts\n * const previewQuestion = convertQuestionToPreview({\n * id: 'q1',\n * statement: 'Test question',\n * questionType: 'ALTERNATIVA',\n * options: [{ id: 'opt1', option: 'Option 1' }],\n * knowledgeMatrix: [{\n * subject: { name: 'Math', color: '#000', icon: 'Math' }\n * }]\n * });\n * ```\n */\nexport function convertQuestionToPreview(question: Question): PreviewQuestion {\n const subjectInfo =\n question.knowledgeMatrix && question.knowledgeMatrix.length > 0\n ? {\n subjectName: question.knowledgeMatrix[0].subject?.name || undefined,\n subjectColor: question.knowledgeMatrix[0].subject?.color || undefined,\n iconName: question.knowledgeMatrix[0].subject?.icon || undefined,\n }\n : {};\n\n return {\n id: question.id,\n statement: question.statement,\n solutionExplanation: question.solutionExplanation ?? null,\n bank: question.questionBankYear?.questionBank?.name || undefined,\n year: question.questionBankYear?.year || undefined,\n questionType: question.questionType,\n question: question.options\n ? {\n options: question.options.map(\n (opt: { id: string; option: string; isCorrect?: boolean }) => ({\n id: opt.id,\n option: opt.option,\n isCorrect: opt.isCorrect,\n })\n ),\n correctOptionIds: question.options\n .filter((opt: { isCorrect?: boolean }) => opt.isCorrect === true)\n .map((opt: { id: string }) => opt.id),\n }\n : undefined,\n ...subjectInfo,\n };\n}\n\n/**\n * Build ISO date time string from date and time parts\n *\n * @param date - Date string in YYYY-MM-DD format\n * @param time - Time string in HH:mm format\n * @returns ISO date time string\n */\nexport function buildISODateTime(date: string, time: string): string {\n return new Date(`${date}T${time}`).toISOString();\n}\n\n/**\n * Build final date time based on exam mode\n *\n * @param formData - Form data with finalDate and finalTime\n * @param isExamMode - Whether exam mode is enabled\n * @returns ISO date time string or null for exam mode\n */\nexport function buildFinalDateTime(\n finalDate: string,\n finalTime: string,\n isExamMode: boolean,\n isInPersonExam = false\n): string | null {\n // A prova digital é aplicada num dia só: não tem prazo final a gravar. A\n // impressa tem — o aluno responde em casa ao longo de um período, e é esse\n // prazo que fecha o envio das fotos e alimenta o \"Andamento da atividade\".\n if (isExamMode && !isInPersonExam) {\n return null;\n }\n return buildISODateTime(finalDate, finalTime);\n}\n\nexport function buildSendActivityPayload(\n formData: SendActivityFormData,\n subjectId: string | null,\n questionIds: string[],\n startDateTime: string,\n finalDateTime: string | null,\n activityType?: 'ATIVIDADE' | 'PROVA',\n essayThemeId?: string | null\n): CreateActivityPayload {\n const isDigital =\n formData.subtype === ActivitySubtype.PROVA\n ? formData.mode !== ActivityMode.PRESENCIAL\n : true;\n\n return {\n title: formData.title,\n // The legacy primary subject is `.optional()` on the backend, which accepts\n // an absent key but rejects an explicit null — so it is omitted when the\n // selection spans several subjects and none is authoritative.\n ...(subjectId ? { subjectId } : {}),\n questionIds,\n subtype: formData.subtype,\n type: activityType,\n notification: formData.notification || '',\n startDate: startDateTime,\n finalDate: finalDateTime,\n canRetry: formData.canRetry,\n isDigital,\n // The backend rejects a theme on a digital activity, so it only rides along\n // on the in-person booklet that actually carries the essay sheet.\n ...(!isDigital && essayThemeId ? { essayThemeId } : {}),\n };\n}\n\n/**\n * Check if questions have changed compared to last saved state\n *\n * @param currentQuestions - Current questions array\n * @param lastSavedQuestions - Last saved questions array\n * @returns True if questions have changed\n */\nexport function hasQuestionsChanged(\n currentQuestions: Array<{ id: string }>,\n lastSavedQuestions: Array<{ id: string }>\n): boolean {\n const currentIds = currentQuestions.map((q) => q.id).join(',');\n const lastSavedIds = lastSavedQuestions.map((q) => q.id).join(',');\n return currentIds !== lastSavedIds;\n}\n\n/**\n * Parameters for shouldSkipAutoSave check\n */\ninterface AutoSaveCheckParams {\n loadingInitialQuestions: boolean;\n questionsCount: number;\n hasFirstSaveBeenDone: boolean;\n appliedFilters: ActivityFiltersData | null;\n}\n\n/**\n * Check if auto-save should be skipped based on current state\n *\n * @param params - Parameters to check\n * @returns True if auto-save should be skipped\n */\n/**\n * Parameters for building URL with preserved query params\n */\ninterface BuildUrlParams {\n newType: string;\n newId: string;\n basePath: string;\n recommendedLessonDraftId?: string;\n recommendedLessonId?: string;\n classTypeParam?: string;\n onFinishPath?: string;\n}\n\n/**\n * Build URL preserving existing query parameters\n * Used when updating URL after saving draft to maintain context for navigation\n *\n * @param params - URL building parameters\n * @returns Complete URL string with query parameters\n */\nexport function buildUrlWithParams(params: BuildUrlParams): string {\n const {\n newType,\n newId,\n basePath,\n recommendedLessonDraftId,\n recommendedLessonId,\n classTypeParam,\n onFinishPath,\n } = params;\n\n const urlParams = new URLSearchParams();\n urlParams.set('type', newType);\n urlParams.set('id', newId);\n\n if (recommendedLessonDraftId) {\n urlParams.set('recommended-class-draft', recommendedLessonDraftId);\n }\n if (recommendedLessonId) {\n urlParams.set('recommended-class', recommendedLessonId);\n }\n if (classTypeParam) {\n urlParams.set('classType', classTypeParam);\n }\n if (onFinishPath) {\n urlParams.set('onFinish', onFinishPath);\n }\n\n return `${basePath}?${urlParams.toString()}`;\n}\n\nexport function shouldSkipAutoSave(params: AutoSaveCheckParams): boolean {\n const {\n loadingInitialQuestions,\n questionsCount,\n hasFirstSaveBeenDone,\n appliedFilters,\n } = params;\n\n if (loadingInitialQuestions) {\n return true;\n }\n if (questionsCount === 0 && !hasFirstSaveBeenDone) {\n return true;\n }\n if (!appliedFilters) {\n return true;\n }\n return false;\n}\n\n/**\n * Try to extract draft from standard response format\n */\nfunction tryExtractDraftFromStandardFormat(\n responseData: ActivityDraftResponse\n): ActivityDraftResponse['data']['draft'] | undefined {\n if (responseData.data?.draft) {\n return responseData.data.draft;\n }\n if ('draft' in responseData && typeof responseData === 'object') {\n return (\n responseData as unknown as {\n draft: ActivityDraftResponse['data']['draft'];\n }\n )?.draft;\n }\n return undefined;\n}\n\n/**\n * Log error details for draft extraction failure\n */\nfunction logDraftExtractionError(response: { data: ActivityDraftResponse }) {\n console.error('❌ Resposta inválida da API ao criar rascunho:', {\n response,\n responseData: response?.data,\n responseDataData: response?.data?.data,\n responseKeys: response?.data ? Object.keys(response.data) : [],\n responseDataKeys: response?.data?.data\n ? Object.keys(response.data.data)\n : [],\n });\n}\n\n/**\n * Extract draft from API response\n * Handles multiple response formats for backward compatibility\n *\n * @param response - API response object\n * @returns Extracted draft object\n * @throws Error if draft cannot be extracted\n */\nexport function extractDraftFromResponse(response: {\n data: ActivityDraftResponse;\n}): ActivityDraftResponse['data']['draft'] {\n if (!response?.data) {\n console.error('❌ Resposta vazia da API ao criar rascunho:', response);\n throw new Error('Invalid response: empty response from API');\n }\n\n const savedDraft = tryExtractDraftFromStandardFormat(response.data);\n\n if (!savedDraft?.id) {\n logDraftExtractionError(response);\n throw new Error(\n 'Invalid response: draft data is missing. Expected structure: response.data.data.draft'\n );\n }\n\n return savedDraft;\n}\n\n/**\n * Get the recommended class endpoint URL based on class type\n *\n * @param lessonDraftId - The lesson draft ID\n * @param classTypeParam - The class type parameter (modelo or undefined)\n * @returns The endpoint URL for the recommended class\n */\nexport function getRecommendedClassEndpoint(\n lessonDraftId: string,\n classTypeParam?: string\n): string {\n const baseUrl =\n classTypeParam === 'modelo'\n ? '/recommended-class/models'\n : '/recommended-class/drafts';\n return `${baseUrl}/${lessonDraftId}`;\n}\n\n/**\n * Activity draft item for lesson draft update\n */\ninterface ActivityDraftItem {\n activityDraftId: string;\n sequence: number;\n}\n\n/**\n * Lesson item for lesson draft update\n */\ninterface LessonItem {\n lessonId: string;\n sequence: number;\n}\n\n/**\n * Current lesson data from API\n */\ninterface CurrentLessonData {\n type: string;\n title: string;\n subjectId: string;\n filters: BackendFiltersFormat;\n activityDrafts?: ActivityDraftItem[];\n lessons?: LessonItem[];\n}\n\n/**\n * Build activity draft IDs array for lesson draft update\n *\n * @param existingActivities - Existing activity drafts from the lesson\n * @param newActivityDraftId - New activity draft ID to add\n * @returns Array of activity draft items with sequences\n */\nexport function buildActivityDraftIds(\n existingActivities: ActivityDraftItem[] | undefined,\n newActivityDraftId: string\n): ActivityDraftItem[] {\n const activities = existingActivities || [];\n return [\n ...activities.map((a) => ({\n activityDraftId: a.activityDraftId,\n sequence: a.sequence,\n })),\n {\n activityDraftId: newActivityDraftId,\n sequence: activities.length + 1,\n },\n ];\n}\n\n/**\n * Build lesson IDs array from current lesson data\n *\n * @param lessons - Lessons from the current lesson data\n * @returns Array of lesson items with sequences\n */\nexport function buildLessonIds(\n lessons: LessonItem[] | undefined\n): LessonItem[] {\n return (\n lessons?.map((l) => ({\n lessonId: l.lessonId,\n sequence: l.sequence,\n })) || []\n );\n}\n\n/**\n * Build update payload for lesson draft\n *\n * @param currentLesson - Current lesson data from API\n * @param newActivityDraftId - New activity draft ID to add\n * @returns Update payload for PATCH request\n */\nexport function buildLessonDraftUpdatePayload(\n currentLesson: CurrentLessonData,\n newActivityDraftId: string\n): {\n type: string;\n title: string;\n subjectId: string;\n filters: BackendFiltersFormat;\n lessonIds: LessonItem[];\n activityDraftIds: ActivityDraftItem[];\n} {\n return {\n type: currentLesson.type,\n title: currentLesson.title,\n subjectId: currentLesson.subjectId,\n filters: currentLesson.filters,\n lessonIds: buildLessonIds(currentLesson.lessons),\n activityDraftIds: buildActivityDraftIds(\n currentLesson.activityDrafts,\n newActivityDraftId\n ),\n };\n}\n\n/**\n * Format a path to ensure it starts with /\n *\n * @param path - The path to format\n * @returns Path starting with /\n */\nexport function formatNavigatePath(path: string): string {\n return path.startsWith('/') ? path : `/${path}`;\n}\n\n/**\n * Activity create response data structure\n */\ninterface ActivityCreateResponseData {\n data?: {\n data?: {\n id?: string;\n };\n };\n}\n\n/**\n * Extract activity ID from create activity response\n *\n * @param response - Response from create activity API\n * @returns Activity ID or throws error if not found\n */\nexport function extractActivityIdFromResponse(\n response: ActivityCreateResponseData\n): string {\n const activityId = response?.data?.data?.id;\n if (!activityId) {\n throw new Error('ID da atividade não retornado pela API');\n }\n return activityId;\n}\n\n/**\n * Build payload for sending activity to students\n *\n * @param activityId - Activity ID\n * @param students - Array of student IDs\n * @returns Send to students payload\n */\nexport function buildSendToStudentsPayload(\n activityId: string,\n students: string[]\n): { activityId: string; students: string[] } {\n return {\n activityId,\n students,\n };\n}\n\n/**\n * Validate send activity responses\n *\n * @param createResponse - Response from create activity API\n * @param sendResponse - Response from send to students API\n * @throws Error if any response is invalid\n */\nexport function validateSendActivityResponses(\n createResponse: { data?: unknown } | undefined,\n sendResponse: { data?: unknown } | undefined\n): void {\n if (!createResponse?.data) {\n throw new Error('Resposta inválida ao criar atividade');\n }\n if (!sendResponse?.data) {\n throw new Error('Resposta inválida ao enviar atividade para estudantes');\n }\n}\n\n/**\n * Format error message from unknown error\n *\n * @param error - Error object\n * @param defaultMessage - Default message if error is not an Error instance\n * @returns Formatted error message\n */\nexport function formatErrorMessage(\n error: unknown,\n defaultMessage: string\n): string {\n return error instanceof Error ? error.message : defaultMessage;\n}\n\n/**\n * Draft data from API response\n */\ninterface DraftData {\n id: string;\n type: ActivityType;\n title: string;\n subjectId: string;\n filters: BackendFiltersFormat;\n updatedAt?: string;\n}\n\n/**\n * Build ActivityData from draft response\n *\n * @param draft - Draft data from API\n * @param questionIds - Current question IDs\n * @returns ActivityData object\n */\nexport function buildActivityDataFromDraft(\n draft: DraftData,\n questionIds: string[]\n): {\n id: string;\n type: ActivityType;\n title: string;\n subjectId: string;\n filters: BackendFiltersFormat;\n questionIds: string[];\n updatedAt?: string;\n} {\n return {\n id: draft.id,\n type: draft.type,\n title: draft.title,\n subjectId: draft.subjectId,\n filters: draft.filters,\n questionIds,\n updatedAt: draft.updatedAt,\n };\n}\n\n/**\n * Build partial activity update (preserves filters)\n *\n * @param prevActivity - Previous activity state\n * @param draft - New draft data\n * @param questionIds - Current question IDs\n * @returns Updated activity data\n */\nexport function buildPartialActivityUpdate(\n prevActivity: { filters: BackendFiltersFormat },\n draft: DraftData,\n questionIds: string[]\n): {\n id: string;\n type: ActivityType;\n title: string;\n subjectId: string;\n filters: BackendFiltersFormat;\n questionIds: string[];\n updatedAt?: string;\n} {\n return {\n id: draft.id,\n type: draft.type,\n title: draft.title,\n subjectId: draft.subjectId,\n filters: prevActivity.filters,\n questionIds,\n updatedAt: draft.updatedAt,\n };\n}\n\n/**\n * Build draft payload with type override\n *\n * @param basePayload - Base payload\n * @param typeOverride - Type to override\n * @param customTitle - Custom title (optional)\n * @param subjectId - Subject ID for title generation\n * @param knowledgeAreas - Knowledge areas for title generation\n * @returns Updated payload\n */\nexport function buildPayloadWithTypeOverride<\n T extends { type: ActivityType; title: string },\n>(\n basePayload: T,\n typeOverride: ActivityType,\n customTitle: string | undefined,\n subjectId: string | null,\n knowledgeAreas: KnowledgeArea[]\n): T {\n const trimmedCustomTitle = customTitle?.trim();\n const generatedTitle = subjectId\n ? generateTitle(typeOverride, subjectId, knowledgeAreas)\n : generateMultiSubjectTitle(typeOverride);\n const title =\n trimmedCustomTitle && trimmedCustomTitle.length > 0\n ? trimmedCustomTitle\n : generatedTitle;\n\n return {\n ...basePayload,\n type: typeOverride,\n title,\n };\n}\n\n/**\n * Check if URL needs to be updated based on activity state\n *\n * @param activityId - Current activity ID\n * @param activityType - Current activity type\n * @param currentUrlType - Current URL type param\n * @param currentUrlId - Current URL id param\n * @returns True if URL needs update\n */\nexport function shouldUpdateUrl(\n activityId: string | undefined,\n activityType: ActivityType | undefined,\n currentUrlType: string | undefined,\n currentUrlId: string | undefined\n): boolean {\n if (!activityId || !activityType) {\n return false;\n }\n const urlType = getTypeFromUrl(activityType);\n return (\n !currentUrlType ||\n !currentUrlId ||\n currentUrlId !== activityId ||\n currentUrlType !== urlType\n );\n}\n\n/**\n * Pre-filters input type\n */\ntype PreFiltersInput =\n | BackendFiltersFormat\n | { filters?: BackendFiltersFormat | null }\n | null;\n\n/**\n * Resolve pre-filters from various input formats\n *\n * @param preFilters - Pre-filters in various formats\n * @returns Resolved BackendFiltersFormat or null\n */\nexport function resolvePreFilters(\n preFilters: PreFiltersInput\n): BackendFiltersFormat | null | undefined {\n if (!preFilters) {\n return null;\n }\n if (\n typeof preFilters === 'object' &&\n preFilters !== null &&\n 'filters' in preFilters\n ) {\n return preFilters.filters;\n }\n return preFilters as BackendFiltersFormat;\n}\n\n/**\n * Get initial filters data from activity or pre-filters\n *\n * @param activityFilters - Activity filters\n * @param resolvedPreFilters - Resolved pre-filters\n * @returns ActivityFiltersData or null\n */\nexport function getInitialFiltersData(\n activityFilters: BackendFiltersFormat | undefined,\n resolvedPreFilters: BackendFiltersFormat | null | undefined\n): ActivityFiltersData | null {\n if (activityFilters) {\n return convertBackendFiltersToActivityFiltersData(activityFilters);\n }\n if (resolvedPreFilters) {\n return convertBackendFiltersToActivityFiltersData(resolvedPreFilters);\n }\n return null;\n}\n\n/**\n * Parameters for checking if save should trigger on reorder\n */\ninterface ReorderSaveCheckParams {\n hasFirstSaveBeenDone: boolean;\n subjectIds: string[] | undefined;\n loadingInitialQuestions: boolean;\n isSaving: boolean;\n}\n\n/**\n * Check if save should be triggered after reordering questions\n *\n * @param params - Check parameters\n * @returns True if save should be triggered\n */\nexport function shouldTriggerSaveOnReorder(\n params: ReorderSaveCheckParams\n): boolean {\n const {\n hasFirstSaveBeenDone,\n subjectIds,\n loadingInitialQuestions,\n isSaving,\n } = params;\n const hasSubjectIds = Array.isArray(subjectIds) && subjectIds.length > 0;\n return (\n hasFirstSaveBeenDone &&\n hasSubjectIds &&\n !loadingInitialQuestions &&\n !isSaving\n );\n}\n\n/**\n * Check if filters have required subject IDs\n *\n * @param subjectIds - Subject IDs from filters\n * @returns True if at least one subject ID exists\n */\nexport function hasRequiredSubjectIds(\n subjectIds: string[] | undefined\n): boolean {\n return Array.isArray(subjectIds) && subjectIds.length > 0;\n}\n\n/**\n * Check if should save draft before adding to lesson\n *\n * @param questionsCount - Number of questions\n * @param activityDraftId - Current draft ID\n * @returns True if draft should be saved\n */\nexport function shouldSaveDraftBeforeAddingToLesson(\n questionsCount: number,\n activityDraftId: string | null | undefined\n): boolean {\n return questionsCount > 0 || !!activityDraftId;\n}\n\n/**\n * Check if should use custom callback for adding activity\n *\n * @param onAddActivityToLesson - Callback function\n * @param activityDraftId - Activity draft ID\n * @returns True if custom callback should be used\n */\nexport function shouldUseCustomAddActivityCallback(\n onAddActivityToLesson: ((id: string) => void) | undefined,\n activityDraftId: string | null | undefined\n): boolean {\n return !!(onAddActivityToLesson && activityDraftId);\n}\n\n/**\n * Check if should add activity to lesson draft automatically\n *\n * @param activityDraftId - Activity draft ID\n * @param recommendedLessonDraftId - Recommended lesson draft ID\n * @returns True if should add automatically\n */\nexport function shouldAddActivityToLessonDraft(\n activityDraftId: string | null | undefined,\n recommendedLessonDraftId: string | undefined\n): boolean {\n return !!(activityDraftId && recommendedLessonDraftId);\n}\n"]}
|
|
@@ -8,7 +8,7 @@ var _chunkAL6GXN2Mjs = require('./chunk-AL6GXN2M.js');
|
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
|
|
11
|
-
var
|
|
11
|
+
var _chunkRQ65U5G2js = require('./chunk-RQ65U5G2.js');
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
var _chunkQ3KAPJHLjs = require('./chunk-Q3KAPJHL.js');
|
|
@@ -30,10 +30,10 @@ var _chunkYCOW5GXGjs = require('./chunk-YCOW5GXG.js');
|
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
|
|
33
|
-
var
|
|
33
|
+
var _chunkIMDS5NQLjs = require('./chunk-IMDS5NQL.js');
|
|
34
34
|
|
|
35
35
|
|
|
36
|
-
var
|
|
36
|
+
var _chunkBBFV3NDFjs = require('./chunk-BBFV3NDF.js');
|
|
37
37
|
|
|
38
38
|
|
|
39
39
|
var _chunk4XUEJUISjs = require('./chunk-4XUEJUIS.js');
|
|
@@ -209,7 +209,7 @@ var renderQuestionTrueOrFalse = ({
|
|
|
209
209
|
};
|
|
210
210
|
});
|
|
211
211
|
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
212
|
-
|
|
212
|
+
_chunkRQ65U5G2js.TrueFalseStatementList,
|
|
213
213
|
{
|
|
214
214
|
statements,
|
|
215
215
|
showCorrectness: shouldShowStatus
|
|
@@ -241,7 +241,7 @@ var renderQuestionFill = ({
|
|
|
241
241
|
question,
|
|
242
242
|
result
|
|
243
243
|
}) => {
|
|
244
|
-
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
244
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkRQ65U5G2js.FillQuestionContent, { question, result });
|
|
245
245
|
};
|
|
246
246
|
|
|
247
247
|
// src/utils/questionRenderer/image/index.tsx
|
|
@@ -250,17 +250,17 @@ var renderQuestionImage = ({
|
|
|
250
250
|
question,
|
|
251
251
|
result
|
|
252
252
|
}) => {
|
|
253
|
-
const correctPoint =
|
|
253
|
+
const correctPoint = _chunkIMDS5NQLjs.parseImageCorrectPoint.call(void 0,
|
|
254
254
|
_optionalChain([question, 'optionalAccess', _47 => _47.options])
|
|
255
255
|
);
|
|
256
|
-
const studentPoint =
|
|
256
|
+
const studentPoint = _chunkIMDS5NQLjs.parseImageStudentPoint.call(void 0, result);
|
|
257
257
|
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
258
|
-
|
|
258
|
+
_chunkIMDS5NQLjs.ImageAnswerView,
|
|
259
259
|
{
|
|
260
260
|
imageUrl: _nullishCoalesce(_optionalChain([question, 'optionalAccess', _48 => _48.additionalContent]), () => ( "")),
|
|
261
261
|
correctPoint,
|
|
262
262
|
studentPoint,
|
|
263
|
-
toleranceRadius: _nullishCoalesce(_optionalChain([result, 'optionalAccess', _49 => _49.imageTolerance]), () => (
|
|
263
|
+
toleranceRadius: _nullishCoalesce(_optionalChain([result, 'optionalAccess', _49 => _49.imageTolerance]), () => ( _chunkIMDS5NQLjs.DEFAULT_IMAGE_TOLERANCE))
|
|
264
264
|
}
|
|
265
265
|
);
|
|
266
266
|
};
|
|
@@ -336,20 +336,20 @@ var renderQuestionConnectDots = ({
|
|
|
336
336
|
{
|
|
337
337
|
className: _chunkTN3AYOMVjs.cn.call(void 0,
|
|
338
338
|
"grid grid-cols-[1fr_auto] items-center gap-4 p-2 rounded-md border",
|
|
339
|
-
canShowCorrectness && hasAnswered ?
|
|
339
|
+
canShowCorrectness && hasAnswered ? _chunkIMDS5NQLjs.getStatusStyles.call(void 0, variantCorrect) : ""
|
|
340
340
|
),
|
|
341
341
|
children: [
|
|
342
342
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
343
343
|
_chunk5W7C4GZVjs.HtmlMathRenderer_default,
|
|
344
344
|
{
|
|
345
|
-
content:
|
|
345
|
+
content: _chunkBBFV3NDFjs.prependLetterToHtml.call(void 0,
|
|
346
346
|
getLetterByIndex(index),
|
|
347
347
|
pair.leftItem
|
|
348
348
|
),
|
|
349
349
|
className: "text-text-900 text-sm"
|
|
350
350
|
}
|
|
351
351
|
),
|
|
352
|
-
canShowCorrectness && hasAnswered && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex-shrink-0", children:
|
|
352
|
+
canShowCorrectness && hasAnswered && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex-shrink-0", children: _chunkRQ65U5G2js.getStatusBadge.call(void 0, variantCorrect) })
|
|
353
353
|
]
|
|
354
354
|
}
|
|
355
355
|
),
|
|
@@ -1069,11 +1069,11 @@ var CorrectActivityModal = ({
|
|
|
1069
1069
|
const isEssayWithLocalCorrection = questionData.question.questionType === "DISSERTATIVA" /* DISSERTATIVA */ && _optionalChain([localCorrection, 'optionalAccess', _104 => _104.isSaved]) && _optionalChain([localCorrection, 'optionalAccess', _105 => _105.isCorrect]) != null;
|
|
1070
1070
|
let badgeConfig;
|
|
1071
1071
|
if (isEssayWithLocalCorrection) {
|
|
1072
|
-
const localStatus = localCorrection.isCorrect ?
|
|
1073
|
-
badgeConfig =
|
|
1072
|
+
const localStatus = localCorrection.isCorrect ? _chunkRQ65U5G2js.QUESTION_STATUS.CORRETA : _chunkRQ65U5G2js.QUESTION_STATUS.INCORRETA;
|
|
1073
|
+
badgeConfig = _chunkRQ65U5G2js.getQuestionStatusBadgeConfig.call(void 0, localStatus);
|
|
1074
1074
|
} else {
|
|
1075
|
-
const status =
|
|
1076
|
-
badgeConfig =
|
|
1075
|
+
const status = _chunkRQ65U5G2js.getQuestionStatusFromData.call(void 0, questionData);
|
|
1076
|
+
badgeConfig = _chunkRQ65U5G2js.getQuestionStatusBadgeConfig.call(void 0, status);
|
|
1077
1077
|
}
|
|
1078
1078
|
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1079
1079
|
_chunk2WW23BFOjs.CardAccordation,
|
|
@@ -1131,4 +1131,4 @@ var CorrectActivityModal_default = CorrectActivityModal;
|
|
|
1131
1131
|
|
|
1132
1132
|
|
|
1133
1133
|
exports.renderFromMap = renderFromMap; exports.CorrectActivityModal_default = CorrectActivityModal_default;
|
|
1134
|
-
//# sourceMappingURL=chunk-
|
|
1134
|
+
//# sourceMappingURL=chunk-Y7ZBWTD7.js.map
|