// frontend/src/components/Tournament/ScoreModal.jsx
import React, { useState } from 'react';
import { Eraser, Clock, MapPin, Trophy } from 'lucide-react';
import { stringToColor } from '../../utils/helpers';
import Modal from '../UI/Modal';
const ScoreForm = ({ match, isAdmin, onSubmit, onClear }) => {
// Safe init of sets
const [sets, setSets] = useState(match.sets && match.sets.length ? match.sets : [{ p1: '', p2: '' }]);
const [code, setCode] = useState('');
const [error, setError] = useState(null);
const handleSubmit = async () => {
try { await onSubmit(match.id, sets, code); }
catch (err) { setError(typeof err.detail === 'string' ? err.detail : "Check code or scores"); }
};
const removeSet = (idx) => {
if (sets.length > 1) setSets(sets.filter((_, i) => i !== idx));
};
const updateSet = (idx, field, val) => {
const n = [...sets];
n[idx][field] = parseInt(val) || 0;
setSets(n);
};
return (
{/* Top Info Bar */}
{match.time || "10:00"}
{match.court || "TBD"}
{error && (
{error}
)}
{!isAdmin && (
setCode(e.target.value)}
placeholder="•••••"
autoComplete="off"
className="w-full bg-white dark:bg-zinc-900 border border-gray-300 dark:border-zinc-700 rounded p-3 text-center text-lg tracking-[0.5em] focus:ring-1 focus:ring-orange-500 outline-none transition text-zinc-900 dark:text-white shadow-sm"
/>
)}
{match.p1 || match.p1_label}
VS
{match.p2 || match.p2_label}
{sets.map((s, i) => (
))}
{match.isFinished && (
)}
);
};
export default function ScoreModal({ isOpen, onClose, match, isAdmin, onSubmit, onClear }) {
if (!isOpen || !match) return null;
return (
{
await onSubmit(id, sets, code);
onClose();
}}
onClear={async (id, code) => {
await onClear(id, code);
onClose();
}}
/>
);
}