import { Badge, Box, Button, ButtonGroup, Divider, HStack, Icon, Link, Modal, ModalBody, ModalCloseButton, ModalContent, ModalFooter, ModalHeader, ModalOverlay, Stack, Text, useColorMode, useColorModeValue, useDisclosure, } from '@chakra-ui/react'; import { __ } from '@wordpress/i18n'; import React from 'react'; import { BiCheckCircle, BiInfoCircle, BiXCircle } from 'react-icons/bi'; import { Table, Tbody, Td, Th, Thead, Tr } from 'react-super-responsive-table'; import CustomAlert from '../../../../assets/js/back-end/components/common/CustomAlert'; import { Attempts, EarnedPoints, Eye, Restart, ResultIcon, TotalPoints, } from '../../../../assets/js/back-end/constants/images'; import { getWordpressLocalTime } from '../../../../assets/js/back-end/utils/utils'; import { COLORS_BASED_ON_SCREEN_COLOR_MODE } from '../../../../assets/js/interactive/constants/general'; import localized from '../../../../assets/js/interactive/utils/global'; export interface QuestionScore { h5p_content_id: number; question_index: number; title?: string; score: number; max_score: number; success: boolean | null; completed: boolean; } interface Props { totalQuestions: number; totalAttempts: number; maxScore: number; earnedScore: number; percentage: number; passed: string; totalAnsweredQuestions?: number; totalCorrectAnswers?: number; questionScores?: QuestionScore[]; quizName?: string; duration?: number; startedAt?: string | null; finishedAt?: string | null; onStartPress: () => void; isButtonLoading?: boolean; limitReached: boolean; } const tdStyles = { display: 'flex', alignItems: 'center', gap: '8px', }; const H5PScoreBoard: React.FC = ({ totalQuestions, totalAttempts, maxScore, earnedScore, percentage, passed, totalAnsweredQuestions = 0, totalCorrectAnswers = 0, questionScores = [], quizName, duration = 0, startedAt = null, finishedAt = null, onStartPress, isButtonLoading, limitReached, }) => { const { colorMode } = useColorMode(); const isScored = maxScore > 0; const { isOpen: isQuizDetailOpen, onOpen: onQuizDetailOpen, onClose: onQuizDetailClose, } = useDisclosure(); const contentColor = COLORS_BASED_ON_SCREEN_COLOR_MODE[colorMode]?.quizAttemptsContentColor; const resultTextColor = COLORS_BASED_ON_SCREEN_COLOR_MODE[colorMode] ?.quizResultPercentageInScoreboard ?? 'gray.700'; const detailsTableBg = COLORS_BASED_ON_SCREEN_COLOR_MODE[colorMode]?.quizDetailsTableBg; const modalCloseButtonBG = useColorModeValue('oxford-night', 'white'); const modalTitleColor = useColorModeValue('oxford-night', 'white'); const modalCloseButtonIconColor = useColorModeValue('white', 'black'); const isQuizAnswered = totalAnsweredQuestions === 0 ? BiXCircle : BiCheckCircle; /** * Convert minutes to "x hrs y mins". */ const getHrsAndMins = (minutes: number) => { const hrs = Math.floor(minutes / 60); const mins = minutes % 60; return hrs + ' hrs ' + mins + ' mins'; }; /** * Elapsed time between two timestamps as "h hrs m min s sec". */ const getTotalAttemptTime = (start: any, end: any) => { if (!start || !end) { return '—'; } let seconds = Math.floor( (new Date(end).getTime() - new Date(start).getTime()) / 1000, ); if (isNaN(seconds) || seconds < 0) { return '—'; } const hours = Math.floor(seconds / (60 * 60)); seconds -= hours * 60 * 60; const minutes = Math.floor(seconds / 60); seconds -= minutes * 60; return hours + ' hrs ' + minutes + ' min ' + seconds + ' sec'; }; const ResultBadge = () => passed === 'yes' ? ( {__('Pass', 'learning-management-system')} ) : ( {__('Fail', 'learning-management-system')} ); const ResultSummary = () => ( {isScored && ( {percentage}% )} ); return (
{__('Metric', 'learning-management-system')} {__('Points', 'learning-management-system')}
{__('Total Questions', 'learning-management-system')} {totalQuestions}
{__('Answered Questions', 'learning-management-system')} {totalAnsweredQuestions}
{__('Total Attempts', 'learning-management-system')} {totalAttempts}
{__('Total Points', 'learning-management-system')} {maxScore}
{__('Earned Points', 'learning-management-system')} {earnedScore}
{__('Result:', 'learning-management-system')}
{__('Result Details', 'learning-management-system')}
{__('Quiz Info', 'learning-management-system')} {__('Quiz Summary', 'learning-management-system')} {__('Result', 'learning-management-system')}
{quizName} {__('Date:', 'learning-management-system')} {startedAt ? getWordpressLocalTime( startedAt, 'm/d/Y, h:i A', ) : '—'} {__( 'Total Attempts:', 'learning-management-system', )} {totalAttempts} {__('Quiz Time:', 'learning-management-system')} {getHrsAndMins(duration)} {__( 'Attempt Time:', 'learning-management-system', )} {getTotalAttemptTime(startedAt, finishedAt)} {__( 'Earned Points:', 'learning-management-system', )} {earnedScore} / {maxScore} {__( 'Correct Answers:', 'learning-management-system', )} {totalCorrectAnswers} / {totalQuestions} {__( 'Attempt Questions:', 'learning-management-system', )} {totalAnsweredQuestions} / {totalQuestions}
{__('Question Details', 'learning-management-system')} {questionScores.length === 0 ? ( ) : null} {questionScores.map((q) => ( ))}
{__('Question', 'learning-management-system')} {__('Result', 'learning-management-system')} {__('Points', 'learning-management-system')}
{__( 'No question-level data was recorded for this attempt.', 'learning-management-system', )}
{q.title || __('Question', 'learning-management-system')} {!q.completed ? ( {__( 'Not attempted', 'learning-management-system', )} ) : q.success === true ? ( {__('Correct', 'learning-management-system')} ) : q.success === false ? ( {__( 'Incorrect', 'learning-management-system', )} ) : ( {__('Answered', 'learning-management-system')} )} {q.completed && q.max_score > 0 ? `${q.score}/${q.max_score} ${__( 'pts', 'learning-management-system', )}` : '—'}
{__( 'View your complete quiz history from your ', 'learning-management-system', )} {__('account page', 'learning-management-system')}.
); }; export default H5PScoreBoard;