"use client" // Bane-detaljvisning (2026-07-28): "Spilte baner" på dashbordet lenker hit -- // alle egne runder spilt på én gitt bane. Ingen nytt backend-endepunkt -- // samme GET /rounds som resten av "Egne runder"-flyten, filtrert client-side // på course_name_snapshot (samme nøkkel dashbordets "Spilte baner"-gruppering // allerede bruker, se dashboard.tsx). "Personlig rekord"-merket regnes likevel // ALLTID over hele rundelisten (ikke bare denne banen), for at merket skal // bety det samme uansett hvor et rundekort vises. import { useEffect, useState } from "react" import { useRouter } from "next/navigation" import Link from "next/link" import { Loader2, MapPin, ArrowLeft } from "lucide-react" import { Wordmark } from "@/components/wordmark" import { RoundCard, type Round } from "@/components/round-card" type ApiRoundParticipant = { id: string user_id: string | null is_owner: boolean guest_name: string | null counts_for_handicap: boolean score_differential: number | null } type ApiRound = { id: string name: string | null course_name_snapshot: string tee_name_snapshot: string played_at: string holes_planned: number completed_at: string | null participants: ApiRoundParticipant[] my_holes_played: number my_total_score: number | null my_score_to_par: number | null my_net_score_to_par: number | null play_format: string my_match_status: string | null my_match_lead: number | null } function toRound(r: ApiRound, viewerId: string | null, personalBestRoundId: string | null): Round { const me = (viewerId && r.participants.find((p) => p.user_id === viewerId)) || r.participants.find((p) => p.is_owner) return { id: r.id, name: r.name, courseName: r.course_name_snapshot, status: r.completed_at ? "completed" : "active", teeName: r.tee_name_snapshot, holes: r.holes_planned === 9 ? 9 : 18, date: r.played_at, playerCount: r.participants.length, holesPlayed: r.my_holes_played, totalScore: r.my_total_score ?? undefined, toPar: r.my_score_to_par ?? undefined, netToPar: r.my_net_score_to_par ?? undefined, playFormat: r.play_format, matchStatus: r.my_match_status, matchLead: r.my_match_lead, differential: me?.counts_for_handicap ? me.score_differential : null, isPersonalBest: personalBestRoundId !== null && r.id === personalBestRoundId, } } function findPersonalBestRoundId(rounds: ApiRound[]): string | null { const completed = rounds.filter((r) => r.completed_at !== null && r.my_score_to_par !== null) if (completed.length < 2) return null let best: { id: string; toPar: number } | null = null for (const r of completed) { const toPar = r.my_score_to_par as number if (!best || toPar < best.toPar) best = { id: r.id, toPar } } return best?.id ?? null } export function CourseRounds({ courseName }: { courseName: string }) { const router = useRouter() const [rounds, setRounds] = useState(null) const [error, setError] = useState(null) const [viewerId, setViewerId] = useState(null) useEffect(() => { let cancelled = false fetch("/auth/me", { credentials: "include" }) .then((res) => (res.ok ? res.json() : null)) .then((data: { id: string } | null) => { if (!cancelled && data) setViewerId(data.id) }) .catch(() => {}) return () => { cancelled = true } }, []) useEffect(() => { let cancelled = false async function load() { try { const res = await fetch("/rounds", { credentials: "include" }) if (res.status === 401) { router.replace("/") return } if (!res.ok) throw new Error(`rounds: ${res.status}`) const data: ApiRound[] = await res.json() const personalBestRoundId = findPersonalBestRoundId(data) const forCourse = data .filter((r) => r.course_name_snapshot === courseName) .map((r) => toRound(r, viewerId, personalBestRoundId)) if (!cancelled) setRounds(forCourse) } catch { if (!cancelled) setError("Klarte ikke å hente rundene dine. Prøv igjen om litt.") } } void load() return () => { cancelled = true } }, [router, viewerId, courseName]) return (

{rounds === null ? "Runder spilt på denne banen." : `${rounds.length} ${rounds.length === 1 ? "runde" : "runder"} spilt på denne banen.`}

{error && (

{error}

)}
{rounds === null ? ( ) : rounds.length === 0 ? ( ) : (
    {rounds.map((round) => (
  • ))}
)}
) } function LoadingState() { return (
) } function EmptyState() { return (

Ingen runder funnet

Fant ingen runder registrert på denne banen.

) }