"use client" import { useEffect, useRef, useState } from "react" import mapboxgl from "mapbox-gl" import "mapbox-gl/dist/mapbox-gl.css" export type FlagMapEntry = { participantId: string displayName: string lap: number holeNumber: number lat: number lng: number onGreen: boolean distanceToPinCm: number | null } export type FlagMapOverviewProps = { flags: FlagMapEntry[] visibleToAll: boolean } // ADR-067-flagg-tillegget ("Del B", 2026-08-14) -- MIDLERTIDIG, enkel // kartkomponent inntil V0-eksporten (prompt sendt til bruker) er klar. // Samme props-kontrakt -- når eksporten kommer, byttes kun komponentens // INNMAT, kalleren skal ikke måtte endres. Re-initialiserer hele kartet // når `flags` endrer referanse (enkel, men ikke det mest effisiente -- // akseptert forenkling for den midlertidige versjonen). export function FlagMapOverview({ flags, visibleToAll }: FlagMapOverviewProps) { const containerRef = useRef(null) const [loaded, setLoaded] = useState(false) const [error, setError] = useState(null) useEffect(() => { if (flags.length === 0) return const token = process.env.NEXT_PUBLIC_MAPBOX_TOKEN const container = containerRef.current if (!container) return if (!token) { setError("Kartet er ikke tilgjengelig akkurat nå.") return } setLoaded(false) setError(null) mapboxgl.accessToken = token const map = new mapboxgl.Map({ container, style: "mapbox://styles/mapbox/satellite-v9", center: [flags[0].lng, flags[0].lat], zoom: 16, attributionControl: false, }) map.on("load", () => { setLoaded(true) if (flags.length > 1) { const bounds = new mapboxgl.LngLatBounds([flags[0].lng, flags[0].lat], [flags[0].lng, flags[0].lat]) for (const f of flags) bounds.extend([f.lng, f.lat]) map.fitBounds(bounds, { padding: 80, maxZoom: 18, duration: 0 }) } }) map.on("error", () => setError("Kunne ikke laste kartet.")) const markers: mapboxgl.Marker[] = [] for (const f of flags) { const el = document.createElement("div") el.className = "flex size-7 items-center justify-center rounded-full border-2 border-white text-[10px] font-extrabold text-white shadow-md" el.style.backgroundColor = f.lap > 1 ? "#7c3aed" : "#ff5a1f" el.textContent = f.lap > 1 ? `R${f.lap}` : "⚑" const popupHtml = `
${f.displayName}
Hull ${f.holeNumber}${f.lap > 1 ? ` · runde ${f.lap}` : ""} ${ f.onGreen && f.distanceToPinCm !== null ? `
${Math.floor(f.distanceToPinCm / 100)} m ${f.distanceToPinCm % 100} cm fra hullet` : "" }
` const marker = new mapboxgl.Marker({ element: el }) .setLngLat([f.lng, f.lat]) .setPopup(new mapboxgl.Popup({ offset: 16 }).setHTML(popupHtml)) .addTo(map) markers.push(marker) } return () => { markers.forEach((m) => m.remove()) map.remove() } }, [flags]) if (flags.length === 0) { return (

{visibleToAll ? "Ingen flagg plantet ennå" : "Du har ikke plantet flagget ennå"}

) } return (
{!loaded && !error ? (

Laster kart …

) : null} {error ? (

{error}

) : null} {!visibleToAll ? (

Kun ditt eget flagg er synlig

) : null}
) } export default FlagMapOverview