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

71 lines
2.4 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 React, { memo, useCallback } from 'react'
interface ConfidenceButtonsProps {
selectedLevel: number | null
onSelect: (level: number) => void
disabled?: boolean
className?: string
}
const confidenceConfig = {
1: { label: '完全不懂', color: 'bg-red-100 text-red-700 border-red-200 hover:bg-red-200' },
2: { label: '模糊', color: 'bg-orange-100 text-orange-700 border-orange-200 hover:bg-orange-200' },
3: { label: '一般', color: 'bg-yellow-100 text-yellow-700 border-yellow-200 hover:bg-yellow-200' },
4: { label: '熟悉', color: 'bg-blue-100 text-blue-700 border-blue-200 hover:bg-blue-200' },
5: { label: '非常熟悉', color: 'bg-green-100 text-green-700 border-green-200 hover:bg-green-200' }
}
export const ConfidenceButtons = memo<ConfidenceButtonsProps>(({
selectedLevel,
onSelect,
disabled = false,
className = ''
}) => {
const handleSelect = useCallback((level: number) => {
if (!disabled) {
onSelect(level)
}
}, [disabled, onSelect])
return (
<div className={`space-y-3 ${className}`}>
<h3 className="text-lg font-semibold text-gray-900 mb-4 text-left">
</h3>
<div className="grid grid-cols-5 gap-3">
{Object.entries(confidenceConfig).map(([level, config]) => {
const levelNum = parseInt(level)
const isSelected = selectedLevel === levelNum
return (
<button
key={level}
onClick={() => handleSelect(levelNum)}
disabled={disabled}
className={`
px-3 py-2 rounded-lg border-2 text-center font-medium transition-all duration-200
${isSelected
? 'ring-2 ring-blue-400 ring-opacity-75 transform scale-105'
: ''
}
${disabled
? 'opacity-50 cursor-not-allowed'
: 'cursor-pointer active:scale-95'
}
${config.color}
`}
>
<div className="flex items-center justify-center h-8">
<span className="text-sm">
{config.label}
</span>
</div>
</button>
)
})}
</div>
</div>
)
})
ConfidenceButtons.displayName = 'ConfidenceButtons'