analytica-frontend-lib 1.1.9 → 1.1.11

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.
@@ -18,8 +18,10 @@ var QUESTION_TYPE = /* @__PURE__ */ ((QUESTION_TYPE2) => {
18
18
  return QUESTION_TYPE2;
19
19
  })(QUESTION_TYPE || {});
20
20
  var QUESTION_STATUS = /* @__PURE__ */ ((QUESTION_STATUS2) => {
21
- QUESTION_STATUS2["APROVADO"] = "APROVADO";
22
- QUESTION_STATUS2["REPROVADO"] = "REPROVADO";
21
+ QUESTION_STATUS2["PENDENTE_AVALIACAO"] = "PENDENTE_AVALIACAO";
22
+ QUESTION_STATUS2["RESPOSTA_CORRETA"] = "RESPOSTA_CORRETA";
23
+ QUESTION_STATUS2["RESPOSTA_INCORRETA"] = "RESPOSTA_INCORRETA";
24
+ QUESTION_STATUS2["NAO_RESPONDIDO"] = "NAO_RESPONDIDO";
23
25
  return QUESTION_STATUS2;
24
26
  })(QUESTION_STATUS || {});
25
27
  var ANSWER_STATUS = /* @__PURE__ */ ((ANSWER_STATUS2) => {
@@ -60,6 +62,8 @@ var useQuizStore = create()(
60
62
  isFinished: false,
61
63
  userId: "",
62
64
  variant: "default",
65
+ questionsResult: null,
66
+ currentQuestionResult: null,
63
67
  // Setters
64
68
  setBySimulated: (simulado) => set({ bySimulated: simulado }),
65
69
  setByActivity: (atividade) => set({ byActivity: atividade }),
@@ -68,6 +72,7 @@ var useQuizStore = create()(
68
72
  setUserAnswers: (userAnswers) => set({ userAnswers }),
69
73
  getUserId: () => get().userId,
70
74
  setVariant: (variant) => set({ variant }),
75
+ setQuestionResult: (questionsResult) => set({ questionsResult }),
71
76
  // Navigation
72
77
  goToNextQuestion: () => {
73
78
  const { currentQuestionIndex, getTotalQuestions } = get();
@@ -120,9 +125,9 @@ var useQuizStore = create()(
120
125
  questionId,
121
126
  activityId,
122
127
  userId,
123
- answer: question.type === "DISSERTATIVA" /* DISSERTATIVA */ ? answerId : null,
124
- optionId: question.type === "DISSERTATIVA" /* DISSERTATIVA */ ? null : answerId,
125
- questionType: question.type,
128
+ answer: question.questionType === "DISSERTATIVA" /* DISSERTATIVA */ ? answerId : null,
129
+ optionId: question.questionType === "DISSERTATIVA" /* DISSERTATIVA */ ? null : answerId,
130
+ questionType: question.questionType,
126
131
  answerStatus: "PENDENTE_AVALIACAO" /* PENDENTE_AVALIACAO */
127
132
  };
128
133
  let updatedUserAnswers;
@@ -162,7 +167,7 @@ var useQuizStore = create()(
162
167
  // selectMultipleAnswer is for non-dissertative questions
163
168
  optionId: answerId,
164
169
  // selectMultipleAnswer should only set optionId
165
- questionType: question.type,
170
+ questionType: question.questionType,
166
171
  answerStatus: "PENDENTE_AVALIACAO" /* PENDENTE_AVALIACAO */
167
172
  })
168
173
  );
@@ -189,7 +194,7 @@ var useQuizStore = create()(
189
194
  const question = activeQuiz.quiz.questions.find(
190
195
  (q) => q.id === questionId
191
196
  );
192
- if (!question || question.type !== "DISSERTATIVA" /* DISSERTATIVA */) {
197
+ if (!question || question.questionType !== "DISSERTATIVA" /* DISSERTATIVA */) {
193
198
  console.warn(
194
199
  "selectDissertativeAnswer called for non-dissertative question"
195
200
  );
@@ -239,7 +244,7 @@ var useQuizStore = create()(
239
244
  userId,
240
245
  answer: null,
241
246
  optionId: null,
242
- questionType: currentQuestion.type,
247
+ questionType: currentQuestion.questionType,
243
248
  answerStatus: "PENDENTE_AVALIACAO" /* PENDENTE_AVALIACAO */
244
249
  };
245
250
  let updatedUserAnswers;
@@ -275,9 +280,9 @@ var useQuizStore = create()(
275
280
  questionId,
276
281
  activityId,
277
282
  userId,
278
- answer: question.type === "DISSERTATIVA" /* DISSERTATIVA */ ? answerId || null : null,
279
- optionId: question.type !== "DISSERTATIVA" /* DISSERTATIVA */ ? answerId || null : null,
280
- questionType: question.type,
283
+ answer: question.questionType === "DISSERTATIVA" /* DISSERTATIVA */ ? answerId || null : null,
284
+ optionId: question.questionType !== "DISSERTATIVA" /* DISSERTATIVA */ ? answerId || null : null,
285
+ questionType: question.questionType,
281
286
  answerStatus: "PENDENTE_AVALIACAO" /* PENDENTE_AVALIACAO */
282
287
  };
283
288
  if (existingAnswerIndex !== -1) {
@@ -305,7 +310,10 @@ var useQuizStore = create()(
305
310
  timeElapsed: 0,
306
311
  isStarted: false,
307
312
  isFinished: false,
308
- userId: ""
313
+ userId: "",
314
+ variant: "default",
315
+ questionsResult: null,
316
+ currentQuestionResult: null
309
317
  });
310
318
  },
311
319
  // Timer
@@ -507,6 +515,31 @@ var useQuizStore = create()(
507
515
  (q) => q.id === questionId
508
516
  );
509
517
  return questionIndex + 1;
518
+ },
519
+ // Question Result
520
+ getQuestionResultByQuestionId: (questionId) => {
521
+ const { questionsResult } = get();
522
+ return questionsResult?.answers.find(
523
+ (answer) => answer.questionId === questionId
524
+ ) || null;
525
+ },
526
+ getQuestionResultStatistics: () => {
527
+ const { questionsResult } = get();
528
+ return questionsResult?.statistics || null;
529
+ },
530
+ getQuestionResult: () => {
531
+ const { questionsResult } = get();
532
+ return questionsResult;
533
+ },
534
+ setQuestionsResult: (questionsResult) => {
535
+ set({ questionsResult });
536
+ },
537
+ setCurrentQuestionResult: (currentQuestionResult) => {
538
+ set({ currentQuestionResult });
539
+ },
540
+ getCurrentQuestionResult: () => {
541
+ const { currentQuestionResult } = get();
542
+ return currentQuestionResult;
510
543
  }
511
544
  };
512
545
  },
@@ -1 +1 @@
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 VERDADEIRO_FALSO = 'VERDADEIRO_FALSO',\n LIGAR_PONTOS = 'LIGAR_PONTOS',\n PREENCHER = 'PREENCHER',\n IMAGEM = 'IMAGEM',\n}\n\nexport enum QUESTION_STATUS {\n APROVADO = 'APROVADO',\n REPROVADO = 'REPROVADO',\n}\n\nexport enum ANSWER_STATUS {\n RESPOSTA_CORRETA = 'RESPOSTA_CORRETA',\n RESPOSTA_INCORRETA = 'RESPOSTA_INCORRETA',\n PENDENTE_AVALIACAO = 'PENDENTE_AVALIACAO',\n}\n\nexport interface Question {\n id: string;\n questionText: string;\n description: string;\n type: QUESTION_TYPE;\n status: QUESTION_STATUS;\n difficulty: QUESTION_DIFFICULTY;\n examBoard: string;\n examYear: string;\n answerKey: null | string;\n institutionIds: 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 isCorrect: boolean;\n }[];\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 questionType: QUESTION_TYPE;\n answerStatus: ANSWER_STATUS;\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 variant: 'result' | 'default';\n // Actions\n setBySimulated: (simulado: Simulado) => void;\n setByActivity: (atividade: Atividade) => void;\n setByQuestionary: (aula: Aula) => void;\n setUserId: (userId: string) => void;\n setUserAnswers: (userAnswers: UserAnswerItem[]) => void;\n setVariant: (variant: 'result' | 'default') => void;\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 selectMultipleAnswer: (questionId: string, answerIds: string[]) => void;\n selectDissertativeAnswer: (questionId: string, answer: 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: () => UserAnswerItem | undefined;\n getAllCurrentAnswer: () => UserAnswerItem[] | undefined;\n getQuizTitle: () => string;\n formatTime: (seconds: number) => string;\n getUserAnswers: () => UserAnswerItem[];\n getUnansweredQuestionsFromUserAnswers: () => number[];\n getQuestionsGroupedBySubject: () => { [key: string]: Question[] };\n getUserId: () => string;\n setCurrentQuestion: (question: Question) => void;\n\n // New methods for userAnswers\n getQuestionIndex: (questionId: string) => number;\n getUserAnswerByQuestionId: (questionId: string) => UserAnswerItem | null;\n isQuestionAnsweredByUserAnswers: (questionId: string) => boolean;\n getQuestionStatusFromUserAnswers: (\n questionId: string\n ) => 'answered' | 'unanswered' | 'skipped';\n getUserAnswersForActivity: () => UserAnswerItem[];\n\n // Answer status management\n setAnswerStatus: (questionId: string, status: ANSWER_STATUS) => void;\n getAnswerStatus: (questionId: string) => ANSWER_STATUS | null;\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 variant: 'default',\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 setUserAnswers: (userAnswers) => set({ userAnswers }),\n getUserId: () => get().userId,\n setVariant: (variant) => set({ variant }),\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 activityId = activeQuiz.quiz.id;\n const userId = get().getUserId();\n\n if (!userId || userId === '') {\n console.warn('selectAnswer called before userId is set');\n return;\n }\n\n const question = activeQuiz.quiz.questions.find(\n (q) => q.id === questionId\n );\n if (!question) return;\n\n const existingAnswerIndex = userAnswers.findIndex(\n (answer) => answer.questionId === questionId\n );\n\n const newUserAnswer: UserAnswerItem = {\n questionId,\n activityId,\n userId,\n answer:\n question.type === QUESTION_TYPE.DISSERTATIVA ? answerId : null,\n optionId:\n question.type === QUESTION_TYPE.DISSERTATIVA ? null : answerId,\n questionType: question.type,\n answerStatus: ANSWER_STATUS.PENDENTE_AVALIACAO,\n };\n\n let updatedUserAnswers;\n if (existingAnswerIndex !== -1) {\n updatedUserAnswers = [...userAnswers];\n updatedUserAnswers[existingAnswerIndex] = newUserAnswer;\n } else {\n updatedUserAnswers = [...userAnswers, newUserAnswer];\n }\n\n set({\n userAnswers: updatedUserAnswers,\n });\n },\n\n selectMultipleAnswer: (questionId, answerIds) => {\n const { getActiveQuiz, userAnswers } = get();\n const activeQuiz = getActiveQuiz();\n\n if (!activeQuiz) return;\n\n const activityId = activeQuiz.quiz.id;\n const userId = get().getUserId();\n\n if (!userId || userId === '') {\n console.warn('selectMultipleAnswer called before userId is set');\n return;\n }\n\n const question = activeQuiz.quiz.questions.find(\n (q) => q.id === questionId\n );\n if (!question) return;\n\n // Remove all existing answers for this questionId\n const filteredUserAnswers = userAnswers.filter(\n (answer) => answer.questionId !== questionId\n );\n\n // Create new UserAnswerItem objects for each answerId\n const newUserAnswers: UserAnswerItem[] = answerIds.map(\n (answerId) => ({\n questionId,\n activityId,\n userId,\n answer: null, // selectMultipleAnswer is for non-dissertative questions\n optionId: answerId, // selectMultipleAnswer should only set optionId\n questionType: question.type,\n answerStatus: ANSWER_STATUS.PENDENTE_AVALIACAO,\n })\n );\n\n // Combine filtered answers with new answers\n const updatedUserAnswers = [\n ...filteredUserAnswers,\n ...newUserAnswers,\n ];\n\n set({\n userAnswers: updatedUserAnswers,\n });\n },\n\n selectDissertativeAnswer: (questionId, answer) => {\n const { getActiveQuiz, userAnswers } = get();\n const activeQuiz = getActiveQuiz();\n\n if (!activeQuiz) return;\n\n const activityId = activeQuiz.quiz.id;\n const userId = get().getUserId();\n\n if (!userId || userId === '') {\n console.warn(\n 'selectDissertativeAnswer called before userId is set'\n );\n return;\n }\n\n const question = activeQuiz.quiz.questions.find(\n (q) => q.id === questionId\n );\n if (!question || question.type !== QUESTION_TYPE.DISSERTATIVA) {\n console.warn(\n 'selectDissertativeAnswer called for non-dissertative question'\n );\n return;\n }\n\n const existingAnswerIndex = userAnswers.findIndex(\n (answerItem) => answerItem.questionId === questionId\n );\n\n const newUserAnswer: UserAnswerItem = {\n questionId,\n activityId,\n userId,\n answer: answer,\n optionId: null,\n questionType: QUESTION_TYPE.DISSERTATIVA,\n answerStatus: ANSWER_STATUS.PENDENTE_AVALIACAO,\n };\n\n let updatedUserAnswers;\n if (existingAnswerIndex !== -1) {\n updatedUserAnswers = [...userAnswers];\n updatedUserAnswers[existingAnswerIndex] = newUserAnswer;\n } else {\n updatedUserAnswers = [...userAnswers, newUserAnswer];\n }\n\n set({\n userAnswers: updatedUserAnswers,\n });\n },\n\n skipQuestion: () => {\n const { getCurrentQuestion, userAnswers, 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 if (!userId || userId === '') {\n console.warn('skipQuestion called before userId is set');\n return;\n }\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 questionType: currentQuestion.type,\n answerStatus: ANSWER_STATUS.PENDENTE_AVALIACAO,\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 if (!userId || userId === '') {\n console.warn('addUserAnswer called before userId is set');\n return;\n }\n\n const question = activeQuiz.quiz.questions.find(\n (q) => q.id === questionId\n );\n if (!question) return;\n\n const existingAnswerIndex = userAnswers.findIndex(\n (answer) => answer.questionId === questionId\n );\n\n const newUserAnswer: UserAnswerItem = {\n questionId,\n activityId,\n userId,\n answer:\n question.type === QUESTION_TYPE.DISSERTATIVA\n ? answerId || null\n : null,\n optionId:\n question.type !== QUESTION_TYPE.DISSERTATIVA\n ? answerId || null\n : null,\n questionType: question.type,\n answerStatus: ANSWER_STATUS.PENDENTE_AVALIACAO,\n };\n\n if (existingAnswerIndex !== -1) {\n // Update existing answer\n const updatedUserAnswers = [...userAnswers];\n updatedUserAnswers[existingAnswerIndex] = newUserAnswer;\n set({ userAnswers: updatedUserAnswers });\n } else {\n // Add new answer\n set({ userAnswers: [...userAnswers, newUserAnswer] });\n }\n },\n\n startQuiz: () => {\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(\n (answer) => answer.optionId !== null || answer.answer !== null\n ).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 =\n userAnswer &&\n (userAnswer.optionId !== null || userAnswer.answer !== null);\n const isSkipped =\n userAnswer &&\n userAnswer.optionId === null &&\n 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(\n (answer) => answer.optionId === null && answer.answer === null\n ).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\n ? userAnswer.optionId !== null || userAnswer.answer !== null\n : false;\n },\n\n isQuestionSkipped: (questionId) => {\n const { userAnswers } = get();\n const userAnswer = userAnswers.find(\n (answer) => answer.questionId === questionId\n );\n return userAnswer\n ? userAnswer.optionId === null && userAnswer.answer === null\n : false;\n },\n\n getCurrentAnswer: () => {\n const { getCurrentQuestion, userAnswers } = get();\n const currentQuestion = getCurrentQuestion();\n\n if (!currentQuestion) return undefined;\n\n const userAnswer = userAnswers.find(\n (answer) => answer.questionId === currentQuestion.id\n );\n\n return userAnswer;\n },\n\n getAllCurrentAnswer: () => {\n const { getCurrentQuestion, userAnswers } = get();\n const currentQuestion = getCurrentQuestion();\n\n if (!currentQuestion) return undefined;\n\n const userAnswer = userAnswers.filter(\n (answer) => answer.questionId === currentQuestion.id\n );\n\n return userAnswer;\n },\n\n getQuizTitle: () => {\n const { 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 { userAnswers } = get();\n return userAnswers;\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 =\n userAnswer &&\n (userAnswer.optionId !== null || userAnswer.answer !== null);\n const isSkipped =\n userAnswer &&\n userAnswer.optionId === null &&\n 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\n ? answer.optionId !== null || answer.answer !== null\n : 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.optionId === null) return 'skipped';\n return 'answered';\n },\n getUserAnswersForActivity: () => {\n const { userAnswers } = get();\n return userAnswers;\n },\n setCurrentQuestion: (question) => {\n const { getActiveQuiz } = get();\n const activeQuiz = getActiveQuiz();\n if (!activeQuiz) return;\n\n const questionIndex = activeQuiz.quiz.questions.findIndex(\n (q) => q.id === question.id\n );\n\n // Validate that the question was found before updating currentQuestionIndex\n if (questionIndex === -1) {\n console.warn(\n `Question with id \"${question.id}\" not found in active quiz`\n );\n return;\n }\n\n set({ currentQuestionIndex: questionIndex });\n },\n\n setAnswerStatus: (questionId, status) => {\n const { userAnswers } = get();\n const existingAnswerIndex = userAnswers.findIndex(\n (answer) => answer.questionId === questionId\n );\n\n if (existingAnswerIndex !== -1) {\n const updatedUserAnswers = [...userAnswers];\n updatedUserAnswers[existingAnswerIndex] = {\n ...updatedUserAnswers[existingAnswerIndex],\n answerStatus: status,\n };\n set({ userAnswers: updatedUserAnswers });\n }\n },\n\n getAnswerStatus: (questionId) => {\n const { userAnswers } = get();\n const userAnswer = userAnswers.find(\n (answer) => answer.questionId === questionId\n );\n return userAnswer ? userAnswer.answerStatus : null;\n },\n getQuestionIndex: (questionId) => {\n const { getActiveQuiz } = get();\n const activeQuiz = getActiveQuiz();\n if (!activeQuiz) return 0;\n\n const questionIndex = activeQuiz.quiz.questions.findIndex(\n (q) => q.id === questionId\n );\n return questionIndex + 1;\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_STATUS","answer"]}
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 VERDADEIRO_FALSO = 'VERDADEIRO_FALSO',\n LIGAR_PONTOS = 'LIGAR_PONTOS',\n PREENCHER = 'PREENCHER',\n IMAGEM = 'IMAGEM',\n}\n\nexport enum QUESTION_STATUS {\n PENDENTE_AVALIACAO = 'PENDENTE_AVALIACAO',\n RESPOSTA_CORRETA = 'RESPOSTA_CORRETA',\n RESPOSTA_INCORRETA = 'RESPOSTA_INCORRETA',\n NAO_RESPONDIDO = 'NAO_RESPONDIDO',\n}\n\nexport enum ANSWER_STATUS {\n RESPOSTA_CORRETA = 'RESPOSTA_CORRETA',\n RESPOSTA_INCORRETA = 'RESPOSTA_INCORRETA',\n PENDENTE_AVALIACAO = 'PENDENTE_AVALIACAO',\n}\n\nexport interface QuestionResult {\n answers: {\n id: string;\n questionId: string;\n answer: string | null;\n optionId: string;\n selectedOptionText: string | null;\n answerStatus: ANSWER_STATUS;\n createdAt: string;\n updatedAt: string;\n statement: string;\n questionType: QUESTION_TYPE;\n correctOption: string;\n difficultyLevel: QUESTION_DIFFICULTY;\n solutionExplanation: string | null;\n options: {\n id: string;\n option: string;\n isCorrect: boolean;\n }[];\n teacherFeedback: string | null;\n attachment: string | null;\n score: number | null;\n gradedAt: string | null;\n gradedBy: string;\n }[];\n statistics: {\n totalAnswered: number;\n correctAnswers: number;\n incorrectAnswers: number;\n pendingAnswers: number;\n score: number;\n };\n}\n\nexport interface Question {\n id: string;\n questionText: string;\n questionType: QUESTION_TYPE;\n difficultyLevel: QUESTION_DIFFICULTY;\n description: string;\n examBoard: string | null;\n examYear: string | null;\n solutionExplanation: string | null;\n answer: null;\n answerStatus: ANSWER_STATUS;\n options: {\n id: string;\n option: string;\n }[];\n correctOptionIds?: string[];\n knowledgeMatrix: {\n areaKnowledgeId: string;\n subjectId: string;\n topicId: string;\n subtopicId: string;\n contentId: string;\n }[];\n}\n\ninterface Simulado {\n id: string;\n title: string;\n type: string;\n subtype: string;\n difficulty: string | null;\n notification: string | null;\n status: string;\n startDate: Date | null;\n finalDate: Date | null;\n canRetry: boolean;\n createdAt: Date | null;\n updatedAt: Date | null;\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 questionType: QUESTION_TYPE;\n answerStatus: ANSWER_STATUS;\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 variant: 'result' | 'default';\n // Actions\n setBySimulated: (simulado: Simulado) => void;\n setByActivity: (atividade: Atividade) => void;\n setByQuestionary: (aula: Aula) => void;\n setQuestionResult: (questionResult: QuestionResult) => void;\n setUserId: (userId: string) => void;\n setUserAnswers: (userAnswers: UserAnswerItem[]) => void;\n setVariant: (variant: 'result' | 'default') => void;\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 selectMultipleAnswer: (questionId: string, answerIds: string[]) => void;\n selectDissertativeAnswer: (questionId: string, answer: 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: () => UserAnswerItem | undefined;\n getAllCurrentAnswer: () => UserAnswerItem[] | undefined;\n getQuizTitle: () => string;\n formatTime: (seconds: number) => string;\n getUserAnswers: () => UserAnswerItem[];\n getUnansweredQuestionsFromUserAnswers: () => number[];\n getQuestionsGroupedBySubject: () => { [key: string]: Question[] };\n getUserId: () => string;\n setCurrentQuestion: (question: Question) => void;\n\n // New methods for userAnswers\n getQuestionIndex: (questionId: string) => number;\n getUserAnswerByQuestionId: (questionId: string) => UserAnswerItem | null;\n isQuestionAnsweredByUserAnswers: (questionId: string) => boolean;\n getQuestionStatusFromUserAnswers: (\n questionId: string\n ) => 'answered' | 'unanswered' | 'skipped';\n getUserAnswersForActivity: () => UserAnswerItem[];\n // Answer status management\n setAnswerStatus: (questionId: string, status: ANSWER_STATUS) => void;\n getAnswerStatus: (questionId: string) => ANSWER_STATUS | null;\n\n // Question Result\n questionsResult: QuestionResult | null;\n currentQuestionResult: QuestionResult['answers'] | null;\n setQuestionsResult: (questionsResult: QuestionResult) => void;\n setCurrentQuestionResult: (\n currentQuestionResult: QuestionResult['answers']\n ) => void;\n getQuestionResultByQuestionId: (\n questionId: string\n ) => QuestionResult['answers'][number] | null;\n getQuestionResultStatistics: () => QuestionResult['statistics'] | null;\n getQuestionResult: () => QuestionResult | null;\n getCurrentQuestionResult: () => QuestionResult['answers'] | null;\n}\n\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 variant: 'default',\n questionsResult: null,\n currentQuestionResult: null,\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 setUserAnswers: (userAnswers) => set({ userAnswers }),\n getUserId: () => get().userId,\n setVariant: (variant) => set({ variant }),\n setQuestionResult: (questionsResult) => set({ questionsResult }),\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 activityId = activeQuiz.quiz.id;\n const userId = get().getUserId();\n\n if (!userId || userId === '') {\n console.warn('selectAnswer called before userId is set');\n return;\n }\n\n const question = activeQuiz.quiz.questions.find(\n (q) => q.id === questionId\n );\n if (!question) return;\n\n const existingAnswerIndex = userAnswers.findIndex(\n (answer) => answer.questionId === questionId\n );\n\n const newUserAnswer: UserAnswerItem = {\n questionId,\n activityId,\n userId,\n answer:\n question.questionType === QUESTION_TYPE.DISSERTATIVA\n ? answerId\n : null,\n optionId:\n question.questionType === QUESTION_TYPE.DISSERTATIVA\n ? null\n : answerId,\n questionType: question.questionType,\n answerStatus: ANSWER_STATUS.PENDENTE_AVALIACAO,\n };\n\n let updatedUserAnswers;\n if (existingAnswerIndex !== -1) {\n updatedUserAnswers = [...userAnswers];\n updatedUserAnswers[existingAnswerIndex] = newUserAnswer;\n } else {\n updatedUserAnswers = [...userAnswers, newUserAnswer];\n }\n\n set({\n userAnswers: updatedUserAnswers,\n });\n },\n\n selectMultipleAnswer: (questionId, answerIds) => {\n const { getActiveQuiz, userAnswers } = get();\n const activeQuiz = getActiveQuiz();\n\n if (!activeQuiz) return;\n\n const activityId = activeQuiz.quiz.id;\n const userId = get().getUserId();\n\n if (!userId || userId === '') {\n console.warn('selectMultipleAnswer called before userId is set');\n return;\n }\n\n const question = activeQuiz.quiz.questions.find(\n (q) => q.id === questionId\n );\n if (!question) return;\n\n // Remove all existing answers for this questionId\n const filteredUserAnswers = userAnswers.filter(\n (answer) => answer.questionId !== questionId\n );\n\n // Create new UserAnswerItem objects for each answerId\n const newUserAnswers: UserAnswerItem[] = answerIds.map(\n (answerId) => ({\n questionId,\n activityId,\n userId,\n answer: null, // selectMultipleAnswer is for non-dissertative questions\n optionId: answerId, // selectMultipleAnswer should only set optionId\n questionType: question.questionType,\n answerStatus: ANSWER_STATUS.PENDENTE_AVALIACAO,\n })\n );\n\n // Combine filtered answers with new answers\n const updatedUserAnswers = [\n ...filteredUserAnswers,\n ...newUserAnswers,\n ];\n\n set({\n userAnswers: updatedUserAnswers,\n });\n },\n\n selectDissertativeAnswer: (questionId, answer) => {\n const { getActiveQuiz, userAnswers } = get();\n const activeQuiz = getActiveQuiz();\n\n if (!activeQuiz) return;\n\n const activityId = activeQuiz.quiz.id;\n const userId = get().getUserId();\n\n if (!userId || userId === '') {\n console.warn(\n 'selectDissertativeAnswer called before userId is set'\n );\n return;\n }\n\n const question = activeQuiz.quiz.questions.find(\n (q) => q.id === questionId\n );\n if (\n !question ||\n question.questionType !== QUESTION_TYPE.DISSERTATIVA\n ) {\n console.warn(\n 'selectDissertativeAnswer called for non-dissertative question'\n );\n return;\n }\n\n const existingAnswerIndex = userAnswers.findIndex(\n (answerItem) => answerItem.questionId === questionId\n );\n\n const newUserAnswer: UserAnswerItem = {\n questionId,\n activityId,\n userId,\n answer: answer,\n optionId: null,\n questionType: QUESTION_TYPE.DISSERTATIVA,\n answerStatus: ANSWER_STATUS.PENDENTE_AVALIACAO,\n };\n\n let updatedUserAnswers;\n if (existingAnswerIndex !== -1) {\n updatedUserAnswers = [...userAnswers];\n updatedUserAnswers[existingAnswerIndex] = newUserAnswer;\n } else {\n updatedUserAnswers = [...userAnswers, newUserAnswer];\n }\n\n set({\n userAnswers: updatedUserAnswers,\n });\n },\n\n skipQuestion: () => {\n const { getCurrentQuestion, userAnswers, 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 if (!userId || userId === '') {\n console.warn('skipQuestion called before userId is set');\n return;\n }\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 questionType: currentQuestion.questionType,\n answerStatus: ANSWER_STATUS.PENDENTE_AVALIACAO,\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 if (!userId || userId === '') {\n console.warn('addUserAnswer called before userId is set');\n return;\n }\n\n const question = activeQuiz.quiz.questions.find(\n (q) => q.id === questionId\n );\n if (!question) return;\n\n const existingAnswerIndex = userAnswers.findIndex(\n (answer) => answer.questionId === questionId\n );\n\n const newUserAnswer: UserAnswerItem = {\n questionId,\n activityId,\n userId,\n answer:\n question.questionType === QUESTION_TYPE.DISSERTATIVA\n ? answerId || null\n : null,\n optionId:\n question.questionType !== QUESTION_TYPE.DISSERTATIVA\n ? answerId || null\n : null,\n questionType: question.questionType,\n answerStatus: ANSWER_STATUS.PENDENTE_AVALIACAO,\n };\n\n if (existingAnswerIndex !== -1) {\n // Update existing answer\n const updatedUserAnswers = [...userAnswers];\n updatedUserAnswers[existingAnswerIndex] = newUserAnswer;\n set({ userAnswers: updatedUserAnswers });\n } else {\n // Add new answer\n set({ userAnswers: [...userAnswers, newUserAnswer] });\n }\n },\n\n startQuiz: () => {\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 variant: 'default',\n questionsResult: null,\n currentQuestionResult: null,\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(\n (answer) => answer.optionId !== null || answer.answer !== null\n ).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 =\n userAnswer &&\n (userAnswer.optionId !== null || userAnswer.answer !== null);\n const isSkipped =\n userAnswer &&\n userAnswer.optionId === null &&\n 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(\n (answer) => answer.optionId === null && answer.answer === null\n ).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\n ? userAnswer.optionId !== null || userAnswer.answer !== null\n : false;\n },\n\n isQuestionSkipped: (questionId) => {\n const { userAnswers } = get();\n const userAnswer = userAnswers.find(\n (answer) => answer.questionId === questionId\n );\n return userAnswer\n ? userAnswer.optionId === null && userAnswer.answer === null\n : false;\n },\n\n getCurrentAnswer: () => {\n const { getCurrentQuestion, userAnswers } = get();\n const currentQuestion = getCurrentQuestion();\n\n if (!currentQuestion) return undefined;\n\n const userAnswer = userAnswers.find(\n (answer) => answer.questionId === currentQuestion.id\n );\n\n return userAnswer;\n },\n\n getAllCurrentAnswer: () => {\n const { getCurrentQuestion, userAnswers } = get();\n const currentQuestion = getCurrentQuestion();\n\n if (!currentQuestion) return undefined;\n\n const userAnswer = userAnswers.filter(\n (answer) => answer.questionId === currentQuestion.id\n );\n\n return userAnswer;\n },\n\n getQuizTitle: () => {\n const { 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 { userAnswers } = get();\n return userAnswers;\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 =\n userAnswer &&\n (userAnswer.optionId !== null || userAnswer.answer !== null);\n const isSkipped =\n userAnswer &&\n userAnswer.optionId === null &&\n 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\n ? answer.optionId !== null || answer.answer !== null\n : 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.optionId === null) return 'skipped';\n return 'answered';\n },\n getUserAnswersForActivity: () => {\n const { userAnswers } = get();\n return userAnswers;\n },\n setCurrentQuestion: (question) => {\n const { getActiveQuiz } = get();\n const activeQuiz = getActiveQuiz();\n if (!activeQuiz) return;\n\n const questionIndex = activeQuiz.quiz.questions.findIndex(\n (q) => q.id === question.id\n );\n\n // Validate that the question was found before updating currentQuestionIndex\n if (questionIndex === -1) {\n console.warn(\n `Question with id \"${question.id}\" not found in active quiz`\n );\n return;\n }\n\n set({ currentQuestionIndex: questionIndex });\n },\n\n setAnswerStatus: (questionId, status) => {\n const { userAnswers } = get();\n const existingAnswerIndex = userAnswers.findIndex(\n (answer) => answer.questionId === questionId\n );\n\n if (existingAnswerIndex !== -1) {\n const updatedUserAnswers = [...userAnswers];\n updatedUserAnswers[existingAnswerIndex] = {\n ...updatedUserAnswers[existingAnswerIndex],\n answerStatus: status,\n };\n set({ userAnswers: updatedUserAnswers });\n }\n },\n\n getAnswerStatus: (questionId) => {\n const { userAnswers } = get();\n const userAnswer = userAnswers.find(\n (answer) => answer.questionId === questionId\n );\n return userAnswer ? userAnswer.answerStatus : null;\n },\n getQuestionIndex: (questionId) => {\n const { getActiveQuiz } = get();\n const activeQuiz = getActiveQuiz();\n if (!activeQuiz) return 0;\n\n const questionIndex = activeQuiz.quiz.questions.findIndex(\n (q) => q.id === questionId\n );\n return questionIndex + 1;\n },\n\n // Question Result\n getQuestionResultByQuestionId: (questionId) => {\n const { questionsResult } = get();\n return (\n questionsResult?.answers.find(\n (answer) => answer.questionId === questionId\n ) || null\n );\n },\n getQuestionResultStatistics: () => {\n const { questionsResult } = get();\n return questionsResult?.statistics || null;\n },\n getQuestionResult: () => {\n const { questionsResult } = get();\n return questionsResult;\n },\n setQuestionsResult: (questionsResult) => {\n set({ questionsResult });\n },\n setCurrentQuestionResult: (currentQuestionResult) => {\n set({ currentQuestionResult });\n },\n getCurrentQuestionResult: () => {\n const { currentQuestionResult } = get();\n return currentQuestionResult;\n },\n };\n },\n {\n name: 'quiz-store',\n }\n )\n);\n"],"mappings":"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","names":["QUESTION_DIFFICULTY","QUESTION_TYPE","QUESTION_STATUS","ANSWER_STATUS","answer"]}