usmle-exam-system / src /components /SidebarPanel.jsx
jianlizhao's picture
Upload 16 files
6fe52ee verified
Raw
History Blame Contribute Delete
4.12 kB
import React from 'react'
import { Sliders } from 'lucide-react'
export default function SidebarPanel({
totalQuestions,
currentQuestionIndex,
answers,
markedForReview,
onGoToQuestion,
answeredCount,
markedCount,
contrast,
onContrastChange
}) {
const getQuestionStatus = (idx) => {
if (markedForReview.has(idx)) return 'marked'
if (answers.hasOwnProperty(idx)) return 'answered'
return 'not-answered'
}
const unansweredCount = totalQuestions - answeredCount
return (
<div className="sidebar-panel">
{/* Summary Stats */}
<div className="mb-6">
<h3 className="text-sm font-semibold text-gray-700 mb-3 uppercase">Exam Status</h3>
<div className="space-y-2 text-sm">
<div className="flex justify-between">
<span className="text-gray-600">Answered:</span>
<span className="font-semibold text-green-600">{answeredCount}</span>
</div>
<div className="flex justify-between">
<span className="text-gray-600">Not Answered:</span>
<span className="font-semibold text-red-600">{unansweredCount}</span>
</div>
<div className="flex justify-between">
<span className="text-gray-600">Marked:</span>
<span className="font-semibold text-amber-600">{markedCount}</span>
</div>
</div>
<div className="mt-3 pt-3 border-t border-gray-200">
<div className="w-full bg-gray-200 rounded-full h-2">
<div
className="bg-green-500 h-2 rounded-full transition-all"
style={{ width: `${(answeredCount / totalQuestions) * 100}%` }}
/>
</div>
</div>
</div>
{/* Image Settings */}
<div className="settings-panel">
<h3 className="settings-title flex items-center gap-2">
<Sliders className="w-4 h-4" />
Image Contrast
</h3>
<div className="setting-item">
<div className="setting-label">Adjust image clarity</div>
<input
type="range"
min="50"
max="150"
value={contrast}
onChange={(e) => onContrastChange(Number(e.target.value))}
className="contrast-slider w-full"
/>
<div className="text-xs text-gray-500 mt-1">{contrast}%</div>
</div>
</div>
{/* Question Review */}
<div className="mt-4">
<h3 className="settings-title">Question Review</h3>
<div className="question-review">
{Array.from({ length: totalQuestions }).map((_, idx) => {
const status = getQuestionStatus(idx)
return (
<button
key={idx}
onClick={() => onGoToQuestion(idx)}
className={`review-item w-full text-left ${
idx === currentQuestionIndex ? 'bg-blue-50 font-semibold' : ''
}`}
>
<span
className={`status-indicator ${
status === 'answered'
? 'answered'
: status === 'marked'
? 'marked'
: 'not-answered'
}`}
/>
Q{idx + 1}
<span className="text-xs ml-1">
{status === 'answered' && '✓'}
{status === 'marked' && '⚑'}
</span>
</button>
)
})}
</div>
</div>
{/* Help Text */}
<div className="mt-6 pt-4 border-t border-gray-200 text-xs text-gray-600">
<p className="mb-2">
<span className="inline-block w-3 h-3 rounded-full bg-green-500 mr-2"></span>
Answered
</p>
<p className="mb-2">
<span className="inline-block w-3 h-3 rounded-full bg-red-500 mr-2"></span>
Not Answered
</p>
<p>
<span className="inline-block w-3 h-3 rounded-full bg-amber-500 mr-2"></span>
Marked
</p>
</div>
</div>
)
}