'use client' import { useEffect, useRef, useState } from 'react' import { Button } from '@/components/ui/button' import type { Hole, Player } from '@/app/(app)/rounds/[id]/scorecard/page' type Props = { open: boolean hole: Hole | null player: Player | null currentStrokes: number | null onSave: (strokes: number) => void onClose: () => void } export function ScoreEntrySheet({ open, hole, player, currentStrokes, onSave, onClose }: Props) { const [strokes, setStrokes] = useState(currentStrokes ?? hole?.par ?? 4) const [editingNumber, setEditingNumber] = useState(false) const inputRef = useRef(null) // Reset when a new entry opens useEffect(() => { if (open) { setStrokes(currentStrokes ?? hole?.par ?? 4) setEditingNumber(false) } }, [open, hole?.id, player?.user_id]) useEffect(() => { if (editingNumber) inputRef.current?.select() }, [editingNumber]) // Lock body scroll when open useEffect(() => { document.body.style.overflow = open ? 'hidden' : '' return () => { document.body.style.overflow = '' } }, [open]) if (!hole || !player) return null const par = hole.par const vsPar = strokes - par return ( <> {/* Backdrop */}
{/* Sheet */}
{/* Handle */}
{/* Player + hole info */}
{player.profile?.display_name}
Hole {hole.hole_number} · Par {par} · SI {hole.stroke_index}
0 ? 'text-muted-foreground' : 'text-foreground' }`} > {vsPar === 0 ? 'Par' : vsPar > 0 ? `+${vsPar}` : vsPar}
{/* Score input */}
{/* Minus */} {/* Score display / input */} {editingNumber ? ( setStrokes(Math.max(1, parseInt(e.target.value) || 1))} onBlur={() => setEditingNumber(false)} className="h-20 w-20 rounded-xl border-2 border-primary bg-background text-center text-4xl font-bold outline-none" /> ) : ( )} {/* Plus */}
{/* Save */}
) }