analytica-frontend-lib 1.0.85 → 1.0.87

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (291) hide show
  1. package/dist/Accordation/index.js +0 -1
  2. package/dist/Accordation/index.mjs +0 -1
  3. package/dist/Alert/index.js +0 -1
  4. package/dist/Alert/index.mjs +0 -1
  5. package/dist/AlertDialog/index.js +0 -1
  6. package/dist/AlertDialog/index.mjs +0 -1
  7. package/dist/Alternative/index.js +0 -1
  8. package/dist/Alternative/index.mjs +0 -1
  9. package/dist/Auth/AuthProvider/index.js +0 -1
  10. package/dist/Auth/AuthProvider/index.mjs +0 -1
  11. package/dist/Auth/ProtectedRoute/index.js +0 -1
  12. package/dist/Auth/ProtectedRoute/index.mjs +0 -1
  13. package/dist/Auth/PublicRoute/index.js +0 -1
  14. package/dist/Auth/PublicRoute/index.mjs +0 -1
  15. package/dist/Auth/getRootDomain/index.js +0 -1
  16. package/dist/Auth/getRootDomain/index.mjs +0 -1
  17. package/dist/Auth/index.js +0 -1
  18. package/dist/Auth/index.mjs +0 -1
  19. package/dist/Auth/useApiConfig/index.js +0 -1
  20. package/dist/Auth/useApiConfig/index.mjs +0 -1
  21. package/dist/Auth/useAuth/index.js +0 -1
  22. package/dist/Auth/useAuth/index.mjs +0 -1
  23. package/dist/Auth/useAuthGuard/index.js +0 -1
  24. package/dist/Auth/useAuthGuard/index.mjs +0 -1
  25. package/dist/Auth/useRouteAuth/index.js +0 -1
  26. package/dist/Auth/useRouteAuth/index.mjs +0 -1
  27. package/dist/Auth/useUrlAuthentication/index.js +0 -1
  28. package/dist/Auth/useUrlAuthentication/index.mjs +0 -1
  29. package/dist/Auth/withAuth/index.js +0 -1
  30. package/dist/Auth/withAuth/index.mjs +0 -1
  31. package/dist/Auth/zustandAuthAdapter/index.js +0 -1
  32. package/dist/Auth/zustandAuthAdapter/index.mjs +0 -1
  33. package/dist/Badge/index.js +0 -1
  34. package/dist/Badge/index.mjs +0 -1
  35. package/dist/Button/index.js +0 -1
  36. package/dist/Button/index.mjs +0 -1
  37. package/dist/Calendar/index.js +0 -1
  38. package/dist/Calendar/index.mjs +0 -1
  39. package/dist/Card/index.js +0 -1
  40. package/dist/Card/index.mjs +0 -1
  41. package/dist/CheckBox/index.js +0 -1
  42. package/dist/CheckBox/index.mjs +0 -1
  43. package/dist/Chips/index.js +0 -1
  44. package/dist/Chips/index.mjs +0 -1
  45. package/dist/Divider/index.js +0 -1
  46. package/dist/Divider/index.mjs +0 -1
  47. package/dist/DropdownMenu/index.js +0 -1
  48. package/dist/DropdownMenu/index.mjs +0 -1
  49. package/dist/IconButton/index.js +0 -1
  50. package/dist/IconButton/index.mjs +0 -1
  51. package/dist/IconRoundedButton/index.js +0 -1
  52. package/dist/IconRoundedButton/index.mjs +0 -1
  53. package/dist/Input/index.js +0 -1
  54. package/dist/Input/index.mjs +0 -1
  55. package/dist/Menu/index.js +0 -1
  56. package/dist/Menu/index.mjs +0 -1
  57. package/dist/Modal/index.js +0 -1
  58. package/dist/Modal/index.mjs +0 -1
  59. package/dist/MultipleChoice/index.js +660 -0
  60. package/dist/MultipleChoice/index.mjs +647 -0
  61. package/dist/NavButton/index.js +0 -1
  62. package/dist/NavButton/index.mjs +0 -1
  63. package/dist/NotFound/index.js +0 -1
  64. package/dist/NotFound/index.mjs +0 -1
  65. package/dist/ProgressBar/index.js +0 -1
  66. package/dist/ProgressBar/index.mjs +0 -1
  67. package/dist/ProgressCircle/index.js +0 -1
  68. package/dist/ProgressCircle/index.mjs +0 -1
  69. package/dist/Quiz/index.js +957 -298
  70. package/dist/Quiz/index.mjs +974 -297
  71. package/dist/Quiz/useQuizStore/index.js +79 -35
  72. package/dist/Quiz/useQuizStore/index.mjs +79 -35
  73. package/dist/Radio/index.js +0 -1
  74. package/dist/Radio/index.mjs +0 -1
  75. package/dist/Select/index.js +2 -3
  76. package/dist/Select/index.mjs +2 -3
  77. package/dist/SelectionButton/index.js +0 -1
  78. package/dist/SelectionButton/index.mjs +0 -1
  79. package/dist/Skeleton/index.js +0 -1
  80. package/dist/Skeleton/index.mjs +0 -1
  81. package/dist/Stepper/index.js +0 -1
  82. package/dist/Stepper/index.mjs +0 -1
  83. package/dist/Table/index.js +0 -1
  84. package/dist/Table/index.mjs +0 -1
  85. package/dist/Text/index.js +0 -1
  86. package/dist/Text/index.mjs +0 -1
  87. package/dist/TextArea/index.js +0 -1
  88. package/dist/TextArea/index.mjs +0 -1
  89. package/dist/Toast/ToastStore/index.js +0 -1
  90. package/dist/Toast/ToastStore/index.mjs +0 -1
  91. package/dist/Toast/Toaster/index.js +0 -1
  92. package/dist/Toast/Toaster/index.mjs +0 -1
  93. package/dist/Toast/index.js +0 -1
  94. package/dist/Toast/index.mjs +0 -1
  95. package/dist/index.css +46 -1
  96. package/dist/index.js +1399 -937
  97. package/dist/index.mjs +1340 -868
  98. package/dist/styles.css +46 -1
  99. package/package.json +4 -2
  100. package/dist/Accordation/index.d.mts +0 -12
  101. package/dist/Accordation/index.d.ts +0 -12
  102. package/dist/Accordation/index.js.map +0 -1
  103. package/dist/Accordation/index.mjs.map +0 -1
  104. package/dist/Alert/index.d.mts +0 -13
  105. package/dist/Alert/index.d.ts +0 -13
  106. package/dist/Alert/index.js.map +0 -1
  107. package/dist/Alert/index.mjs.map +0 -1
  108. package/dist/AlertDialog/index.d.mts +0 -36
  109. package/dist/AlertDialog/index.d.ts +0 -36
  110. package/dist/AlertDialog/index.js.map +0 -1
  111. package/dist/AlertDialog/index.mjs.map +0 -1
  112. package/dist/Alternative/index.d.mts +0 -81
  113. package/dist/Alternative/index.d.ts +0 -81
  114. package/dist/Alternative/index.js.map +0 -1
  115. package/dist/Alternative/index.mjs.map +0 -1
  116. package/dist/Auth/AuthProvider/index.d.mts +0 -3
  117. package/dist/Auth/AuthProvider/index.d.ts +0 -3
  118. package/dist/Auth/AuthProvider/index.js.map +0 -1
  119. package/dist/Auth/AuthProvider/index.mjs.map +0 -1
  120. package/dist/Auth/ProtectedRoute/index.d.mts +0 -3
  121. package/dist/Auth/ProtectedRoute/index.d.ts +0 -3
  122. package/dist/Auth/ProtectedRoute/index.js.map +0 -1
  123. package/dist/Auth/ProtectedRoute/index.mjs.map +0 -1
  124. package/dist/Auth/PublicRoute/index.d.mts +0 -3
  125. package/dist/Auth/PublicRoute/index.d.ts +0 -3
  126. package/dist/Auth/PublicRoute/index.js.map +0 -1
  127. package/dist/Auth/PublicRoute/index.mjs.map +0 -1
  128. package/dist/Auth/getRootDomain/index.d.mts +0 -3
  129. package/dist/Auth/getRootDomain/index.d.ts +0 -3
  130. package/dist/Auth/getRootDomain/index.js.map +0 -1
  131. package/dist/Auth/getRootDomain/index.mjs.map +0 -1
  132. package/dist/Auth/index.d.mts +0 -312
  133. package/dist/Auth/index.d.ts +0 -312
  134. package/dist/Auth/index.js.map +0 -1
  135. package/dist/Auth/index.mjs.map +0 -1
  136. package/dist/Auth/useApiConfig/index.d.mts +0 -43
  137. package/dist/Auth/useApiConfig/index.d.ts +0 -43
  138. package/dist/Auth/useApiConfig/index.js.map +0 -1
  139. package/dist/Auth/useApiConfig/index.mjs.map +0 -1
  140. package/dist/Auth/useAuth/index.d.mts +0 -3
  141. package/dist/Auth/useAuth/index.d.ts +0 -3
  142. package/dist/Auth/useAuth/index.js.map +0 -1
  143. package/dist/Auth/useAuth/index.mjs.map +0 -1
  144. package/dist/Auth/useAuthGuard/index.d.mts +0 -3
  145. package/dist/Auth/useAuthGuard/index.d.ts +0 -3
  146. package/dist/Auth/useAuthGuard/index.js.map +0 -1
  147. package/dist/Auth/useAuthGuard/index.mjs.map +0 -1
  148. package/dist/Auth/useRouteAuth/index.d.mts +0 -3
  149. package/dist/Auth/useRouteAuth/index.d.ts +0 -3
  150. package/dist/Auth/useRouteAuth/index.js.map +0 -1
  151. package/dist/Auth/useRouteAuth/index.mjs.map +0 -1
  152. package/dist/Auth/useUrlAuthentication/index.d.mts +0 -58
  153. package/dist/Auth/useUrlAuthentication/index.d.ts +0 -58
  154. package/dist/Auth/useUrlAuthentication/index.js.map +0 -1
  155. package/dist/Auth/useUrlAuthentication/index.mjs.map +0 -1
  156. package/dist/Auth/withAuth/index.d.mts +0 -3
  157. package/dist/Auth/withAuth/index.d.ts +0 -3
  158. package/dist/Auth/withAuth/index.js.map +0 -1
  159. package/dist/Auth/withAuth/index.mjs.map +0 -1
  160. package/dist/Auth/zustandAuthAdapter/index.d.mts +0 -75
  161. package/dist/Auth/zustandAuthAdapter/index.d.ts +0 -75
  162. package/dist/Auth/zustandAuthAdapter/index.js.map +0 -1
  163. package/dist/Auth/zustandAuthAdapter/index.mjs.map +0 -1
  164. package/dist/Badge/index.d.mts +0 -46
  165. package/dist/Badge/index.d.ts +0 -46
  166. package/dist/Badge/index.js.map +0 -1
  167. package/dist/Badge/index.mjs.map +0 -1
  168. package/dist/Button/index.d.mts +0 -45
  169. package/dist/Button/index.d.ts +0 -45
  170. package/dist/Button/index.js.map +0 -1
  171. package/dist/Button/index.mjs.map +0 -1
  172. package/dist/Calendar/index.d.mts +0 -60
  173. package/dist/Calendar/index.d.ts +0 -60
  174. package/dist/Calendar/index.js.map +0 -1
  175. package/dist/Calendar/index.mjs.map +0 -1
  176. package/dist/Card/index.d.mts +0 -150
  177. package/dist/Card/index.d.ts +0 -150
  178. package/dist/Card/index.js.map +0 -1
  179. package/dist/Card/index.mjs.map +0 -1
  180. package/dist/CheckBox/index.d.mts +0 -74
  181. package/dist/CheckBox/index.d.ts +0 -74
  182. package/dist/CheckBox/index.js.map +0 -1
  183. package/dist/CheckBox/index.mjs.map +0 -1
  184. package/dist/Chips/index.d.mts +0 -41
  185. package/dist/Chips/index.d.ts +0 -41
  186. package/dist/Chips/index.js.map +0 -1
  187. package/dist/Chips/index.mjs.map +0 -1
  188. package/dist/Divider/index.d.mts +0 -32
  189. package/dist/Divider/index.d.ts +0 -32
  190. package/dist/Divider/index.js.map +0 -1
  191. package/dist/Divider/index.mjs.map +0 -1
  192. package/dist/DropdownMenu/index.d.mts +0 -68
  193. package/dist/DropdownMenu/index.d.ts +0 -68
  194. package/dist/DropdownMenu/index.js.map +0 -1
  195. package/dist/DropdownMenu/index.mjs.map +0 -1
  196. package/dist/IconButton/index.d.mts +0 -76
  197. package/dist/IconButton/index.d.ts +0 -76
  198. package/dist/IconButton/index.js.map +0 -1
  199. package/dist/IconButton/index.mjs.map +0 -1
  200. package/dist/IconRoundedButton/index.d.mts +0 -34
  201. package/dist/IconRoundedButton/index.d.ts +0 -34
  202. package/dist/IconRoundedButton/index.js.map +0 -1
  203. package/dist/IconRoundedButton/index.mjs.map +0 -1
  204. package/dist/Input/index.d.mts +0 -27
  205. package/dist/Input/index.d.ts +0 -27
  206. package/dist/Input/index.js.map +0 -1
  207. package/dist/Input/index.mjs.map +0 -1
  208. package/dist/Menu/index.d.mts +0 -48
  209. package/dist/Menu/index.d.ts +0 -48
  210. package/dist/Menu/index.js.map +0 -1
  211. package/dist/Menu/index.mjs.map +0 -1
  212. package/dist/Modal/index.d.mts +0 -66
  213. package/dist/Modal/index.d.ts +0 -66
  214. package/dist/Modal/index.js.map +0 -1
  215. package/dist/Modal/index.mjs.map +0 -1
  216. package/dist/NavButton/index.d.mts +0 -57
  217. package/dist/NavButton/index.d.ts +0 -57
  218. package/dist/NavButton/index.js.map +0 -1
  219. package/dist/NavButton/index.mjs.map +0 -1
  220. package/dist/NotFound/index.d.mts +0 -58
  221. package/dist/NotFound/index.d.ts +0 -58
  222. package/dist/NotFound/index.js.map +0 -1
  223. package/dist/NotFound/index.mjs.map +0 -1
  224. package/dist/ProgressBar/index.d.mts +0 -95
  225. package/dist/ProgressBar/index.d.ts +0 -95
  226. package/dist/ProgressBar/index.js.map +0 -1
  227. package/dist/ProgressBar/index.mjs.map +0 -1
  228. package/dist/ProgressCircle/index.d.mts +0 -60
  229. package/dist/ProgressCircle/index.d.ts +0 -60
  230. package/dist/ProgressCircle/index.js.map +0 -1
  231. package/dist/ProgressCircle/index.mjs.map +0 -1
  232. package/dist/Quiz/index.d.mts +0 -52
  233. package/dist/Quiz/index.d.ts +0 -52
  234. package/dist/Quiz/index.js.map +0 -1
  235. package/dist/Quiz/index.mjs.map +0 -1
  236. package/dist/Quiz/useQuizStore/index.d.mts +0 -140
  237. package/dist/Quiz/useQuizStore/index.d.ts +0 -140
  238. package/dist/Quiz/useQuizStore/index.js.map +0 -1
  239. package/dist/Quiz/useQuizStore/index.mjs.map +0 -1
  240. package/dist/Radio/index.d.mts +0 -203
  241. package/dist/Radio/index.d.ts +0 -203
  242. package/dist/Radio/index.js.map +0 -1
  243. package/dist/Radio/index.mjs.map +0 -1
  244. package/dist/Select/index.d.mts +0 -58
  245. package/dist/Select/index.d.ts +0 -58
  246. package/dist/Select/index.js.map +0 -1
  247. package/dist/Select/index.mjs.map +0 -1
  248. package/dist/SelectionButton/index.d.mts +0 -57
  249. package/dist/SelectionButton/index.d.ts +0 -57
  250. package/dist/SelectionButton/index.js.map +0 -1
  251. package/dist/SelectionButton/index.mjs.map +0 -1
  252. package/dist/Skeleton/index.d.mts +0 -40
  253. package/dist/Skeleton/index.d.ts +0 -40
  254. package/dist/Skeleton/index.js.map +0 -1
  255. package/dist/Skeleton/index.mjs.map +0 -1
  256. package/dist/Stepper/index.d.mts +0 -169
  257. package/dist/Stepper/index.d.ts +0 -169
  258. package/dist/Stepper/index.js.map +0 -1
  259. package/dist/Stepper/index.mjs.map +0 -1
  260. package/dist/Table/index.d.mts +0 -17
  261. package/dist/Table/index.d.ts +0 -17
  262. package/dist/Table/index.js.map +0 -1
  263. package/dist/Table/index.mjs.map +0 -1
  264. package/dist/Text/index.d.mts +0 -58
  265. package/dist/Text/index.d.ts +0 -58
  266. package/dist/Text/index.js.map +0 -1
  267. package/dist/Text/index.mjs.map +0 -1
  268. package/dist/TextArea/index.d.mts +0 -70
  269. package/dist/TextArea/index.d.ts +0 -70
  270. package/dist/TextArea/index.js.map +0 -1
  271. package/dist/TextArea/index.mjs.map +0 -1
  272. package/dist/Toast/ToastStore/index.d.mts +0 -19
  273. package/dist/Toast/ToastStore/index.d.ts +0 -19
  274. package/dist/Toast/ToastStore/index.js.map +0 -1
  275. package/dist/Toast/ToastStore/index.mjs.map +0 -1
  276. package/dist/Toast/Toaster/index.d.mts +0 -16
  277. package/dist/Toast/Toaster/index.d.ts +0 -16
  278. package/dist/Toast/Toaster/index.js.map +0 -1
  279. package/dist/Toast/Toaster/index.mjs.map +0 -1
  280. package/dist/Toast/index.d.mts +0 -17
  281. package/dist/Toast/index.d.ts +0 -17
  282. package/dist/Toast/index.js.map +0 -1
  283. package/dist/Toast/index.mjs.map +0 -1
  284. package/dist/index.css.map +0 -1
  285. package/dist/index.d.mts +0 -41
  286. package/dist/index.d.ts +0 -41
  287. package/dist/index.js.map +0 -1
  288. package/dist/index.mjs.map +0 -1
  289. package/dist/styles.css.map +0 -1
  290. package/dist/styles.d.mts +0 -2
  291. package/dist/styles.d.ts +0 -2
