'use client' import { useRef } from 'react' import { ChevronLeft, ChevronRight } from 'lucide-react' import { strokesReceived, formatVsPar, scoreColorClass } from '@/lib/handicap' import type { Hole, Player } from '@/app/(app)/rounds/[id]/scorecard/page' type Props = { hole: Hole holeIndex: number totalHoles: number players: Player[] scores: Record runningTotals: Record isActive: boolean onPrev: () => void onNext: () => void onTapScore: (player: Player) => void } export function HoleView({ hole, holeIndex, totalHoles, players, scores, runningTotals, isActive, onPrev, onNext, onTapScore, }: Props) { const touchStartX = useRef(0) function handleTouchStart(e: React.TouchEvent) { touchStartX.current = e.touches[0].clientX } function handleTouchEnd(e: React.TouchEvent) { const diff = touchStartX.current - e.changedTouches[0].clientX if (diff > 50) onNext() if (diff < -50) onPrev() } return (
{/* Hole header */}
Hole {hole.holeNumber}
Par {hole.par} · SI {hole.strokeIndex}
{/* Players */}
{players.map((player) => { const gross = scores[`${player.userId}-${hole.id}`] ?? null const ch = player.courseHandicap ?? 0 const received = strokesReceived(ch, hole.strokeIndex, totalHoles) const net = gross !== null ? gross - received : null const grossVsPar = gross !== null ? gross - hole.par : null const netVsPar = net !== null ? net - hole.par : null return ( ) })}
{/* Hole progress dots */}
{Array.from({ length: totalHoles }, (_, i) => (
))}
) } function PlayerAvatar({ name, url }: { name: string; url?: string | null }) { const initials = name .split(' ') .map((n) => n[0]) .join('') .toUpperCase() .slice(0, 2) if (url) { return {name} } return (
{initials}
) }