import React, { useState, useEffect } from 'react'; import { getNonce } from '../../Helpers'; import ArrowBackIcon from '@mui/icons-material/ArrowBack'; import AssessmentIcon from '@mui/icons-material/Assessment'; import PersonIcon from '@mui/icons-material/Person'; import CheckCircleIcon from '@mui/icons-material/CheckCircle'; import CancelIcon from '@mui/icons-material/Cancel'; import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer, PieChart, Pie, Cell } from 'recharts'; interface QuizResultsProps { quizId: number; quizName: string; onBack: () => void; } interface Submission { id: number; user_id: number; user_name: string; user_email: string; score: number; total_questions: number; percentage: number; passed: boolean; answers: any; submitted_at: string; } const QuizResults: React.FC = ({ quizId, quizName, onBack }) => { const [submissions, setSubmissions] = useState([]); const [loading, setLoading] = useState(true); const [stats, setStats] = useState({ total_submissions: 0, average_score: 0, pass_rate: 0, }); useEffect(() => { loadResults(); }, [quizId]); const loadResults = () => { setLoading(true); (wp as any).ajax.send('simpleform_get_quiz_results', { data: { nonce: getNonce(), quiz_id: quizId, }, success(response: any) { if (response.submissions) { const transformedSubmissions = response.submissions.map((sub: any) => ({ ...sub, score: Number(sub.score), total_questions: Number(sub.total_questions), percentage: (Number(sub.score) / Number(sub.total_questions)) * 100, passed: sub.passed === "1" || sub.passed === true, user_name: sub.user_name || 'Anonymous', user_email: sub.user_email || '-', submitted_at: sub.created_at })); setSubmissions(transformedSubmissions); } if (response.stats) { setStats(response.stats); } setLoading(false); }, error(error: any) { console.error('Error loading results:', error); setLoading(false); }, }); }; const formatDate = (dateString: string) => { return new Date(dateString).toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' }); }; // Prepare data for charts const getScoreDistribution = () => { const distribution: { [key: string]: number } = {}; submissions.forEach(sub => { const scoreRange = `${Math.floor(sub.percentage / 10) * 10}-${Math.floor(sub.percentage / 10) * 10 + 10}%`; distribution[scoreRange] = (distribution[scoreRange] || 0) + 1; }); return Object.entries(distribution).map(([range, count]) => ({ range, count })).sort((a, b) => parseInt(a.range) - parseInt(b.range)); }; const getPassFailData = () => { const passed = submissions.filter(s => s.passed).length; const failed = submissions.filter(s => !s.passed).length; return [ { name: 'Passed', value: passed, color: '#10b981' }, { name: 'Failed', value: failed, color: '#ef4444' } ]; }; const COLORS = ['#10b981', '#ef4444']; if (loading) { return (

Loading results...

); } return (

Quiz Results: {quizName}

{stats.total_submissions}

Total Submissions

{stats.average_score.toFixed(1)}%

Average Score

{stats.pass_rate.toFixed(1)}%

Pass Rate

{submissions.length === 0 ? (

No submissions yet

Results will appear here once users complete the quiz

) : ( <>

Score Distribution

Pass/Fail Ratio

`${name}: ${value} (${(percent * 100).toFixed(0)}%)`} outerRadius={80} fill="#8884d8" dataKey="value" > {getPassFailData().map((entry, index) => ( ))}

All Submissions

{submissions.map(submission => ( ))}
User Email Score Percentage Status Submitted
{submission.user_name} {submission.user_email} {submission.score} / {submission.total_questions} {submission.percentage.toFixed(1)}% {submission.passed ? ( <> Passed ) : ( <> Failed )} {formatDate(submission.submitted_at)}
)}
); }; export default QuizResults;