UNPKG

analytica-frontend-lib

Version:

Repositório público dos componentes utilizados nas plataformas da Analytica Ensino

416 lines (388 loc) 19.2 kB
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } var _chunkGYQUB3VWjs = require('./chunk-GYQUB3VW.js'); var _chunkHN2HFYUOjs = require('./chunk-HN2HFYUO.js'); var _chunkMIEC42PLjs = require('./chunk-MIEC42PL.js'); var _chunkCMUIZOUVjs = require('./chunk-CMUIZOUV.js'); var _chunkBJMKBBN3js = require('./chunk-BJMKBBN3.js'); var _chunkORRSVKFKjs = require('./chunk-ORRSVKFK.js'); var _chunk34ST3MKOjs = require('./chunk-34ST3MKO.js'); var _chunkTN3AYOMVjs = require('./chunk-TN3AYOMV.js'); var _chunkAOUX6XXNjs = require('./chunk-AOUX6XXN.js'); // src/components/Quiz/QuizResult.tsx var _react = require('react'); var _Clock = require('@phosphor-icons/react/dist/csr/Clock'); var _jsxruntime = require('react/jsx-runtime'); var QuizBadge = ({ subtype }) => { switch (subtype) { case "PROVA" /* PROVA */: return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkBJMKBBN3js.Badge_default, { variant: "examsOutlined", action: "exam2", "data-testid": "quiz-badge", children: "Prova" }); case "ENEM_PROVA_1" /* ENEM_PROVA_1 */: case "ENEM_PROVA_2" /* ENEM_PROVA_2 */: return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkBJMKBBN3js.Badge_default, { variant: "examsOutlined", action: "exam1", "data-testid": "quiz-badge", children: "Enem" }); case "VESTIBULAR" /* VESTIBULAR */: return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkBJMKBBN3js.Badge_default, { variant: "examsOutlined", action: "exam4", "data-testid": "quiz-badge", children: "Vestibular" }); case "SIMULADO" /* SIMULADO */: case "SIMULADAO" /* SIMULADAO */: case void 0: return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkBJMKBBN3js.Badge_default, { variant: "examsOutlined", action: "exam3", "data-testid": "quiz-badge", children: "Simulad\xE3o" }); default: return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkBJMKBBN3js.Badge_default, { variant: "solid", action: "info", "data-testid": "quiz-badge", children: subtype }); } }; var QuizHeaderResult = _react.forwardRef.call(void 0, ({ className, ...props }, ref) => { const { getQuestionResultByQuestionId, getCurrentQuestion, questionsResult } = _chunkAOUX6XXNjs.useQuizStore.call(void 0, ); const [status, setStatus] = _react.useState.call(void 0, void 0); _react.useEffect.call(void 0, () => { const cq = getCurrentQuestion(); if (!cq) { setStatus(void 0); return; } const qr = getQuestionResultByQuestionId(cq.id); setStatus(_optionalChain([qr, 'optionalAccess', _ => _.answerStatus])); }, [ getCurrentQuestion, getQuestionResultByQuestionId, _optionalChain([getCurrentQuestion, 'call', _2 => _2(), 'optionalAccess', _3 => _3.id]), questionsResult ]); const getClassesByAnswersStatus = () => { if (status === void 0) { return "bg-gray-100"; } switch (status) { case "RESPOSTA_CORRETA" /* RESPOSTA_CORRETA */: return "bg-success-background"; case "RESPOSTA_INCORRETA" /* RESPOSTA_INCORRETA */: return "bg-error-background"; case "PENDENTE_AVALIACAO" /* PENDENTE_AVALIACAO */: return "bg-info-background"; default: return "bg-error-background"; } }; const getLabelByAnswersStatus = () => { if (status === void 0) { return "Carregando..."; } switch (status) { case "RESPOSTA_CORRETA" /* RESPOSTA_CORRETA */: return "\u{1F389} Parab\xE9ns!!"; case "RESPOSTA_INCORRETA" /* RESPOSTA_INCORRETA */: return "N\xE3o foi dessa vez..."; case "PENDENTE_AVALIACAO" /* PENDENTE_AVALIACAO */: return "Avalia\xE7\xE3o pendente"; case "NAO_RESPONDIDO" /* NAO_RESPONDIDO */: return "N\xE3o foi dessa vez...voc\xEA deixou a resposta em branco"; default: return "N\xE3o foi dessa vez...voc\xEA deixou a resposta em branco"; } }; return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { ref, className: _chunkTN3AYOMVjs.cn.call(void 0, "flex flex-row items-center gap-10 p-3.5 rounded-xl mb-4", getClassesByAnswersStatus(), className ), ...props, children: [ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-text-950 font-bold text-lg", children: "Resultado" }), /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-text-700 text-md", children: getLabelByAnswersStatus() }) ] } ); } ); var getRetryButtonLabel = (type) => { switch (type) { case "ATIVIDADE" /* ATIVIDADE */: return "Refazer atividade"; case "QUESTIONARIO" /* QUESTIONARIO */: return "Repetir question\xE1rio"; case "SIMULADO" /* SIMULADO */: return "Repetir simulado"; default: return "Refazer"; } }; var QuizResultHeaderTitle = _react.forwardRef.call(void 0, ({ className, showBadge = true, onRepeat, canRetry, ...props }, ref) => { const { quiz } = _chunkAOUX6XXNjs.useQuizStore.call(void 0, ); return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { ref, className: _chunkTN3AYOMVjs.cn.call(void 0, "flex flex-row pt-4 justify-between items-center", className ), ...props, children: [ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-text-950 font-bold text-2xl", children: "Resultado" }), /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-row gap-3 items-center", children: [ canRetry && onRepeat && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk34ST3MKOjs.Button_default, { variant: "solid", action: "primary", size: "medium", onClick: onRepeat, children: getRetryButtonLabel(_optionalChain([quiz, 'optionalAccess', _4 => _4.type])) } ), showBadge && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, QuizBadge, { subtype: _optionalChain([quiz, 'optionalAccess', _5 => _5.subtype]) || void 0 }) ] }) ] } ); }); var QuizResultTitle = _react.forwardRef.call(void 0, ({ className, ...props }, ref) => { const { getQuizTitle } = _chunkAOUX6XXNjs.useQuizStore.call(void 0, ); const quizTitle = getQuizTitle(); return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: _chunkTN3AYOMVjs.cn.call(void 0, "pt-6 pb-4 text-text-950 font-bold text-lg", className), ref, ...props, children: quizTitle } ); }); var updateDifficultyStats = (stats, difficulty, isCorrect) => { if (difficulty === "FACIL" /* FACIL */) { stats.totalEasyQuestions++; if (isCorrect) stats.correctEasyAnswers++; } else if (difficulty === "MEDIO" /* MEDIO */) { stats.totalMediumQuestions++; if (isCorrect) stats.correctMediumAnswers++; } else if (difficulty === "DIFICIL" /* DIFICIL */) { stats.totalDifficultQuestions++; if (isCorrect) stats.correctDifficultAnswers++; } }; var calculateAnswerStatistics = (answers) => { const stats = { correctAnswers: 0, correctEasyAnswers: 0, correctMediumAnswers: 0, correctDifficultAnswers: 0, totalEasyQuestions: 0, totalMediumQuestions: 0, totalDifficultQuestions: 0 }; for (const answer of answers) { const isCorrect = answer.answerStatus === "RESPOSTA_CORRETA" /* RESPOSTA_CORRETA */; if (isCorrect) { stats.correctAnswers++; } updateDifficultyStats(stats, answer.difficultyLevel, isCorrect); } return stats; }; var QuizResultPerformance = _react.forwardRef.call(void 0, ({ showDetails = true, ...props }, ref) => { const { getTotalQuestions, formatTime, getQuestionResultStatistics, getQuestionResult } = _chunkAOUX6XXNjs.useQuizStore.call(void 0, ); const totalQuestions = getTotalQuestions(); const questionResult = getQuestionResult(); const stats = questionResult ? calculateAnswerStatistics(questionResult.answers) : { correctAnswers: 0, correctEasyAnswers: 0, correctMediumAnswers: 0, correctDifficultAnswers: 0, totalEasyQuestions: 0, totalMediumQuestions: 0, totalDifficultQuestions: 0 }; const percentage = totalQuestions > 0 ? Math.round(stats.correctAnswers / totalQuestions * 100) : 0; const classesJustifyBetween = showDetails ? "justify-between" : "justify-center"; return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: _chunkTN3AYOMVjs.cn.call(void 0, "flex flex-row gap-6 p-6 rounded-xl bg-background", classesJustifyBetween ), ref, ...props, children: [ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "relative", children: [ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkMIEC42PLjs.ProgressCircle_default, { size: "medium", variant: "green", value: percentage, showPercentage: false, label: "" } ), /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "absolute inset-0 flex flex-col items-center justify-center", children: [ showDetails && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex items-center gap-1 mb-1", children: [ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _Clock.ClockIcon, { size: 12, weight: "regular", className: "text-text-800" }), /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "text-2xs font-medium text-text-800", children: formatTime( (_nullishCoalesce(_optionalChain([getQuestionResultStatistics, 'call', _6 => _6(), 'optionalAccess', _7 => _7.timeSpent]), () => ( 0))) * 60 ) }) ] }), /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "text-2xl font-medium text-text-800 leading-7", children: [ _nullishCoalesce(_optionalChain([getQuestionResultStatistics, 'call', _8 => _8(), 'optionalAccess', _9 => _9.correctAnswers]), () => ( "--")), " de", " ", totalQuestions ] }), /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "text-2xs font-medium text-text-600 mt-1", children: "Corretas" }) ] }) ] }), showDetails && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col gap-4 w-full", children: [ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkCMUIZOUVjs.ProgressBar_default, { className: "w-full", layout: "stacked", variant: "green", value: stats.correctEasyAnswers, max: stats.totalEasyQuestions, label: "F\xE1ceis", showHitCount: true, labelClassName: "text-base font-medium text-text-800 leading-none", percentageClassName: "text-xs font-medium leading-[14px] text-right" } ), /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkCMUIZOUVjs.ProgressBar_default, { className: "w-full", layout: "stacked", variant: "green", value: stats.correctMediumAnswers, max: stats.totalMediumQuestions, label: "M\xE9dias", showHitCount: true, labelClassName: "text-base font-medium text-text-800 leading-none", percentageClassName: "text-xs font-medium leading-[14px] text-right" } ), /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkCMUIZOUVjs.ProgressBar_default, { className: "w-full", layout: "stacked", variant: "green", value: stats.correctDifficultAnswers, max: stats.totalDifficultQuestions, label: "Dif\xEDceis", showHitCount: true, labelClassName: "text-base font-medium text-text-800 leading-none", percentageClassName: "text-xs font-medium leading-[14px] text-right" } ) ] }) ] } ); }); var QuizListResult = _react.forwardRef.call(void 0, ({ className, onSubjectClick, ...props }, ref) => { const { getQuestionsGroupedBySubject } = _chunkAOUX6XXNjs.useQuizStore.call(void 0, ); const { isDark } = _chunkORRSVKFKjs.useTheme.call(void 0, ); const groupedQuestions = getQuestionsGroupedBySubject(); const subjectsStats = Object.entries(groupedQuestions).map( ([subjectId, questions]) => { let correct = 0; let incorrect = 0; for (const question of questions) { if (question.answerStatus === "RESPOSTA_CORRETA" /* RESPOSTA_CORRETA */) { correct++; } else { incorrect++; } } return { subject: { name: _nullishCoalesce(_optionalChain([questions, 'optionalAccess', _10 => _10[0], 'optionalAccess', _11 => _11.knowledgeMatrix, 'optionalAccess', _12 => _12[0], 'optionalAccess', _13 => _13.subject, 'optionalAccess', _14 => _14.name]), () => ( "Sem mat\xE9ria")), id: subjectId, color: _nullishCoalesce(_optionalChain([questions, 'optionalAccess', _15 => _15[0], 'optionalAccess', _16 => _16.knowledgeMatrix, 'optionalAccess', _17 => _17[0], 'optionalAccess', _18 => _18.subject, 'optionalAccess', _19 => _19.color]), () => ( "")), icon: _nullishCoalesce(_optionalChain([questions, 'optionalAccess', _20 => _20[0], 'optionalAccess', _21 => _21.knowledgeMatrix, 'optionalAccess', _22 => _22[0], 'optionalAccess', _23 => _23.subject, 'optionalAccess', _24 => _24.icon]), () => ( "")) }, correct, incorrect, total: questions.length }; } ); return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "section", { ref, className, ...props, children: [ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "pt-6 pb-4 text-text-950 font-bold text-lg", children: "Mat\xE9rias" }), /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "ul", { className: "flex flex-col gap-2", children: subjectsStats.map((subject) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "li", { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkHN2HFYUOjs.CardResults, { onClick: () => _optionalChain([onSubjectClick, 'optionalCall', _25 => _25(subject.subject.id)]), className: "max-w-full", header: subject.subject.name, correct_answers: subject.correct, incorrect_answers: subject.incorrect, icon: subject.subject.icon || "Book", color: _chunkTN3AYOMVjs.getSubjectColorWithOpacity.call(void 0, subject.subject.color, isDark) || void 0, direction: "row" } ) }, subject.subject.id)) }) ] }); }); var QuizListResultByMateria = ({ subject, onQuestionClick, subjectName }) => { const { getQuestionsGroupedBySubject, getQuestionIndex, quiz } = _chunkAOUX6XXNjs.useQuizStore.call(void 0, ); const groupedQuestions = getQuestionsGroupedBySubject(); const shouldShowExamInfo = _optionalChain([quiz, 'optionalAccess', _26 => _26.type]) === "SIMULADO" /* SIMULADO */; const answeredQuestions = groupedQuestions[subject] || []; const formattedQuestions = subject == "all" ? Object.values(groupedQuestions).flat() : answeredQuestions; return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col", children: [ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex flex-row pt-4 justify-between", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-text-950 font-bold text-2xl", children: subjectName || _optionalChain([formattedQuestions, 'optionalAccess', _27 => _27[0], 'optionalAccess', _28 => _28.knowledgeMatrix, 'optionalAccess', _29 => _29[0], 'optionalAccess', _30 => _30.subject, 'optionalAccess', _31 => _31.name]) || "Sem mat\xE9ria" }) }), /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "section", { className: "flex flex-col ", children: [ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "pt-6 pb-4 text-text-950 font-bold text-lg", children: "Resultado das quest\xF5es" }), /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "ul", { className: "flex flex-col gap-2 pt-4", children: formattedQuestions.map((question) => { const questionId = "questionId" in question ? question.questionId : question.id; const questionIndex = getQuestionIndex(questionId); const examBoard = "examBoard" in question ? question.examBoard : null; const examYear = "examYear" in question ? question.examYear : null; const examInfo = shouldShowExamInfo ? _chunkGYQUB3VWjs.formatExamInfo.call(void 0, examBoard, examYear) : ""; const questionTitle = `Quest\xE3o ${questionIndex.toString().padStart(2, "0")}`; const header = examInfo ? `${questionTitle} ${examInfo}` : questionTitle; return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "li", { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkHN2HFYUOjs.CardStatus, { className: "max-w-full", header, status: (() => { if (question.answerStatus === "RESPOSTA_CORRETA" /* RESPOSTA_CORRETA */) return "correct"; if (question.answerStatus === "RESPOSTA_INCORRETA" /* RESPOSTA_INCORRETA */) return "incorrect"; if (question.answerStatus === "NAO_RESPONDIDO" /* NAO_RESPONDIDO */) return "unanswered"; if (question.answerStatus === "PENDENTE_AVALIACAO" /* PENDENTE_AVALIACAO */) return "pending"; return void 0; })(), onClick: () => _optionalChain([onQuestionClick, 'optionalCall', _32 => _32(question)]) } ) }, question.id); }) }) ] }) ] }); }; exports.QuizHeaderResult = QuizHeaderResult; exports.QuizResultHeaderTitle = QuizResultHeaderTitle; exports.QuizResultTitle = QuizResultTitle; exports.QuizResultPerformance = QuizResultPerformance; exports.QuizListResult = QuizListResult; exports.QuizListResultByMateria = QuizListResultByMateria; //# sourceMappingURL=chunk-NENGAQQ5.js.map