@@ -1,140 +0,0 @@
1
- import * as zustand from 'zustand';
2
-
3
- declare enum QUESTION_DIFFICULTY {
4
- FACIL = "FACIL",
5
- MEDIO = "MEDIO",
6
- DIFICIL = "DIFICIL"
7
- }
8
- declare enum QUESTION_TYPE {
9
- ALTERNATIVA = "ALTERNATIVA",
10
- DISSERTATIVA = "DISSERTATIVA",
11
- MULTIPLA_CHOICE = "MULTIPLA_CHOICE"
12
- }
13
- declare enum QUESTION_STATUS {
14
- APROVADO = "APROVADO",
15
- REPROVADO = "REPROVADO"
16
- }
17
- interface Question {
18
- id: string;
19
- questionText: string;
20
- correctOptionId: string;
21
- description: string;
22
- type: QUESTION_TYPE;
23
- status: QUESTION_STATUS;
24
- difficulty: QUESTION_DIFFICULTY;
25
- examBoard: string | null;
26
- examYear: string | null;
27
- answerKey: string | null;
28
- createdAt: string;
29
- updatedAt: string;
30
- knowledgeMatrix: {
31
- areaKnowledgeId: string;
32
- subjectId: string;
33
- topicId: string;
34
- subtopicId: string;
35
- contentId: string;
36
- }[];
37
- options: {
38
- id: string;
39
- option: string;
40
- }[];
41
- createdBy: string;
42
- }
43
- interface Simulado {
44
- id: string;
45
- title: string;
46
- category: string;
47
- questions: Question[];
48
- }
49
- interface Atividade {
50
- id: string;
51
- title: string;
52
- questions: Question[];
53
- }
54
- interface Aula {
55
- id: string;
56
- title: string;
57
- questions: Question[];
58
- }
59
- interface UserAnswerItem {
60
- questionId: string;
61
- activityId: string;
62
- userId: string;
63
- answer: string | null;
64
- optionId: string | null;
65
- }
66
- interface UserAnswer extends Question {
67
- isSkipped: boolean;
68
- }
69
- interface QuizState {
70
- bySimulated?: Simulado;
71
- byActivity?: Atividade;
72
- byQuestionary?: Aula;
73
- currentQuestionIndex: number;
74
- selectedAnswers: Record<string, string>;
75
- userAnswers: UserAnswerItem[];
76
- timeElapsed: number;
77
- isStarted: boolean;
78
- isFinished: boolean;
79
- userId: string;
80
- setBySimulated: (simulado: Simulado) => void;
81
- setByActivity: (atividade: Atividade) => void;
82
- setByQuestionary: (aula: Aula) => void;
83
- setUserId: (userId: string) => void;
84
- goToNextQuestion: () => void;
85
- goToPreviousQuestion: () => void;
86
- goToQuestion: (index: number) => void;
87
- getActiveQuiz: () => {
88
- quiz: Simulado | Atividade | Aula;
89
- type: 'bySimulated' | 'byActivity' | 'byQuestionary';
90
- } | null;
91
- selectAnswer: (questionId: string, answerId: string) => void;
92
- skipQuestion: () => void;
93
- addUserAnswer: (questionId: string, answerId?: string) => void;
94
- startQuiz: () => void;
95
- finishQuiz: () => void;
96
- resetQuiz: () => void;
97
- updateTime: (time: number) => void;
98
- startTimer: () => void;
99
- stopTimer: () => void;
100
- getCurrentQuestion: () => Question | null;
101
- getTotalQuestions: () => number;
102
- getAnsweredQuestions: () => number;
103
- getUnansweredQuestions: () => number[];
104
- getSkippedQuestions: () => number;
105
- getProgress: () => number;
106
- isQuestionAnswered: (questionId: string) => boolean;
107
- isQuestionSkipped: (questionId: string) => boolean;
108
- getCurrentAnswer: () => string | undefined;
109
- getQuizTitle: () => string;
110
- formatTime: (seconds: number) => string;
111
- getUserAnswers: () => UserAnswer[];
112
- getUnansweredQuestionsFromUserAnswers: () => number[];
113
- getQuestionsGroupedBySubject: () => {
114
- [key: string]: Question[];
115
- };
116
- getUserId: () => string;
117
- getUserAnswerByQuestionId: (questionId: string) => UserAnswerItem | null;
118
- isQuestionAnsweredByUserAnswers: (questionId: string) => boolean;
119
- getQuestionStatusFromUserAnswers: (questionId: string) => 'answered' | 'unanswered' | 'skipped';
120
- getUserAnswersForActivity: () => UserAnswerItem[];
121
- }
122
- declare const useQuizStore: zustand.UseBoundStore<Omit<zustand.StoreApi<QuizState>, "setState" | "devtools"> & {
123
- setState(partial: QuizState | Partial<QuizState> | ((state: QuizState) => QuizState | Partial<QuizState>), replace?: false | undefined, action?: (string | {
124
- [x: string]: unknown;
125
- [x: number]: unknown;
126
- [x: symbol]: unknown;
127
- type: string;
128
- }) | undefined): void;
129
- setState(state: QuizState | ((state: QuizState) => QuizState), replace: true, action?: (string | {
130
- [x: string]: unknown;
131
- [x: number]: unknown;
132
- [x: symbol]: unknown;
133
- type: string;
134
- }) | undefined): void;
135
- devtools: {
136
- cleanup: () => void;
137
- };
138
- }>;
139
-
140
- export { QUESTION_DIFFICULTY, QUESTION_STATUS, QUESTION_TYPE, type Question, useQuizStore };
@@ -1,140 +0,0 @@
1
- import * as zustand from 'zustand';
2
-
3
- declare enum QUESTION_DIFFICULTY {
4
- FACIL = "FACIL",
5
- MEDIO = "MEDIO",
6
- DIFICIL = "DIFICIL"
7
- }
8
- declare enum QUESTION_TYPE {
9
- ALTERNATIVA = "ALTERNATIVA",
10
- DISSERTATIVA = "DISSERTATIVA",
11
- MULTIPLA_CHOICE = "MULTIPLA_CHOICE"
12
- }
13
- declare enum QUESTION_STATUS {
14
- APROVADO = "APROVADO",
15
- REPROVADO = "REPROVADO"
16
- }
17
- interface Question {
18
- id: string;
19
- questionText: string;
20
- correctOptionId: string;
21
- description: string;
22
- type: QUESTION_TYPE;
23
- status: QUESTION_STATUS;
24
- difficulty: QUESTION_DIFFICULTY;
25
- examBoard: string | null;
26
- examYear: string | null;
27
- answerKey: string | null;
28
- createdAt: string;
29
- updatedAt: string;
30
- knowledgeMatrix: {
31
- areaKnowledgeId: string;
32
- subjectId: string;
33
- topicId: string;
34
- subtopicId: string;
35
- contentId: string;
36
- }[];
37
- options: {
38
- id: string;
39
- option: string;
40
- }[];
41
- createdBy: string;
42
- }
43
- interface Simulado {
44
- id: string;
45
- title: string;
46
- category: string;
47
- questions: Question[];
48
- }
49
- interface Atividade {
50
- id: string;
51
- title: string;
52
- questions: Question[];
53
- }
54
- interface Aula {
55
- id: string;
56
- title: string;
57
- questions: Question[];
58
- }
59
- interface UserAnswerItem {
60
- questionId: string;
61
- activityId: string;
62
- userId: string;
63
- answer: string | null;
64
- optionId: string | null;
65
- }
66
- interface UserAnswer extends Question {
67
- isSkipped: boolean;
68
- }
69
- interface QuizState {
70
- bySimulated?: Simulado;
71
- byActivity?: Atividade;
72
- byQuestionary?: Aula;
73
- currentQuestionIndex: number;
74
- selectedAnswers: Record<string, string>;
75
- userAnswers: UserAnswerItem[];
76
- timeElapsed: number;
77
- isStarted: boolean;
78
- isFinished: boolean;
79
- userId: string;
80
- setBySimulated: (simulado: Simulado) => void;
81
- setByActivity: (atividade: Atividade) => void;
82
- setByQuestionary: (aula: Aula) => void;
83
- setUserId: (userId: string) => void;
84
- goToNextQuestion: () => void;
85
- goToPreviousQuestion: () => void;
86
- goToQuestion: (index: number) => void;
87
- getActiveQuiz: () => {
88
- quiz: Simulado | Atividade | Aula;
89
- type: 'bySimulated' | 'byActivity' | 'byQuestionary';
90
- } | null;
91
- selectAnswer: (questionId: string, answerId: string) => void;
92
- skipQuestion: () => void;
93
- addUserAnswer: (questionId: string, answerId?: string) => void;
94
- startQuiz: () => void;
95
- finishQuiz: () => void;
96
- resetQuiz: () => void;
97
- updateTime: (time: number) => void;
98
- startTimer: () => void;
99
- stopTimer: () => void;
100
- getCurrentQuestion: () => Question | null;
101
- getTotalQuestions: () => number;
102
- getAnsweredQuestions: () => number;
103
- getUnansweredQuestions: () => number[];
104
- getSkippedQuestions: () => number;
105
- getProgress: () => number;
106
- isQuestionAnswered: (questionId: string) => boolean;
107
- isQuestionSkipped: (questionId: string) => boolean;
108
- getCurrentAnswer: () => string | undefined;
109
- getQuizTitle: () => string;
110
- formatTime: (seconds: number) => string;
111
- getUserAnswers: () => UserAnswer[];
112
- getUnansweredQuestionsFromUserAnswers: () => number[];
113
- getQuestionsGroupedBySubject: () => {
114
- [key: string]: Question[];
115
- };
116
- getUserId: () => string;
117
- getUserAnswerByQuestionId: (questionId: string) => UserAnswerItem | null;
118
- isQuestionAnsweredByUserAnswers: (questionId: string) => boolean;
119
- getQuestionStatusFromUserAnswers: (questionId: string) => 'answered' | 'unanswered' | 'skipped';
120
- getUserAnswersForActivity: () => UserAnswerItem[];
121
- }
122
- declare const useQuizStore: zustand.UseBoundStore<Omit<zustand.StoreApi<QuizState>, "setState" | "devtools"> & {
123
- setState(partial: QuizState | Partial<QuizState> | ((state: QuizState) => QuizState | Partial<QuizState>), replace?: false | undefined, action?: (string | {
124
- [x: string]: unknown;
125
- [x: number]: unknown;
126
- [x: symbol]: unknown;
127
- type: string;
128
- }) | undefined): void;
129
- setState(state: QuizState | ((state: QuizState) => QuizState), replace: true, action?: (string | {
130
- [x: string]: unknown;
131
- [x: number]: unknown;
132
- [x: symbol]: unknown;
133
- type: string;
134
- }) | undefined): void;
135
- devtools: {
136
- cleanup: () => void;
137
- };
138
- }>;
139
-
140
- export { QUESTION_DIFFICULTY, QUESTION_STATUS, QUESTION_TYPE, type Question, useQuizStore };
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/components/Quiz/useQuizStore.ts"],"sourcesContent":["import { create } from 'zustand';\nimport { devtools } from 'zustand/middleware';\n\nexport enum QUESTION_DIFFICULTY {\n FACIL = 'FACIL',\n MEDIO = 'MEDIO',\n DIFICIL = 'DIFICIL',\n}\n\nexport enum QUESTION_TYPE {\n ALTERNATIVA = 'ALTERNATIVA',\n DISSERTATIVA = 'DISSERTATIVA',\n MULTIPLA_CHOICE = 'MULTIPLA_CHOICE',\n}\n\nexport enum QUESTION_STATUS {\n APROVADO = 'APROVADO',\n REPROVADO = 'REPROVADO',\n}\n\nexport interface Question {\n id: string;\n questionText: string;\n correctOptionId: string;\n description: string;\n type: QUESTION_TYPE;\n status: QUESTION_STATUS;\n difficulty: QUESTION_DIFFICULTY;\n examBoard: string | null;\n examYear: string | null;\n answerKey: string | null;\n createdAt: string;\n updatedAt: string;\n knowledgeMatrix: {\n areaKnowledgeId: string;\n subjectId: string;\n topicId: string;\n subtopicId: string;\n contentId: string;\n }[];\n options: {\n id: string;\n option: string;\n }[];\n createdBy: string;\n}\n\ninterface Simulado {\n id: string;\n title: string;\n category: string;\n questions: Question[];\n}\n\ninterface Atividade {\n id: string;\n title: string;\n questions: Question[];\n}\n\ninterface Aula {\n id: string;\n title: string;\n questions: Question[];\n}\n\ninterface UserAnswerItem {\n questionId: string;\n activityId: string;\n userId: string;\n answer: string | null;\n optionId: string | null;\n}\n\ninterface UserAnswer extends Question {\n isSkipped: boolean;\n}\n\ninterface QuizState {\n // Data\n bySimulated?: Simulado;\n byActivity?: Atividade;\n byQuestionary?: Aula;\n\n // UI State\n currentQuestionIndex: number;\n selectedAnswers: Record<string, string>;\n userAnswers: UserAnswerItem[];\n timeElapsed: number;\n isStarted: boolean;\n isFinished: boolean;\n userId: string;\n\n // Actions\n setBySimulated: (simulado: Simulado) => void;\n setByActivity: (atividade: Atividade) => void;\n setByQuestionary: (aula: Aula) => void;\n setUserId: (userId: string) => void;\n\n // Quiz Navigation\n goToNextQuestion: () => void;\n goToPreviousQuestion: () => void;\n goToQuestion: (index: number) => void;\n getActiveQuiz: () => {\n quiz: Simulado | Atividade | Aula;\n type: 'bySimulated' | 'byActivity' | 'byQuestionary';\n } | null;\n\n // Quiz Actions\n selectAnswer: (questionId: string, answerId: string) => void;\n skipQuestion: () => void;\n addUserAnswer: (questionId: string, answerId?: string) => void;\n startQuiz: () => void;\n finishQuiz: () => void;\n resetQuiz: () => void;\n\n // Timer\n updateTime: (time: number) => void;\n startTimer: () => void;\n stopTimer: () => void;\n\n // Getters\n getCurrentQuestion: () => Question | null;\n getTotalQuestions: () => number;\n getAnsweredQuestions: () => number;\n getUnansweredQuestions: () => number[];\n getSkippedQuestions: () => number;\n getProgress: () => number;\n isQuestionAnswered: (questionId: string) => boolean;\n isQuestionSkipped: (questionId: string) => boolean;\n getCurrentAnswer: () => string | undefined;\n getQuizTitle: () => string;\n formatTime: (seconds: number) => string;\n getUserAnswers: () => UserAnswer[];\n getUnansweredQuestionsFromUserAnswers: () => number[];\n getQuestionsGroupedBySubject: () => { [key: string]: Question[] };\n getUserId: () => string;\n\n // New methods for userAnswers\n getUserAnswerByQuestionId: (questionId: string) => UserAnswerItem | null;\n isQuestionAnsweredByUserAnswers: (questionId: string) => boolean;\n getQuestionStatusFromUserAnswers: (\n questionId: string\n ) => 'answered' | 'unanswered' | 'skipped';\n getUserAnswersForActivity: () => UserAnswerItem[];\n}\n\nexport const useQuizStore = create<QuizState>()(\n devtools(\n (set, get) => {\n let timerInterval: ReturnType<typeof setInterval> | null = null;\n\n const startTimer = () => {\n if (get().isFinished) {\n return;\n }\n\n if (timerInterval) {\n clearInterval(timerInterval);\n }\n\n timerInterval = setInterval(() => {\n const { timeElapsed } = get();\n set({ timeElapsed: timeElapsed + 1 });\n }, 1000);\n };\n\n const stopTimer = () => {\n if (timerInterval) {\n clearInterval(timerInterval);\n timerInterval = null;\n }\n };\n\n return {\n // Initial State\n currentQuestionIndex: 0,\n selectedAnswers: {},\n userAnswers: [],\n timeElapsed: 0,\n isStarted: false,\n isFinished: false,\n userId: '',\n\n // Setters\n setBySimulated: (simulado) => set({ bySimulated: simulado }),\n setByActivity: (atividade) => set({ byActivity: atividade }),\n setByQuestionary: (aula) => set({ byQuestionary: aula }),\n setUserId: (userId) => set({ userId }),\n getUserId: () => get().userId,\n\n // Navigation\n goToNextQuestion: () => {\n const { currentQuestionIndex, getTotalQuestions } = get();\n const totalQuestions = getTotalQuestions();\n\n if (currentQuestionIndex < totalQuestions - 1) {\n set({ currentQuestionIndex: currentQuestionIndex + 1 });\n }\n },\n\n goToPreviousQuestion: () => {\n const { currentQuestionIndex } = get();\n\n if (currentQuestionIndex > 0) {\n set({ currentQuestionIndex: currentQuestionIndex - 1 });\n }\n },\n\n goToQuestion: (index) => {\n const { getTotalQuestions } = get();\n const totalQuestions = getTotalQuestions();\n\n if (index >= 0 && index < totalQuestions) {\n set({ currentQuestionIndex: index });\n }\n },\n\n getActiveQuiz: () => {\n const { bySimulated, byActivity, byQuestionary } = get();\n if (bySimulated)\n return { quiz: bySimulated, type: 'bySimulated' as const };\n if (byActivity)\n return { quiz: byActivity, type: 'byActivity' as const };\n if (byQuestionary)\n return { quiz: byQuestionary, type: 'byQuestionary' as const };\n return null;\n },\n\n selectAnswer: (questionId, answerId) => {\n const { getActiveQuiz, userAnswers } = get();\n const activeQuiz = getActiveQuiz();\n\n if (!activeQuiz) return;\n\n const updatedQuestions = activeQuiz.quiz.questions.map((question) =>\n question.id === questionId\n ? { ...question, answerKey: answerId }\n : question\n );\n\n const updatedQuiz = {\n ...activeQuiz.quiz,\n questions: updatedQuestions,\n };\n\n const activityId = activeQuiz.quiz.id;\n const userId = get().getUserId();\n\n if (!userId) {\n console.warn('selectAnswer called before userId is set');\n return;\n }\n\n const existingAnswerIndex = userAnswers.findIndex(\n (answer) => answer.questionId === questionId\n );\n\n const newUserAnswer: UserAnswerItem = {\n questionId,\n activityId,\n userId,\n answer: answerId,\n optionId: answerId,\n };\n\n let updatedUserAnswers;\n if (existingAnswerIndex !== -1) {\n updatedUserAnswers = [...userAnswers];\n updatedUserAnswers[existingAnswerIndex] = newUserAnswer;\n } else {\n updatedUserAnswers = [...userAnswers, newUserAnswer];\n }\n\n set({\n [activeQuiz.type]: updatedQuiz,\n userAnswers: updatedUserAnswers,\n });\n },\n\n skipQuestion: () => {\n const { getCurrentQuestion, userAnswers, getActiveQuiz } = get();\n const currentQuestion = getCurrentQuestion();\n const activeQuiz = getActiveQuiz();\n\n if (!activeQuiz) return;\n\n if (currentQuestion) {\n const activityId = activeQuiz.quiz.id;\n const userId = get().getUserId();\n\n const existingAnswerIndex = userAnswers.findIndex(\n (answer) => answer.questionId === currentQuestion.id\n );\n\n const newUserAnswer: UserAnswerItem = {\n questionId: currentQuestion.id,\n activityId,\n userId,\n answer: null,\n optionId: null,\n };\n\n let updatedUserAnswers;\n if (existingAnswerIndex !== -1) {\n // Update existing answer\n updatedUserAnswers = [...userAnswers];\n updatedUserAnswers[existingAnswerIndex] = newUserAnswer;\n } else {\n // Add new answer\n updatedUserAnswers = [...userAnswers, newUserAnswer];\n }\n\n set({\n userAnswers: updatedUserAnswers,\n });\n }\n },\n\n addUserAnswer: (questionId, answerId) => {\n const { getActiveQuiz, userAnswers } = get();\n const activeQuiz = getActiveQuiz();\n\n if (!activeQuiz) return;\n\n // Add to userAnswers array with new structure\n const activityId = activeQuiz.quiz.id;\n const userId = get().getUserId();\n\n const existingAnswerIndex = userAnswers.findIndex(\n (answer) => answer.questionId === questionId\n );\n\n const newUserAnswer: UserAnswerItem = {\n questionId,\n activityId,\n userId,\n answer: answerId || null,\n optionId: answerId || null,\n };\n\n if (existingAnswerIndex !== -1) {\n // Update existing answer\n const updatedUserAnswers = [...userAnswers];\n updatedUserAnswers[existingAnswerIndex] = newUserAnswer;\n set({ userAnswers: updatedUserAnswers });\n } else {\n // Add new answer\n set({ userAnswers: [...userAnswers, newUserAnswer] });\n }\n },\n\n startQuiz: () => {\n set({ isStarted: true, timeElapsed: 0 });\n startTimer();\n },\n\n finishQuiz: () => {\n set({ isFinished: true });\n stopTimer();\n },\n\n resetQuiz: () => {\n stopTimer();\n set({\n currentQuestionIndex: 0,\n selectedAnswers: {},\n userAnswers: [],\n timeElapsed: 0,\n isStarted: false,\n isFinished: false,\n userId: '',\n });\n },\n\n // Timer\n updateTime: (time) => set({ timeElapsed: time }),\n startTimer,\n stopTimer,\n\n // Getters\n getCurrentQuestion: () => {\n const { currentQuestionIndex, getActiveQuiz } = get();\n const activeQuiz = getActiveQuiz();\n\n if (!activeQuiz) {\n return null;\n }\n\n return activeQuiz.quiz.questions[currentQuestionIndex];\n },\n\n getTotalQuestions: () => {\n const { getActiveQuiz } = get();\n const activeQuiz = getActiveQuiz();\n\n return activeQuiz?.quiz?.questions?.length || 0;\n },\n\n getAnsweredQuestions: () => {\n const { userAnswers } = get();\n return userAnswers.filter((answer) => answer.answer !== null).length;\n },\n\n getUnansweredQuestions: () => {\n const { getActiveQuiz, userAnswers } = get();\n const activeQuiz = getActiveQuiz();\n if (!activeQuiz) return [];\n\n const unansweredQuestions: number[] = [];\n\n activeQuiz.quiz.questions.forEach((question, index) => {\n const userAnswer = userAnswers.find(\n (answer) => answer.questionId === question.id\n );\n const isAnswered = userAnswer && userAnswer.answer !== null;\n const isSkipped = userAnswer && userAnswer.answer === null;\n\n if (!isAnswered && !isSkipped) {\n unansweredQuestions.push(index + 1); // index + 1 para mostrar número da questão\n }\n });\n return unansweredQuestions;\n },\n\n getSkippedQuestions: () => {\n const { userAnswers } = get();\n return userAnswers.filter((answer) => answer.answer === null).length;\n },\n\n getProgress: () => {\n const { getTotalQuestions, getAnsweredQuestions } = get();\n const total = getTotalQuestions();\n const answered = getAnsweredQuestions();\n\n return total > 0 ? (answered / total) * 100 : 0;\n },\n\n isQuestionAnswered: (questionId) => {\n const { userAnswers } = get();\n const userAnswer = userAnswers.find(\n (answer) => answer.questionId === questionId\n );\n return userAnswer ? userAnswer.answer !== null : false;\n },\n\n isQuestionSkipped: (questionId) => {\n const { userAnswers } = get();\n const userAnswer = userAnswers.find(\n (answer) => answer.questionId === questionId\n );\n return userAnswer ? userAnswer.answer === null : false;\n },\n\n getCurrentAnswer: () => {\n const { getCurrentQuestion, userAnswers } = get();\n const currentQuestion = getCurrentQuestion();\n\n if (!currentQuestion) return undefined;\n\n const userAnswer = userAnswers.find(\n (answer) => answer.questionId === currentQuestion.id\n );\n return userAnswer?.answer;\n },\n\n getQuizTitle: () => {\n const { getActiveQuiz } = get();\n const activeQuiz = getActiveQuiz();\n\n return activeQuiz?.quiz?.title || 'Quiz';\n },\n\n formatTime: (seconds: number) => {\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = seconds % 60;\n return `${minutes.toString().padStart(2, '0')}:${remainingSeconds.toString().padStart(2, '0')}`;\n },\n\n getUserAnswers: () => {\n const { getActiveQuiz, userAnswers } = get();\n const activeQuiz = getActiveQuiz();\n\n if (!activeQuiz) return [];\n\n return activeQuiz.quiz.questions.map((question) => {\n const userAnswer = userAnswers.find(\n (answer) => answer.questionId === question.id\n );\n return {\n ...question,\n isSkipped: userAnswer ? userAnswer.answer === null : false,\n };\n });\n },\n\n getUnansweredQuestionsFromUserAnswers: () => {\n const { getActiveQuiz, userAnswers } = get();\n const activeQuiz = getActiveQuiz();\n if (!activeQuiz) return [];\n\n const unansweredQuestions: number[] = [];\n\n activeQuiz.quiz.questions.forEach((question, index) => {\n const userAnswer = userAnswers.find(\n (answer) => answer.questionId === question.id\n );\n const hasAnswer = userAnswer && userAnswer.answer !== null;\n const isSkipped = userAnswer && userAnswer.answer === null;\n\n // Se não há resposta do usuário OU se a questão foi pulada\n if (!hasAnswer || isSkipped) {\n unansweredQuestions.push(index + 1); // index + 1 para mostrar número da questão\n }\n });\n\n return unansweredQuestions;\n },\n\n getQuestionsGroupedBySubject: () => {\n const { getActiveQuiz } = get();\n const activeQuiz = getActiveQuiz();\n if (!activeQuiz) return {};\n\n const groupedQuestions: { [key: string]: Question[] } = {};\n\n activeQuiz.quiz.questions.forEach((question) => {\n const subjectId =\n question.knowledgeMatrix?.[0]?.subjectId || 'Sem matéria';\n\n if (!groupedQuestions[subjectId]) {\n groupedQuestions[subjectId] = [];\n }\n\n groupedQuestions[subjectId].push(question);\n });\n\n return groupedQuestions;\n },\n\n // New methods for userAnswers\n getUserAnswerByQuestionId: (questionId) => {\n const { userAnswers } = get();\n return (\n userAnswers.find((answer) => answer.questionId === questionId) ||\n null\n );\n },\n isQuestionAnsweredByUserAnswers: (questionId) => {\n const { userAnswers } = get();\n const answer = userAnswers.find(\n (answer) => answer.questionId === questionId\n );\n return answer ? answer.answer !== null : false;\n },\n getQuestionStatusFromUserAnswers: (questionId) => {\n const { userAnswers } = get();\n const answer = userAnswers.find(\n (answer) => answer.questionId === questionId\n );\n if (!answer) return 'unanswered';\n if (answer.answer === null) return 'skipped';\n return 'answered';\n },\n getUserAnswersForActivity: () => {\n const { userAnswers } = get();\n return userAnswers;\n },\n };\n },\n {\n name: 'quiz-store',\n }\n )\n);\n"],"mappings":"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","names":["QUESTION_DIFFICULTY","QUESTION_TYPE","QUESTION_STATUS","answer"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/components/Quiz/useQuizStore.ts"],"sourcesContent":["import { create } from 'zustand';\nimport { devtools } from 'zustand/middleware';\n\nexport enum QUESTION_DIFFICULTY {\n FACIL = 'FACIL',\n MEDIO = 'MEDIO',\n DIFICIL = 'DIFICIL',\n}\n\nexport enum QUESTION_TYPE {\n ALTERNATIVA = 'ALTERNATIVA',\n DISSERTATIVA = 'DISSERTATIVA',\n MULTIPLA_CHOICE = 'MULTIPLA_CHOICE',\n}\n\nexport enum QUESTION_STATUS {\n APROVADO = 'APROVADO',\n REPROVADO = 'REPROVADO',\n}\n\nexport interface Question {\n id: string;\n questionText: string;\n correctOptionId: string;\n description: string;\n type: QUESTION_TYPE;\n status: QUESTION_STATUS;\n difficulty: QUESTION_DIFFICULTY;\n examBoard: string | null;\n examYear: string | null;\n answerKey: string | null;\n createdAt: string;\n updatedAt: string;\n knowledgeMatrix: {\n areaKnowledgeId: string;\n subjectId: string;\n topicId: string;\n subtopicId: string;\n contentId: string;\n }[];\n options: {\n id: string;\n option: string;\n }[];\n createdBy: string;\n}\n\ninterface Simulado {\n id: string;\n title: string;\n category: string;\n questions: Question[];\n}\n\ninterface Atividade {\n id: string;\n title: string;\n questions: Question[];\n}\n\ninterface Aula {\n id: string;\n title: string;\n questions: Question[];\n}\n\ninterface UserAnswerItem {\n questionId: string;\n activityId: string;\n userId: string;\n answer: string | null;\n optionId: string | null;\n}\n\ninterface UserAnswer extends Question {\n isSkipped: boolean;\n}\n\ninterface QuizState {\n // Data\n bySimulated?: Simulado;\n byActivity?: Atividade;\n byQuestionary?: Aula;\n\n // UI State\n currentQuestionIndex: number;\n selectedAnswers: Record<string, string>;\n userAnswers: UserAnswerItem[];\n timeElapsed: number;\n isStarted: boolean;\n isFinished: boolean;\n userId: string;\n\n // Actions\n setBySimulated: (simulado: Simulado) => void;\n setByActivity: (atividade: Atividade) => void;\n setByQuestionary: (aula: Aula) => void;\n setUserId: (userId: string) => void;\n\n // Quiz Navigation\n goToNextQuestion: () => void;\n goToPreviousQuestion: () => void;\n goToQuestion: (index: number) => void;\n getActiveQuiz: () => {\n quiz: Simulado | Atividade | Aula;\n type: 'bySimulated' | 'byActivity' | 'byQuestionary';\n } | null;\n\n // Quiz Actions\n selectAnswer: (questionId: string, answerId: string) => void;\n skipQuestion: () => void;\n addUserAnswer: (questionId: string, answerId?: string) => void;\n startQuiz: () => void;\n finishQuiz: () => void;\n resetQuiz: () => void;\n\n // Timer\n updateTime: (time: number) => void;\n startTimer: () => void;\n stopTimer: () => void;\n\n // Getters\n getCurrentQuestion: () => Question | null;\n getTotalQuestions: () => number;\n getAnsweredQuestions: () => number;\n getUnansweredQuestions: () => number[];\n getSkippedQuestions: () => number;\n getProgress: () => number;\n isQuestionAnswered: (questionId: string) => boolean;\n isQuestionSkipped: (questionId: string) => boolean;\n getCurrentAnswer: () => string | undefined;\n getQuizTitle: () => string;\n formatTime: (seconds: number) => string;\n getUserAnswers: () => UserAnswer[];\n getUnansweredQuestionsFromUserAnswers: () => number[];\n getQuestionsGroupedBySubject: () => { [key: string]: Question[] };\n getUserId: () => string;\n\n // New methods for userAnswers\n getUserAnswerByQuestionId: (questionId: string) => UserAnswerItem | null;\n isQuestionAnsweredByUserAnswers: (questionId: string) => boolean;\n getQuestionStatusFromUserAnswers: (\n questionId: string\n ) => 'answered' | 'unanswered' | 'skipped';\n getUserAnswersForActivity: () => UserAnswerItem[];\n}\n\nexport const useQuizStore = create<QuizState>()(\n devtools(\n (set, get) => {\n let timerInterval: ReturnType<typeof setInterval> | null = null;\n\n const startTimer = () => {\n if (get().isFinished) {\n return;\n }\n\n if (timerInterval) {\n clearInterval(timerInterval);\n }\n\n timerInterval = setInterval(() => {\n const { timeElapsed } = get();\n set({ timeElapsed: timeElapsed + 1 });\n }, 1000);\n };\n\n const stopTimer = () => {\n if (timerInterval) {\n clearInterval(timerInterval);\n timerInterval = null;\n }\n };\n\n return {\n // Initial State\n currentQuestionIndex: 0,\n selectedAnswers: {},\n userAnswers: [],\n timeElapsed: 0,\n isStarted: false,\n isFinished: false,\n userId: '',\n\n // Setters\n setBySimulated: (simulado) => set({ bySimulated: simulado }),\n setByActivity: (atividade) => set({ byActivity: atividade }),\n setByQuestionary: (aula) => set({ byQuestionary: aula }),\n setUserId: (userId) => set({ userId }),\n getUserId: () => get().userId,\n\n // Navigation\n goToNextQuestion: () => {\n const { currentQuestionIndex, getTotalQuestions } = get();\n const totalQuestions = getTotalQuestions();\n\n if (currentQuestionIndex < totalQuestions - 1) {\n set({ currentQuestionIndex: currentQuestionIndex + 1 });\n }\n },\n\n goToPreviousQuestion: () => {\n const { currentQuestionIndex } = get();\n\n if (currentQuestionIndex > 0) {\n set({ currentQuestionIndex: currentQuestionIndex - 1 });\n }\n },\n\n goToQuestion: (index) => {\n const { getTotalQuestions } = get();\n const totalQuestions = getTotalQuestions();\n\n if (index >= 0 && index < totalQuestions) {\n set({ currentQuestionIndex: index });\n }\n },\n\n getActiveQuiz: () => {\n const { bySimulated, byActivity, byQuestionary } = get();\n if (bySimulated)\n return { quiz: bySimulated, type: 'bySimulated' as const };\n if (byActivity)\n return { quiz: byActivity, type: 'byActivity' as const };\n if (byQuestionary)\n return { quiz: byQuestionary, type: 'byQuestionary' as const };\n return null;\n },\n\n selectAnswer: (questionId, answerId) => {\n const { getActiveQuiz, userAnswers } = get();\n const activeQuiz = getActiveQuiz();\n\n if (!activeQuiz) return;\n\n const updatedQuestions = activeQuiz.quiz.questions.map((question) =>\n question.id === questionId\n ? { ...question, answerKey: answerId }\n : question\n );\n\n const updatedQuiz = {\n ...activeQuiz.quiz,\n questions: updatedQuestions,\n };\n\n const activityId = activeQuiz.quiz.id;\n const userId = get().getUserId();\n\n if (!userId) {\n console.warn('selectAnswer called before userId is set');\n return;\n }\n\n const existingAnswerIndex = userAnswers.findIndex(\n (answer) => answer.questionId === questionId\n );\n\n const newUserAnswer: UserAnswerItem = {\n questionId,\n activityId,\n userId,\n answer: answerId,\n optionId: answerId,\n };\n\n let updatedUserAnswers;\n if (existingAnswerIndex !== -1) {\n updatedUserAnswers = [...userAnswers];\n updatedUserAnswers[existingAnswerIndex] = newUserAnswer;\n } else {\n updatedUserAnswers = [...userAnswers, newUserAnswer];\n }\n\n set({\n [activeQuiz.type]: updatedQuiz,\n userAnswers: updatedUserAnswers,\n });\n },\n\n skipQuestion: () => {\n const { getCurrentQuestion, userAnswers, getActiveQuiz } = get();\n const currentQuestion = getCurrentQuestion();\n const activeQuiz = getActiveQuiz();\n\n if (!activeQuiz) return;\n\n if (currentQuestion) {\n const activityId = activeQuiz.quiz.id;\n const userId = get().getUserId();\n\n const existingAnswerIndex = userAnswers.findIndex(\n (answer) => answer.questionId === currentQuestion.id\n );\n\n const newUserAnswer: UserAnswerItem = {\n questionId: currentQuestion.id,\n activityId,\n userId,\n answer: null,\n optionId: null,\n };\n\n let updatedUserAnswers;\n if (existingAnswerIndex !== -1) {\n // Update existing answer\n updatedUserAnswers = [...userAnswers];\n updatedUserAnswers[existingAnswerIndex] = newUserAnswer;\n } else {\n // Add new answer\n updatedUserAnswers = [...userAnswers, newUserAnswer];\n }\n\n set({\n userAnswers: updatedUserAnswers,\n });\n }\n },\n\n addUserAnswer: (questionId, answerId) => {\n const { getActiveQuiz, userAnswers } = get();\n const activeQuiz = getActiveQuiz();\n\n if (!activeQuiz) return;\n\n // Add to userAnswers array with new structure\n const activityId = activeQuiz.quiz.id;\n const userId = get().getUserId();\n\n const existingAnswerIndex = userAnswers.findIndex(\n (answer) => answer.questionId === questionId\n );\n\n const newUserAnswer: UserAnswerItem = {\n questionId,\n activityId,\n userId,\n answer: answerId || null,\n optionId: answerId || null,\n };\n\n if (existingAnswerIndex !== -1) {\n // Update existing answer\n const updatedUserAnswers = [...userAnswers];\n updatedUserAnswers[existingAnswerIndex] = newUserAnswer;\n set({ userAnswers: updatedUserAnswers });\n } else {\n // Add new answer\n set({ userAnswers: [...userAnswers, newUserAnswer] });\n }\n },\n\n startQuiz: () => {\n set({ isStarted: true, timeElapsed: 0 });\n startTimer();\n },\n\n finishQuiz: () => {\n set({ isFinished: true });\n stopTimer();\n },\n\n resetQuiz: () => {\n stopTimer();\n set({\n currentQuestionIndex: 0,\n selectedAnswers: {},\n userAnswers: [],\n timeElapsed: 0,\n isStarted: false,\n isFinished: false,\n userId: '',\n });\n },\n\n // Timer\n updateTime: (time) => set({ timeElapsed: time }),\n startTimer,\n stopTimer,\n\n // Getters\n getCurrentQuestion: () => {\n const { currentQuestionIndex, getActiveQuiz } = get();\n const activeQuiz = getActiveQuiz();\n\n if (!activeQuiz) {\n return null;\n }\n\n return activeQuiz.quiz.questions[currentQuestionIndex];\n },\n\n getTotalQuestions: () => {\n const { getActiveQuiz } = get();\n const activeQuiz = getActiveQuiz();\n\n return activeQuiz?.quiz?.questions?.length || 0;\n },\n\n getAnsweredQuestions: () => {\n const { userAnswers } = get();\n return userAnswers.filter((answer) => answer.answer !== null).length;\n },\n\n getUnansweredQuestions: () => {\n const { getActiveQuiz, userAnswers } = get();\n const activeQuiz = getActiveQuiz();\n if (!activeQuiz) return [];\n\n const unansweredQuestions: number[] = [];\n\n activeQuiz.quiz.questions.forEach((question, index) => {\n const userAnswer = userAnswers.find(\n (answer) => answer.questionId === question.id\n );\n const isAnswered = userAnswer && userAnswer.answer !== null;\n const isSkipped = userAnswer && userAnswer.answer === null;\n\n if (!isAnswered && !isSkipped) {\n unansweredQuestions.push(index + 1); // index + 1 para mostrar número da questão\n }\n });\n return unansweredQuestions;\n },\n\n getSkippedQuestions: () => {\n const { userAnswers } = get();\n return userAnswers.filter((answer) => answer.answer === null).length;\n },\n\n getProgress: () => {\n const { getTotalQuestions, getAnsweredQuestions } = get();\n const total = getTotalQuestions();\n const answered = getAnsweredQuestions();\n\n return total > 0 ? (answered / total) * 100 : 0;\n },\n\n isQuestionAnswered: (questionId) => {\n const { userAnswers } = get();\n const userAnswer = userAnswers.find(\n (answer) => answer.questionId === questionId\n );\n return userAnswer ? userAnswer.answer !== null : false;\n },\n\n isQuestionSkipped: (questionId) => {\n const { userAnswers } = get();\n const userAnswer = userAnswers.find(\n (answer) => answer.questionId === questionId\n );\n return userAnswer ? userAnswer.answer === null : false;\n },\n\n getCurrentAnswer: () => {\n const { getCurrentQuestion, userAnswers } = get();\n const currentQuestion = getCurrentQuestion();\n\n if (!currentQuestion) return undefined;\n\n const userAnswer = userAnswers.find(\n (answer) => answer.questionId === currentQuestion.id\n );\n return userAnswer?.answer;\n },\n\n getQuizTitle: () => {\n const { getActiveQuiz } = get();\n const activeQuiz = getActiveQuiz();\n\n return activeQuiz?.quiz?.title || 'Quiz';\n },\n\n formatTime: (seconds: number) => {\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = seconds % 60;\n return `${minutes.toString().padStart(2, '0')}:${remainingSeconds.toString().padStart(2, '0')}`;\n },\n\n getUserAnswers: () => {\n const { getActiveQuiz, userAnswers } = get();\n const activeQuiz = getActiveQuiz();\n\n if (!activeQuiz) return [];\n\n return activeQuiz.quiz.questions.map((question) => {\n const userAnswer = userAnswers.find(\n (answer) => answer.questionId === question.id\n );\n return {\n ...question,\n isSkipped: userAnswer ? userAnswer.answer === null : false,\n };\n });\n },\n\n getUnansweredQuestionsFromUserAnswers: () => {\n const { getActiveQuiz, userAnswers } = get();\n const activeQuiz = getActiveQuiz();\n if (!activeQuiz) return [];\n\n const unansweredQuestions: number[] = [];\n\n activeQuiz.quiz.questions.forEach((question, index) => {\n const userAnswer = userAnswers.find(\n (answer) => answer.questionId === question.id\n );\n const hasAnswer = userAnswer && userAnswer.answer !== null;\n const isSkipped = userAnswer && userAnswer.answer === null;\n\n // Se não há resposta do usuário OU se a questão foi pulada\n if (!hasAnswer || isSkipped) {\n unansweredQuestions.push(index + 1); // index + 1 para mostrar número da questão\n }\n });\n\n return unansweredQuestions;\n },\n\n getQuestionsGroupedBySubject: () => {\n const { getActiveQuiz } = get();\n const activeQuiz = getActiveQuiz();\n if (!activeQuiz) return {};\n\n const groupedQuestions: { [key: string]: Question[] } = {};\n\n activeQuiz.quiz.questions.forEach((question) => {\n const subjectId =\n question.knowledgeMatrix?.[0]?.subjectId || 'Sem matéria';\n\n if (!groupedQuestions[subjectId]) {\n groupedQuestions[subjectId] = [];\n }\n\n groupedQuestions[subjectId].push(question);\n });\n\n return groupedQuestions;\n },\n\n // New methods for userAnswers\n getUserAnswerByQuestionId: (questionId) => {\n const { userAnswers } = get();\n return (\n userAnswers.find((answer) => answer.questionId === questionId) ||\n null\n );\n },\n isQuestionAnsweredByUserAnswers: (questionId) => {\n const { userAnswers } = get();\n const answer = userAnswers.find(\n (answer) => answer.questionId === questionId\n );\n return answer ? answer.answer !== null : false;\n },\n getQuestionStatusFromUserAnswers: (questionId) => {\n const { userAnswers } = get();\n const answer = userAnswers.find(\n (answer) => answer.questionId === questionId\n );\n if (!answer) return 'unanswered';\n if (answer.answer === null) return 'skipped';\n return 'answered';\n },\n getUserAnswersForActivity: () => {\n const { userAnswers } = get();\n return userAnswers;\n },\n };\n },\n {\n name: 'quiz-store',\n }\n )\n);\n"],"mappings":"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","names":["QUESTION_DIFFICULTY","QUESTION_TYPE","QUESTION_STATUS","answer"]}
@@ -1,203 +0,0 @@
1
- import * as react from 'react';
2
- import { ReactNode, InputHTMLAttributes, HTMLAttributes } from 'react';
3
- import { StoreApi } from 'zustand';
4
-
5
- /**
6
- * Radio size variants
7
- */
8
- type RadioSize = 'small' | 'medium' | 'large' | 'extraLarge';
9
- /**
10
- * Radio visual state
11
- */
12
- type RadioState = 'default' | 'hovered' | 'focused' | 'invalid' | 'disabled';
13
- /**
14
- * Radio component props interface
15
- */
16
- type RadioProps = {
17
- /** Label text to display next to the radio */
18
- label?: ReactNode;
19
- /** Size variant of the radio */
20
- size?: RadioSize;
21
- /** Visual state of the radio */
22
- state?: RadioState;
23
- /** Error message to display */
24
- errorMessage?: string;
25
- /** Helper text to display */
26
- helperText?: string;
27
- /** Additional CSS classes */
28
- className?: string;
29
- /** Label CSS classes */
30
- labelClassName?: string;
31
- /** Radio group name */
32
- name?: string;
33
- /** Radio value */
34
- value?: string;
35
- /** Default checked state for uncontrolled radios */
36
- defaultChecked?: boolean;
37
- } & Omit<InputHTMLAttributes<HTMLInputElement>, 'size' | 'type' | 'defaultChecked'>;
38
- /**
39
- * Radio component for Analytica Ensino platforms
40
- *
41
- * A radio button component with essential states, sizes and themes.
42
- * Uses the Analytica Ensino Design System colors from styles.css with automatic
43
- * light/dark mode support. Includes Text component integration for consistent typography.
44
- *
45
- * @example
46
- * ```tsx
47
- * // Basic radio
48
- * <Radio name="option" value="1" label="Option 1" />
49
- *
50
- * // Small size
51
- * <Radio size="small" name="option" value="2" label="Small option" />
52
- *
53
- * // Invalid state
54
- * <Radio state="invalid" name="option" value="3" label="Required field" />
55
- *
56
- * // Disabled state
57
- * <Radio disabled name="option" value="4" label="Disabled option" />
58
- *
59
- * // Default checked (uncontrolled)
60
- * <Radio defaultChecked name="option" value="5" label="Initially checked" />
61
- * ```
62
- */
63
- declare const Radio: react.ForwardRefExoticComponent<{
64
- /** Label text to display next to the radio */
65
- label?: ReactNode;
66
- /** Size variant of the radio */
67
- size?: RadioSize;
68
- /** Visual state of the radio */
69
- state?: RadioState;
70
- /** Error message to display */
71
- errorMessage?: string;
72
- /** Helper text to display */
73
- helperText?: string;
74
- /** Additional CSS classes */
75
- className?: string;
76
- /** Label CSS classes */
77
- labelClassName?: string;
78
- /** Radio group name */
79
- name?: string;
80
- /** Radio value */
81
- value?: string;
82
- /** Default checked state for uncontrolled radios */
83
- defaultChecked?: boolean;
84
- } & Omit<InputHTMLAttributes<HTMLInputElement>, "size" | "defaultChecked" | "type"> & react.RefAttributes<HTMLInputElement>>;
85
- /**
86
- * RadioGroup store interface
87
- */
88
- interface RadioGroupStore {
89
- value: string;
90
- setValue: (value: string) => void;
91
- onValueChange?: (value: string) => void;
92
- disabled: boolean;
93
- name: string;
94
- }
95
- type RadioGroupStoreApi = StoreApi<RadioGroupStore>;
96
- /**
97
- * Hook to access RadioGroup store
98
- */
99
- declare const useRadioGroupStore: (externalStore?: RadioGroupStoreApi) => RadioGroupStoreApi;
100
- /**
101
- * RadioGroup component props interface
102
- */
103
- type RadioGroupProps = {
104
- /** Current selected value */
105
- value?: string;
106
- /** Default selected value for uncontrolled usage */
107
- defaultValue?: string;
108
- /** Callback when selection changes */
109
- onValueChange?: (value: string) => void;
110
- /** Group name for all radios */
111
- name?: string;
112
- /** Disabled state for the entire group */
113
- disabled?: boolean;
114
- /** Additional CSS classes */
115
- className?: string;
116
- /** Children components */
117
- children: ReactNode;
118
- } & Omit<HTMLAttributes<HTMLDivElement>, 'onChange' | 'defaultValue'>;
119
- /**
120
- * RadioGroup component for flexible radio group composition
121
- *
122
- * Uses Zustand for state management with automatic store injection.
123
- * Allows complete control over layout and styling by composing with RadioGroupItem.
124
- *
125
- * @example
126
- * ```tsx
127
- * <RadioGroup defaultValue="option1" onValueChange={setValue}>
128
- * <div className="flex items-center gap-3">
129
- * <RadioGroupItem value="option1" id="r1" />
130
- * <label htmlFor="r1">Option 1</label>
131
- * </div>
132
- * <div className="flex items-center gap-3">
133
- * <RadioGroupItem value="option2" id="r2" />
134
- * <label htmlFor="r2">Option 2</label>
135
- * </div>
136
- * </RadioGroup>
137
- * ```
138
- */
139
- declare const RadioGroup: react.ForwardRefExoticComponent<{
140
- /** Current selected value */
141
- value?: string;
142
- /** Default selected value for uncontrolled usage */
143
- defaultValue?: string;
144
- /** Callback when selection changes */
145
- onValueChange?: (value: string) => void;
146
- /** Group name for all radios */
147
- name?: string;
148
- /** Disabled state for the entire group */
149
- disabled?: boolean;
150
- /** Additional CSS classes */
151
- className?: string;
152
- /** Children components */
153
- children: ReactNode;
154
- } & Omit<HTMLAttributes<HTMLDivElement>, "defaultValue" | "onChange"> & react.RefAttributes<HTMLDivElement>>;
155
- /**
156
- * RadioGroupItem component props interface
157
- */
158
- type RadioGroupItemProps = {
159
- /** Value for this radio item */
160
- value: string;
161
- /** Store reference (automatically injected by RadioGroup) */
162
- store?: RadioGroupStoreApi;
163
- /** Disabled state for this specific item */
164
- disabled?: boolean;
165
- /** Size variant */
166
- size?: RadioSize;
167
- /** Visual state */
168
- state?: RadioState;
169
- /** Additional CSS classes */
170
- className?: string;
171
- } & Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'name' | 'value' | 'checked' | 'onChange' | 'size'>;
172
- /**
173
- * RadioGroupItem component for use within RadioGroup
174
- *
175
- * A radio button without label that works within RadioGroup context.
176
- * Provides just the radio input for maximum flexibility in composition.
177
- *
178
- * @example
179
- * ```tsx
180
- * <RadioGroup defaultValue="option1">
181
- * <div className="flex items-center gap-3">
182
- * <RadioGroupItem value="option1" id="r1" />
183
- * <label htmlFor="r1">Option 1</label>
184
- * </div>
185
- * </RadioGroup>
186
- * ```
187
- */
188
- declare const RadioGroupItem: react.ForwardRefExoticComponent<{
189
- /** Value for this radio item */
190
- value: string;
191
- /** Store reference (automatically injected by RadioGroup) */
192
- store?: RadioGroupStoreApi;
193
- /** Disabled state for this specific item */
194
- disabled?: boolean;
195
- /** Size variant */
196
- size?: RadioSize;
197
- /** Visual state */
198
- state?: RadioState;
199
- /** Additional CSS classes */
200
- className?: string;
201
- } & Omit<InputHTMLAttributes<HTMLInputElement>, "size" | "value" | "checked" | "type" | "name" | "onChange"> & react.RefAttributes<HTMLInputElement>>;
202
-
203
- export { RadioGroup, RadioGroupItem, type RadioGroupItemProps, type RadioGroupProps, type RadioProps, Radio as default, useRadioGroupStore };