'use client' import { useState } from 'react' import { useRouter } from 'next/navigation' import { startRound } from '@/app/actions/rounds' import { inviteFromLobby } from '@/app/actions/invites' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { ChevronLeft, Plus, X } from 'lucide-react' import Link from 'next/link' type Player = { id: string role: string handicapIndex: string | null courseHandicap: number | null profile: { id: string; displayName: string; avatarUrl: string | null } | null } type Invite = { id: string email: string acceptedAt: Date | null createdAt: Date } type Round = { id: string name: string | null date: string status: string holesCount: number createdBy: string course: { name: string } | null tee: { name: string; color: string } | null } export function RoundLobby({ round, players, pendingInvites, currentUserId, isCreator, }: { round: Round players: Player[] pendingInvites: Invite[] currentUserId: string isCreator: boolean }) { const router = useRouter() const [emailInput, setEmailInput] = useState('') const [inviteError, setInviteError] = useState(null) const [inviting, setInviting] = useState(false) const [starting, setStarting] = useState(false) const [startError, setStartError] = useState(null) async function handleInvite() { const email = emailInput.trim().toLowerCase() if (!email) return setInviting(true) setInviteError(null) const result = await inviteFromLobby(round.id, email) if (result.error) { setInviteError(result.error) } else { setEmailInput('') router.refresh() } setInviting(false) } async function handleStart() { setStarting(true) setStartError(null) const result = await startRound(round.id) if (result.error) { setStartError(result.error) setStarting(false) } else { router.refresh() } } return (
{/* Header */}

{round.name ?? round.course?.name ?? 'Round'}

{round.course?.name} · {round.tee?.name} tees ·{' '} {round.holesCount} holes ·{' '} {new Date(round.date).toLocaleDateString()}

Lobby
{/* Players */}

Players ({players.length})

{players.map((p) => (
{p.profile?.displayName} {p.profile?.id === currentUserId && ( (you) )} {p.role === 'admin' && ( creator )}
{p.handicapIndex !== null ? `HCP ${p.handicapIndex} · Course HCP ${p.courseHandicap}` : 'No handicap'}
))}
{/* Pending invites */} {pendingInvites.length > 0 && (

Awaiting ({pendingInvites.length})

{pendingInvites.map((invite) => (
{invite.email}
))}
)} {/* Invite form (creator only, lobby only) */} {isCreator && round.status === 'lobby' && (

Invite player

setEmailInput(e.target.value)} onKeyDown={(e) => e.key === 'Enter' && handleInvite()} placeholder="player@example.com" className="flex-1" />
{inviteError && (

{inviteError}

)}
)} {/* Start round button */} {isCreator && round.status === 'lobby' && (
{startError && (

{startError}

)}
)}
) } function Avatar({ 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}
) }