Fiks: kartet sentrerte alltid på en hardkodet Oslo-koordinat

Produksjonsbug rapportert umiddelbart etter forrige fiks: "Kartet viser
ikke hvor jeg faktisk er, men en eller annen vilkårlig by."

MapPointPicker sin center-koordinat var hardkodet til Oslo, ledsaget av
en kommentar som hevdet "real app centers on last-known position" --
den logikken fantes aldri, kun påstanden. Rettet: kartet henter nå
brukerens ekte GPS-posisjon (ett getCurrentPosition-kall, samme mønster
som "Min posisjon nå") FØR selve Mapbox-kartet initialiseres, med Oslo
kun som fallback hvis posisjon ikke kan hentes.

Scratch-verifisert: overstyrte navigator.geolocation til Bergen sentrum,
bekreftet kartet faktisk åpnet der (annen bystruktur enn forrige Oslo-
test), ikke lenger på den faste koordinaten. Se CHANGELOG.md punkt 52.
This commit is contained in:
Erol Haagenrud 2026-08-08 18:35:21 +02:00
parent 1c84dbd4f6
commit 18c7749a72
2 changed files with 54 additions and 30 deletions

View file

@ -36,11 +36,22 @@ export function MapPointPicker({ onConfirm }: { onConfirm: (lngLat: LngLat) => v
return return
} }
mapboxgl.accessToken = token let cancelled = false
// Reell bug funnet 2026-08-08: kartet sentrerte ALLTID på en hardkodet
// Oslo-koordinat -- en kommentar her hevdet "real app centers on
// last-known position", men den logikken fantes aldri, kun påstanden.
// Henter nå brukerens faktiske GPS-posisjon FØR kartet initialiseres
// (kun ETT kall, samme som "Min posisjon nå"-veien -- ingen løpende
// watchPosition), med Oslo som fallback KUN hvis posisjon ikke kan
// hentes (avslått tillatelse, tidsavbrudd, ingen støtte).
function initMap(center: [number, number]) {
if (cancelled || !container) return
mapboxgl.accessToken = token as string
const map = new mapboxgl.Map({ const map = new mapboxgl.Map({
container, container,
style: "mapbox://styles/mapbox/satellite-v9", style: "mapbox://styles/mapbox/satellite-v9",
center: [10.7522, 59.9139], // Oslo fallback; real app centers on last-known position center,
zoom: 16, zoom: 16,
attributionControl: false, attributionControl: false,
}) })
@ -66,11 +77,24 @@ export function MapPointPicker({ onConfirm }: { onConfirm: (lngLat: LngLat) => v
} }
setPoint(lngLat) setPoint(lngLat)
}) })
}
const OSLO_FALLBACK: [number, number] = [10.7522, 59.9139]
if (typeof navigator !== "undefined" && navigator.geolocation) {
navigator.geolocation.getCurrentPosition(
(pos) => initMap([pos.coords.longitude, pos.coords.latitude]),
() => initMap(OSLO_FALLBACK),
{ enableHighAccuracy: true, timeout: 8000 },
)
} else {
initMap(OSLO_FALLBACK)
}
return () => { return () => {
cancelled = true
markerRef.current?.remove() markerRef.current?.remove()
markerRef.current = null markerRef.current = null
map.remove() mapRef.current?.remove()
mapRef.current = null mapRef.current = null
} }
}, []) }, [])

File diff suppressed because one or more lines are too long