UNPKG

analytica-frontend-lib

Version:

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

1 lines 23.9 kB
{"version":3,"sources":["../src/components/Quiz/QuizResult.tsx"],"sourcesContent":["import { forwardRef, useEffect, useState } from 'react';\nimport { CardResults, CardStatus } from '../Card/Card';\nimport {\n ANSWER_STATUS,\n Question,\n QuestionResult,\n QUESTION_DIFFICULTY,\n QUIZ_TYPE,\n SUBTYPE_ENUM,\n useQuizStore,\n} from './useQuizStore';\nimport ProgressCircle from '../ProgressCircle/ProgressCircle';\nimport { ClockIcon } from '@phosphor-icons/react/dist/csr/Clock';\nimport ProgressBar from '../ProgressBar/ProgressBar';\nimport { cn, getSubjectColorWithOpacity } from '../../utils/utils';\nimport Badge from '../Badge/Badge';\nimport { useTheme } from '../../hooks/useTheme';\nimport Button from '../Button/Button';\nimport { formatExamInfo } from './Quiz.utils';\n\nconst QuizBadge = ({\n subtype,\n}: {\n subtype: SUBTYPE_ENUM | undefined | string;\n}) => {\n switch (subtype) {\n case SUBTYPE_ENUM.PROVA:\n return (\n <Badge variant=\"examsOutlined\" action=\"exam2\" data-testid=\"quiz-badge\">\n Prova\n </Badge>\n );\n case SUBTYPE_ENUM.ENEM_PROVA_1:\n case SUBTYPE_ENUM.ENEM_PROVA_2:\n return (\n <Badge variant=\"examsOutlined\" action=\"exam1\" data-testid=\"quiz-badge\">\n Enem\n </Badge>\n );\n case SUBTYPE_ENUM.VESTIBULAR:\n return (\n <Badge variant=\"examsOutlined\" action=\"exam4\" data-testid=\"quiz-badge\">\n Vestibular\n </Badge>\n );\n case SUBTYPE_ENUM.SIMULADO:\n case SUBTYPE_ENUM.SIMULADAO:\n case undefined:\n return (\n <Badge variant=\"examsOutlined\" action=\"exam3\" data-testid=\"quiz-badge\">\n Simuladão\n </Badge>\n );\n default:\n return (\n <Badge variant=\"solid\" action=\"info\" data-testid=\"quiz-badge\">\n {subtype}\n </Badge>\n );\n }\n};\n\nconst QuizHeaderResult = forwardRef<HTMLDivElement, { className?: string }>(\n ({ className, ...props }, ref) => {\n const {\n getQuestionResultByQuestionId,\n getCurrentQuestion,\n questionsResult,\n } = useQuizStore();\n const [status, setStatus] = useState<ANSWER_STATUS | undefined>(undefined);\n useEffect(() => {\n const cq = getCurrentQuestion();\n if (!cq) {\n setStatus(undefined);\n return;\n }\n const qr = getQuestionResultByQuestionId(cq.id);\n setStatus(qr?.answerStatus);\n }, [\n getCurrentQuestion,\n getQuestionResultByQuestionId,\n getCurrentQuestion()?.id,\n questionsResult,\n ]);\n\n const getClassesByAnswersStatus = () => {\n // Guard para quando status ainda está carregando\n if (status === undefined) {\n return 'bg-gray-100';\n }\n\n switch (status) {\n case ANSWER_STATUS.RESPOSTA_CORRETA:\n return 'bg-success-background';\n case ANSWER_STATUS.RESPOSTA_INCORRETA:\n return 'bg-error-background';\n case ANSWER_STATUS.PENDENTE_AVALIACAO:\n return 'bg-info-background';\n default:\n return 'bg-error-background';\n }\n };\n\n const getLabelByAnswersStatus = () => {\n // Guard para quando status ainda está carregando\n if (status === undefined) {\n return 'Carregando...';\n }\n\n switch (status) {\n case ANSWER_STATUS.RESPOSTA_CORRETA:\n return '🎉 Parabéns!!';\n case ANSWER_STATUS.RESPOSTA_INCORRETA:\n return 'Não foi dessa vez...';\n case ANSWER_STATUS.PENDENTE_AVALIACAO:\n return 'Avaliação pendente';\n case ANSWER_STATUS.NAO_RESPONDIDO:\n return 'Não foi dessa vez...você deixou a resposta em branco';\n default:\n return 'Não foi dessa vez...você deixou a resposta em branco';\n }\n };\n return (\n <div\n ref={ref}\n className={cn(\n 'flex flex-row items-center gap-10 p-3.5 rounded-xl mb-4',\n getClassesByAnswersStatus(),\n className\n )}\n {...props}\n >\n <p className=\"text-text-950 font-bold text-lg\">Resultado</p>\n <p className=\"text-text-700 text-md\">{getLabelByAnswersStatus()}</p>\n </div>\n );\n }\n);\n\nconst getRetryButtonLabel = (type: QUIZ_TYPE | undefined) => {\n switch (type) {\n case QUIZ_TYPE.ATIVIDADE:\n return 'Refazer atividade';\n case QUIZ_TYPE.QUESTIONARIO:\n return 'Repetir questionário';\n case QUIZ_TYPE.SIMULADO:\n return 'Repetir simulado';\n default:\n return 'Refazer';\n }\n};\n\nconst QuizResultHeaderTitle = forwardRef<\n HTMLDivElement,\n {\n className?: string;\n showBadge?: boolean;\n onRepeat?: () => void;\n canRetry?: boolean;\n }\n>(({ className, showBadge = true, onRepeat, canRetry, ...props }, ref) => {\n const { quiz } = useQuizStore();\n return (\n <div\n ref={ref}\n className={cn(\n 'flex flex-row pt-4 justify-between items-center',\n className\n )}\n {...props}\n >\n <p className=\"text-text-950 font-bold text-2xl\">Resultado</p>\n <div className=\"flex flex-row gap-3 items-center\">\n {canRetry && onRepeat && (\n <Button\n variant=\"solid\"\n action=\"primary\"\n size=\"medium\"\n onClick={onRepeat}\n >\n {getRetryButtonLabel(quiz?.type)}\n </Button>\n )}\n\n {showBadge && <QuizBadge subtype={quiz?.subtype || undefined} />}\n </div>\n </div>\n );\n});\n\nconst QuizResultTitle = forwardRef<\n HTMLParagraphElement,\n { className?: string }\n>(({ className, ...props }, ref) => {\n const { getQuizTitle } = useQuizStore();\n const quizTitle = getQuizTitle();\n\n return (\n <p\n className={cn('pt-6 pb-4 text-text-950 font-bold text-lg', className)}\n ref={ref}\n {...props}\n >\n {quizTitle}\n </p>\n );\n});\n\n/**\n * Update statistics counters based on difficulty level\n * @param stats - Statistics object to update\n * @param difficulty - Question difficulty level\n * @param isCorrect - Whether the answer is correct\n */\nconst updateDifficultyStats = (\n stats: {\n correctEasyAnswers: number;\n correctMediumAnswers: number;\n correctDifficultAnswers: number;\n totalEasyQuestions: number;\n totalMediumQuestions: number;\n totalDifficultQuestions: number;\n },\n difficulty: string | undefined,\n isCorrect: boolean\n) => {\n if (difficulty === QUESTION_DIFFICULTY.FACIL) {\n stats.totalEasyQuestions++;\n if (isCorrect) stats.correctEasyAnswers++;\n } else if (difficulty === QUESTION_DIFFICULTY.MEDIO) {\n stats.totalMediumQuestions++;\n if (isCorrect) stats.correctMediumAnswers++;\n } else if (difficulty === QUESTION_DIFFICULTY.DIFICIL) {\n stats.totalDifficultQuestions++;\n if (isCorrect) stats.correctDifficultAnswers++;\n }\n};\n\n/**\n * Calculate answer statistics by difficulty level\n * @param answers - Array of question answers\n * @returns Statistics object with counts by difficulty\n */\nconst calculateAnswerStatistics = (\n answers: Array<{\n answerStatus: string;\n difficultyLevel?: string;\n }>\n) => {\n const stats = {\n correctAnswers: 0,\n correctEasyAnswers: 0,\n correctMediumAnswers: 0,\n correctDifficultAnswers: 0,\n totalEasyQuestions: 0,\n totalMediumQuestions: 0,\n totalDifficultQuestions: 0,\n };\n\n for (const answer of answers) {\n const isCorrect = answer.answerStatus === ANSWER_STATUS.RESPOSTA_CORRETA;\n\n if (isCorrect) {\n stats.correctAnswers++;\n }\n\n updateDifficultyStats(stats, answer.difficultyLevel, isCorrect);\n }\n\n return stats;\n};\n\nconst QuizResultPerformance = forwardRef<\n HTMLDivElement,\n { showDetails?: boolean }\n>(({ showDetails = true, ...props }, ref) => {\n const {\n getTotalQuestions,\n formatTime,\n getQuestionResultStatistics,\n getQuestionResult,\n } = useQuizStore();\n\n const totalQuestions = getTotalQuestions();\n const questionResult = getQuestionResult();\n\n const stats = questionResult\n ? calculateAnswerStatistics(questionResult.answers)\n : {\n correctAnswers: 0,\n correctEasyAnswers: 0,\n correctMediumAnswers: 0,\n correctDifficultAnswers: 0,\n totalEasyQuestions: 0,\n totalMediumQuestions: 0,\n totalDifficultQuestions: 0,\n };\n\n const percentage =\n totalQuestions > 0\n ? Math.round((stats.correctAnswers / totalQuestions) * 100)\n : 0;\n\n const classesJustifyBetween = showDetails\n ? 'justify-between'\n : 'justify-center';\n return (\n <div\n className={cn(\n 'flex flex-row gap-6 p-6 rounded-xl bg-background',\n classesJustifyBetween\n )}\n ref={ref}\n {...props}\n >\n <div className=\"relative\">\n <ProgressCircle\n size=\"medium\"\n variant=\"green\"\n value={percentage}\n showPercentage={false}\n label=\"\"\n />\n\n <div className=\"absolute inset-0 flex flex-col items-center justify-center\">\n {showDetails && (\n <div className=\"flex items-center gap-1 mb-1\">\n <ClockIcon size={12} weight=\"regular\" className=\"text-text-800\" />\n <span className=\"text-2xs font-medium text-text-800\">\n {formatTime(\n (getQuestionResultStatistics()?.timeSpent ?? 0) * 60\n )}\n </span>\n </div>\n )}\n\n <div className=\"text-2xl font-medium text-text-800 leading-7\">\n {getQuestionResultStatistics()?.correctAnswers ?? '--'} de{' '}\n {totalQuestions}\n </div>\n\n <div className=\"text-2xs font-medium text-text-600 mt-1\">\n Corretas\n </div>\n </div>\n </div>\n\n {showDetails && (\n <div className=\"flex flex-col gap-4 w-full\">\n <ProgressBar\n className=\"w-full\"\n layout=\"stacked\"\n variant=\"green\"\n value={stats.correctEasyAnswers}\n max={stats.totalEasyQuestions}\n label=\"Fáceis\"\n showHitCount\n labelClassName=\"text-base font-medium text-text-800 leading-none\"\n percentageClassName=\"text-xs font-medium leading-[14px] text-right\"\n />\n\n <ProgressBar\n className=\"w-full\"\n layout=\"stacked\"\n variant=\"green\"\n value={stats.correctMediumAnswers}\n max={stats.totalMediumQuestions}\n label=\"Médias\"\n showHitCount\n labelClassName=\"text-base font-medium text-text-800 leading-none\"\n percentageClassName=\"text-xs font-medium leading-[14px] text-right\"\n />\n\n <ProgressBar\n className=\"w-full\"\n layout=\"stacked\"\n variant=\"green\"\n value={stats.correctDifficultAnswers}\n max={stats.totalDifficultQuestions}\n label=\"Difíceis\"\n showHitCount\n labelClassName=\"text-base font-medium text-text-800 leading-none\"\n percentageClassName=\"text-xs font-medium leading-[14px] text-right\"\n />\n </div>\n )}\n </div>\n );\n});\n\nconst QuizListResult = forwardRef<\n HTMLDivElement,\n {\n className?: string;\n onSubjectClick?: (subject: string) => void;\n }\n>(({ className, onSubjectClick, ...props }, ref) => {\n const { getQuestionsGroupedBySubject } = useQuizStore();\n const { isDark } = useTheme();\n const groupedQuestions = getQuestionsGroupedBySubject();\n const subjectsStats = Object.entries(groupedQuestions).map(\n ([subjectId, questions]) => {\n let correct = 0;\n let incorrect = 0;\n\n for (const question of questions) {\n if (question.answerStatus === ANSWER_STATUS.RESPOSTA_CORRETA) {\n correct++;\n } else {\n incorrect++;\n }\n }\n\n return {\n subject: {\n name:\n questions?.[0]?.knowledgeMatrix?.[0]?.subject?.name ??\n 'Sem matéria',\n id: subjectId,\n color: questions?.[0]?.knowledgeMatrix?.[0]?.subject?.color ?? '',\n icon: questions?.[0]?.knowledgeMatrix?.[0]?.subject?.icon ?? '',\n },\n correct,\n incorrect,\n total: questions.length,\n };\n }\n );\n\n return (\n <section ref={ref} className={className} {...props}>\n <p className=\"pt-6 pb-4 text-text-950 font-bold text-lg\">Matérias</p>\n\n <ul className=\"flex flex-col gap-2\">\n {subjectsStats.map((subject) => (\n <li key={subject.subject.id}>\n <CardResults\n onClick={() => onSubjectClick?.(subject.subject.id)}\n className=\"max-w-full\"\n header={subject.subject.name}\n correct_answers={subject.correct}\n incorrect_answers={subject.incorrect}\n icon={subject.subject.icon || 'Book'}\n color={\n getSubjectColorWithOpacity(subject.subject.color, isDark) ||\n undefined\n }\n direction=\"row\"\n />\n </li>\n ))}\n </ul>\n </section>\n );\n});\n\nconst QuizListResultByMateria = ({\n subject,\n onQuestionClick,\n subjectName,\n}: {\n subject: string;\n onQuestionClick: (\n question: Question | QuestionResult['answers'][number]\n ) => void;\n subjectName?: string;\n}) => {\n const { getQuestionsGroupedBySubject, getQuestionIndex, quiz } =\n useQuizStore();\n const groupedQuestions = getQuestionsGroupedBySubject();\n\n // Only show exam info (banca/year) for SIMULADO type\n const shouldShowExamInfo = quiz?.type === QUIZ_TYPE.SIMULADO;\n\n const answeredQuestions = groupedQuestions[subject] || [];\n const formattedQuestions =\n subject == 'all'\n ? Object.values(groupedQuestions).flat()\n : answeredQuestions;\n return (\n <div className=\"flex flex-col\">\n <div className=\"flex flex-row pt-4 justify-between\">\n <p className=\"text-text-950 font-bold text-2xl\">\n {subjectName ||\n formattedQuestions?.[0]?.knowledgeMatrix?.[0]?.subject?.name ||\n 'Sem matéria'}\n </p>\n </div>\n\n <section className=\"flex flex-col \">\n <p className=\"pt-6 pb-4 text-text-950 font-bold text-lg\">\n Resultado das questões\n </p>\n\n <ul className=\"flex flex-col gap-2 pt-4\">\n {formattedQuestions.map((question) => {\n // questionId exists in QuestionResult answers, id in Question\n const questionId =\n 'questionId' in question ? question.questionId : question.id;\n const questionIndex = getQuestionIndex(questionId);\n\n // examBoard and examYear only exist in Question type - only show for SIMULADO\n const examBoard =\n 'examBoard' in question ? question.examBoard : null;\n const examYear = 'examYear' in question ? question.examYear : null;\n const examInfo = shouldShowExamInfo\n ? formatExamInfo(examBoard, examYear)\n : '';\n const questionTitle = `Questão ${questionIndex.toString().padStart(2, '0')}`;\n const header = examInfo\n ? `${questionTitle} ${examInfo}`\n : questionTitle;\n return (\n <li key={question.id}>\n <CardStatus\n className=\"max-w-full\"\n header={header}\n status={(() => {\n if (\n question.answerStatus === ANSWER_STATUS.RESPOSTA_CORRETA\n )\n return 'correct';\n if (\n question.answerStatus === ANSWER_STATUS.RESPOSTA_INCORRETA\n )\n return 'incorrect';\n if (question.answerStatus === ANSWER_STATUS.NAO_RESPONDIDO)\n return 'unanswered';\n if (\n question.answerStatus === ANSWER_STATUS.PENDENTE_AVALIACAO\n )\n return 'pending';\n return undefined;\n })()}\n onClick={() => onQuestionClick?.(question)}\n />\n </li>\n );\n })}\n </ul>\n </section>\n </div>\n );\n};\n\nexport {\n QuizListResultByMateria,\n QuizListResult,\n QuizResultPerformance,\n QuizResultTitle,\n QuizResultHeaderTitle,\n QuizHeaderResult,\n};\n"],"mappings":"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","names":[]}