Compare commits

...

2 commits

Author SHA1 Message Date
7bcb09a15c Dokumenter GPS-sentrering-fiksen i CHANGELOG.md
Punkt 52. Se forrige commit for koden.
2026-08-08 18:35:37 +02:00
18c7749a72 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.
2026-08-08 18:35:21 +02:00
3 changed files with 86 additions and 30 deletions

View file

@ -9470,3 +9470,35 @@ Neste steg:
**Rullet ut umiddelbart** (produksjonsbug som traff ALLE brukere som
prøvde kart-basert måling) -- kun frontend-image, `teecup_api`
bekreftet uendret.
52. **PRODUKSJONSBUG: kartet sentrerte alltid på en hardkodet Oslo-
koordinat, aldri brukerens faktiske posisjon — 2026-08-08, umiddelbar
brukeroppfølging etter punkt 51.** Bruker: "Kartet viser ikke hvor
jeg faktisk er, men en eller annen vilkårlig by."
**Rotårsak:** `MapPointPicker` sin `center: [10.7522, 59.9139]` var
en HARDKODET Oslo-koordinat, ledsaget av en kommentar som hevdet
"real app centers on last-known position" -- den logikken fantes
ALDRI, kun påstanden i kommentaren. Kartet åpnet dermed alltid på
samme faste punkt i Oslo, uansett hvor i verden (eller landet)
brukeren faktisk befant seg.
**Rettet:** kartet henter nå brukerens ekte GPS-posisjon (ett
`getCurrentPosition`-kall, samme mønster som "Min posisjon nå"-veien
-- ingen løpende `watchPosition`) FØR selve Mapbox-kartet
initialiseres, og sentrerer der. Oslo-koordinaten beholdt KUN som
fallback for det tilfellet posisjon ikke kan hentes (avslått
tillatelse, tidsavbrudd, ingen støtte i nettleseren).
`tsc --noEmit` rent. **Scratch-verifisert i ekte nettleser** (tjueandre
scratch-miljø denne økten, samme migrasjon-002-forsiktighet,
`teecup_db` bekreftet uendret): overstyrte `navigator.geolocation` til
Bergen sentrum (60,39°N 5,32°Ø) og bekreftet kartet faktisk åpnet der
(synlig annen bystruktur enn Oslo-testen fra punkt 51, pluss Mapbox
sin egen posisjons-markør synlig i visningen) i stedet for på den
tidligere faste Oslo-koordinaten. Scratch-miljøet ryddet opp
fullstendig.
**Rullet ut umiddelbart** (samme produksjonsbug-alvorlighet som
punkt 51 -- traff alle som brukte kart-valget utenfor Oslo sentrum)
-- kun frontend-image, `teecup_api` uendret.

View file

@ -36,41 +36,65 @@ export function MapPointPicker({ onConfirm }: { onConfirm: (lngLat: LngLat) => v
return
}
mapboxgl.accessToken = token
const map = new mapboxgl.Map({
container,
style: "mapbox://styles/mapbox/satellite-v9",
center: [10.7522, 59.9139], // Oslo fallback; real app centers on last-known position
zoom: 16,
attributionControl: false,
})
mapRef.current = map
let cancelled = false
map.on("load", () => setLoaded(true))
map.on("error", () => setError("Kunne ikke laste kartet."))
// 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({
container,
style: "mapbox://styles/mapbox/satellite-v9",
center,
zoom: 16,
attributionControl: false,
})
mapRef.current = map
// Tap to place/move a single draggable marker — never re-inits the map.
map.on("click", (e) => {
const lngLat = { lng: e.lngLat.lng, lat: e.lngLat.lat }
if (!markerRef.current) {
const marker = new mapboxgl.Marker({ draggable: true, color: "#d2551a" })
.setLngLat(e.lngLat)
.addTo(map)
marker.on("dragend", () => {
const p = marker.getLngLat()
setPoint({ lng: p.lng, lat: p.lat })
})
markerRef.current = marker
} else {
markerRef.current.setLngLat(e.lngLat)
}
setPoint(lngLat)
})
map.on("load", () => setLoaded(true))
map.on("error", () => setError("Kunne ikke laste kartet."))
// Tap to place/move a single draggable marker — never re-inits the map.
map.on("click", (e) => {
const lngLat = { lng: e.lngLat.lng, lat: e.lngLat.lat }
if (!markerRef.current) {
const marker = new mapboxgl.Marker({ draggable: true, color: "#d2551a" })
.setLngLat(e.lngLat)
.addTo(map)
marker.on("dragend", () => {
const p = marker.getLngLat()
setPoint({ lng: p.lng, lat: p.lat })
})
markerRef.current = marker
} else {
markerRef.current.setLngLat(e.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 () => {
cancelled = true
markerRef.current?.remove()
markerRef.current = null
map.remove()
mapRef.current?.remove()
mapRef.current = null
}
}, [])

File diff suppressed because one or more lines are too long