dramaling-vocab-learning/frontend/components/review/shared/ConfidenceButtons.tsx

61 lines
2.2 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { ConfidenceLevel } from '@/types/review'
interface ConfidenceButtonsProps {
selectedLevel?: ConfidenceLevel | undefined
onSelect: (level: ConfidenceLevel) => void
disabled?: boolean
className?: string
}
export const ConfidenceButtons: React.FC<ConfidenceButtonsProps> = ({
selectedLevel,
onSelect,
disabled = false,
className = ''
}) => {
const confidenceLevels: { level: ConfidenceLevel; label: string; color: string }[] = [
{ level: 1, label: '完全不會', color: 'bg-red-500 hover:bg-red-600' },
{ level: 2, label: '不太會', color: 'bg-orange-500 hover:bg-orange-600' },
{ level: 3, label: '一般', color: 'bg-yellow-500 hover:bg-yellow-600' },
{ level: 4, label: '還算會', color: 'bg-blue-500 hover:bg-blue-600' },
{ level: 5, label: '非常熟悉', color: 'bg-green-500 hover:bg-green-600' }
]
return (
<div className={`space-y-4 ${className}`}>
<h3 className="text-lg font-medium text-gray-900 text-center">
</h3>
<div className="grid grid-cols-1 sm:grid-cols-5 gap-3">
{confidenceLevels.map(({ level, label, color }) => (
<button
key={level}
onClick={() => onSelect(level)}
disabled={disabled}
className={`
px-4 py-3 rounded-lg text-white font-medium text-sm
transition-all duration-200 transform
${selectedLevel === level
? `${color} ring-2 ring-offset-2 ring-gray-400 scale-105`
: `${color} hover:scale-105`
}
${disabled ? 'opacity-50 cursor-not-allowed' : 'hover:shadow-lg active:scale-95'}
`}
>
<div className="text-center">
<div className="text-lg font-bold">{level}</div>
<div className="text-xs">{label}</div>
</div>
</button>
))}
</div>
{selectedLevel && (
<p className="text-center text-sm text-gray-600">
: {confidenceLevels.find(c => c.level === selectedLevel)?.label}
</p>
)}
</div>
)
}