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:
parent
1c84dbd4f6
commit
18c7749a72
2 changed files with 54 additions and 30 deletions
|
|
@ -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
Loading…
Reference in a new issue