"use client" import { useEffect, useState } from "react" import { Medal, ShieldAlert, Users } from "lucide-react" import { Wordmark } from "@/components/wordmark" import { cn } from "@/lib/utils" // --- API-typer (matcher app/routers/order_of_merit.py sin // get_public_order_of_merit/PublicOrderOfMeritOut) --------------------- type ApiKind = "player" | "team" type ApiResultType = "points" | "stableford" | "gross" | "net" | "money" type ApiLeaderboardEntry = { player_id: string player_name: string results_counted: number results_available: number value: number | null position: string | null eligible: boolean ineligible_reason: string | null } type ApiPublicOom = { name: string kind: ApiKind result_type: ApiResultType aggregation_mode: "sum" | "average" | "eclectic" entries: ApiLeaderboardEntry[] } const RESULT_TYPE_LABELS: Record = { points: "Poeng etter plassering", stableford: "Stableford-sum", gross: "Bruttoscore-sum", net: "Nettoscore-sum", money: "Pengeliste", } function formatValue(value: number | null, resultType: ApiResultType): string { if (value === null) return "–" if (resultType === "money") return `${Math.round(value).toLocaleString("nb-NO")} kr` return value.toLocaleString("nb-NO", { maximumFractionDigits: 1 }) } // --- Root -------------------------------------------------------------- export function PublicOrderOfMerit({ oomId }: { oomId: string }) { const [oom, setOom] = useState(null) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) useEffect(() => { let cancelled = false async function load() { try { const res = await fetch(`/public/order-of-merits/${oomId}`, { credentials: "include" }) if (res.status === 404) { if (!cancelled) setError("Order of Merit finnes ikke.") return } if (!res.ok) throw new Error(`oom: ${res.status}`) const data: ApiPublicOom = await res.json() if (!cancelled) setOom(data) } catch { if (!cancelled) setError("Klarte ikke å laste resultatlisten. Prøv å laste siden på nytt.") } finally { if (!cancelled) setLoading(false) } } void load() return () => { cancelled = true } }, [oomId]) if (loading) { return (
) } if (error || !oom) { return (

{error ?? "Order of Merit finnes ikke."}

) } return (

Resultatliste

) } // --- Banner -------------------------------------------------------------- function Banner({ name, kind, resultType }: { name: string; kind: ApiKind; resultType: ApiResultType }) { return (