"use client" // Frittstående rundeføring (ADR-033) -- runder eid direkte av en BRUKER // (app_user), ikke en organisasjon. Presentasjon fra V0, datalag skrevet om // fra mock til ekte fetch mot /rounds (samme mønster som resten av appen). import { useEffect, useState } from "react" import { useRouter } from "next/navigation" import Link from "next/link" import { Loader2, Plus, ClipboardList } from "lucide-react" import { Button } from "@/components/ui/button" import { Wordmark } from "@/components/wordmark" import { RoundCard, type Round } from "@/components/round-card" import { ArrowLeft } from "lucide-react" 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 } // viewerId er null helt til /auth/me har svart -- faller da tilbake til // eierens rad (samme oppførsel som før ADR-036 fase 3-utvidelsen). function toRound(r: ApiRound, viewerId: string | null): Round { const me = (viewerId && r.participants.find((p) => p.user_id === viewerId)) || r.participants.find((p) => p.is_owner) const differential = me?.counts_for_handicap ? me.score_differential : null 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, differential, } } export function OwnRounds() { 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() if (!cancelled) setRounds(data.map((r) => toRound(r, viewerId))) } catch { if (!cancelled) setError("Klarte ikke å hente rundene dine. Prøv igjen om litt.") } } void load() return () => { cancelled = true } }, [router, viewerId]) return (

Egne runder

Frittstående golfrunder du har registrert selv, uavhengig av turnering og klubb.

{error && (

{error}

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

Ingen runder ennå

Her dukker rundene dine opp etter hvert som du registrerer dem. Trykk på{" "} «Ny runde» øverst for å komme i gang.

) }