import React from 'react' import { motion } from 'framer-motion' import { Delete, RotateCcw, Check } from 'lucide-react' interface NumberKeyboardProps { onNumberClick: (number: string) => void onDeleteClick: () => void onClearClick: () => void onConfirmClick: () => void disabled?: boolean canConfirm?: boolean studentIdLength?: number } const NumberKeyboard: React.FC = ({ onNumberClick, onDeleteClick, onClearClick, onConfirmClick, disabled = false, canConfirm = false, studentIdLength = 0 }) => { // 数字键盘布局 const keyboardLayout = [ ['1', '2', '3'], ['4', '5', '6'], ['7', '8', '9'], ['clear', '0', 'delete'] ] // 按钮点击动画变体 const buttonVariants = { initial: { scale: 1 }, tap: { scale: 0.95 }, hover: { scale: 1.05 } } // 渲染按钮内容 const renderButtonContent = (key: string) => { switch (key) { case 'delete': return case 'clear': return default: return {key} } } // 检查数字键是否应该被禁用 const isNumberKeyDisabled = (key: string) => { // 如果是数字键且学号已达到12位,则禁用 return /^[0-9]$/.test(key) && studentIdLength >= 12 } // 获取按钮样式 const getButtonStyle = (key: string) => { const baseStyle = "w-[140px] h-[140px] rounded-2xl font-bold transition-all duration-200 flex items-center justify-center shadow-lg" if (disabled) { return `${baseStyle} bg-gray-500/20 text-gray-400 cursor-not-allowed` } // 检查数字键是否被禁用 if (isNumberKeyDisabled(key)) { return `${baseStyle} bg-gray-500/20 text-gray-400 cursor-not-allowed` } switch (key) { case 'delete': return `${baseStyle} bg-red-500/20 hover:bg-red-500/30 text-red-400 hover:text-red-300 border border-red-500/30` case 'clear': return `${baseStyle} bg-yellow-500/20 hover:bg-yellow-500/30 text-yellow-400 hover:text-yellow-300 border border-yellow-500/30` default: return `${baseStyle} bg-blue-500/20 hover:bg-blue-500/30 text-white border border-blue-500/30 hover:border-blue-400` } } // 处理按钮点击 const handleButtonClick = (key: string) => { if (disabled) return // 如果是数字键且被禁用,则不处理点击 if (isNumberKeyDisabled(key)) return switch (key) { case 'delete': onDeleteClick() break case 'clear': onClearClick() break default: onNumberClick(key) break } } return (
{/* 数字键盘网格 */}
{keyboardLayout.map((row, rowIndex) => row.map((key, keyIndex) => ( handleButtonClick(key)} className={getButtonStyle(key)} disabled={disabled || isNumberKeyDisabled(key)} > {renderButtonContent(key)} )) )}
{/* 确认按钮 */} 开始抽奖 {/* 键盘说明 */}

点击数字输入学号

清空
删除
) } export default React.memo(NumberKeyboard)