analytica-frontend-lib
Version:
Repositório público dos componentes utilizados nas plataformas da Analytica Ensino
416 lines (388 loc) • 19.2 kB
JavaScript
"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