fix(planner): scheme-check the booking URL, and stop the serial routing calls

A booking's url is rendered as a plain href to every other member of the trip
and nothing ever checked its scheme, so a collaborator could store
javascript: there. The place website next to it has been going through
safeHttpUrl for exactly this reason, with a comment saying stored values
predate the server check - this is the surface that was left. Both ends now:
safeHttpUrl at the render site, and the scheme in the shared contract so
nothing new gets stored, additively so existing rows still load.

The per-leg routing rewrite turned one multi-waypoint request per run into
one serial request per leg. A twelve-stop day is eleven round trips to a
public OSRM in sequence before a single connector appears, and toggling km/mi
does it all again. Group consecutive legs that resolve to the same mode into
one request and fire the groups concurrently, keeping leg order on the join.

Transport reordering wrote to the store and persisted with a bare catch, so
a failed PUT left the sidebar showing an order the server never got; it
reconciles now. Plus the smaller ones: the OSM menu_url rendered unchecked,
expand/collapse-all persisting to a different storage than the day list reads,
the debounced address search with no ordering guard, the accommodation save
chain with no error path, and window.__trek_map holding a destroyed map.
This commit is contained in:
Maurice
2026-08-23 10:07:43 +02:00
committed by Maurice
parent 47a4276e84
commit 61d4fd4d64
18 changed files with 407 additions and 63 deletions
+5
View File
@@ -930,6 +930,11 @@ export function MapViewGL({
}
try { map.remove() } catch { /* noop */ }
mapRef.current = null
// Drop the debug handle too, or a style switch keeps every torn-down map
// (canvas and sources included) alive for the rest of the page's life. The
// identity check leaves a freshly built map alone if this cleanup runs late.
// eslint-disable-next-line @typescript-eslint/no-explicit-any
if ((window as any).__trek_map === map) delete (window as any).__trek_map
setMapReady(false)
}
}, [glProvider, glStyle, mapboxToken, enableMapbox3d, mapboxQuality]) // rebuild on provider/style changes only