"use client" import { cn } from "@/lib/utils" import type { Mode } from "@/components/logic" interface SettingsPanelProps { mode: Mode totalTasks: number | string pickCount: number | string rounds: number | string allowRepeat: boolean singleAllowRepeat: boolean selectedRecords: { number: number; colorIndex: number }[] onModeChange: (v: Mode) => void onTotalTasksChange: (v: number | string) => void onPickCountChange: (v: number | string) => void onRoundsChange: (v: number | string) => void onAllowRepeatChange: (v: boolean) => void onSingleAllowRepeatChange: (v: boolean) => void onRoll: () => void onReset: () => void isRolling: boolean errorMsg: string } function FieldRow({ label, hint, value, onChange, min = 1, error, }: { label: string hint: string value: number | string onChange: (v: number | string) => void min?: number error?: string }) { const displayValue = value === "" ? "" : value const hasError = error && value === "" return (
{label}
{hint}
{ const inputValue = e.target.value if (inputValue === "") { onChange("") } else { const v = parseInt(inputValue, 10) if (!isNaN(v)) onChange(v) } }} className={cn( "w-12 h-7 text-center text-sm font-mono bg-[#f7f8fa]", "border-x border-[#e2e6ea]", "focus:outline-none focus:bg-[#ffffff]", "[appearance:textfield] [&::-webkit-inner-spin-button]:appearance-none", hasError && "text-[#d92d20] border-[#d92d20]" )} />
) } export function SettingsPanel({ mode, totalTasks, pickCount, rounds, allowRepeat, singleAllowRepeat, selectedRecords, onModeChange, onTotalTasksChange, onPickCountChange, onRoundsChange, onAllowRepeatChange, onSingleAllowRepeatChange, onRoll, onReset, isRolling, errorMsg, }: SettingsPanelProps) { // 只有当 rounds 是数字且小于 2 时才禁用重复选项 const repeatDisabled = typeof rounds === 'number' && rounds < 2 const isSingleMode = mode === "single" return (
{/* Mode selector */}
{/* Section label */}
CONFIG
{/* Fields */}
{!isSingleMode && ( <>
)}
{/* Single mode: Allow repeat toggle */} {isSingleMode && ( )} {/* Group mode only: Toggle */} {!isSingleMode && ( <> {/* Toggle */} )} {/* Error */} {errorMsg && (
ERR: {errorMsg}
)} {/* Action buttons */}
{/* Single mode: Roll button */} {isSingleMode && ( )} {/* Single mode: Reset button */} {isSingleMode && selectedRecords.length > 0 && ( )} {/* Multi mode: Execute button */} {!isSingleMode && ( )}
) }