"use client" // Vennprofil-side (ADR-036 fase 2, 2026-07-28) -- svar på at det tidligere // ikke fantes NOEN vei til å gå inn på en venns profil og følge en runde // live, kun selve tilgangskontrollen. Viser navn/avatar/hjemmeklubb/HCP // (samme lavsensitive felt-sett som personsøket, GET /people/{id}) og en // liste over personens runder som SPØRREREN har lov til å se // (GET /public/people/{id}/rounds -- backend filtrerer allerede på // visibility_mode/venne-kategorisering, denne siden viser bare det den // får). Bevisst uten venneskap-administrasjon (send/fjern venn) -- det // hører hjemme i /my-friends, denne siden er en ren visning, nåbar for // enhver synlig person, ikke bare venner (en offentlig runde er synlig // for alle, også fremmede/anonyme). import { useEffect, useState } from "react" import Link from "next/link" import { ArrowLeft, ChevronRight, MapPin, Radio } from "lucide-react" import { cn } from "@/lib/utils" type ApiPerson = { id: string first_name: string last_name: string avatar_url: string | null home_club: string | null handicap_index: number | null } type ApiPersonRound = { id: string name: string | null course_name_snapshot: string played_at: string completed_at: string | null play_format: string } const FORMAT_LABELS: Record = { stroke: "Slagspill", stableford: "Stableford", match: "Match", skins: "Skins", fourball: "Fourball", foursome: "Foursome", greensome: "Greensome", scramble_2: "Scramble (2)", scramble_4: "Scramble (4)", } const dateFormatter = new Intl.DateTimeFormat("no-NO", { day: "numeric", month: "long", year: "numeric" }) function initials(name: string) { const parts = name.trim().split(/\s+/) const first = parts[0]?.[0] ?? "" const last = parts.length > 1 ? parts[parts.length - 1][0] : "" return (first + last).toUpperCase() } function Avatar({ name, url, size = "large" }: { name: string; url: string | null; size?: "large" | "small" }) { const dim = size === "large" ? "size-16 text-xl" : "size-10 text-sm" if (url) { // eslint-disable-next-line @next/next/no-img-element return } return ( ) } function RoundRow({ round }: { round: ApiPersonRound }) { const ongoing = round.completed_at === null return (
{round.name?.trim() || round.course_name_snapshot} {ongoing && ( )} {round.name?.trim() ? `${round.course_name_snapshot} · ` : ""} {FORMAT_LABELS[round.play_format] ?? round.play_format} · {dateFormatter.format(new Date(round.played_at))}