road distance: trigger at launch + foreground, fall back to saved location

Road-distance routing previously only fired once a fresh GPS fix arrived via
the location hook/onChange. A returning user on a cold launch waited for that
fix, and if onboarding/flag issues kept tracking from starting, distances
stayed straight-line. Now:
- refreshRoadDistancesIfNeeded() uses the last saved location when the live
  fix isn't set yet, so it can run immediately.
- It's called explicitly on launch (already-onboarded branch), on foreground
  activation, and on the existing location paths.
This commit is contained in:
FuelBoard Contributor
2026-08-20 12:56:16 +01:00
parent dc6d1fd724
commit d73a64023f
+11 -4
View File
@@ -56,14 +56,16 @@ struct ContentView: View {
/// Kicks off a (throttled) Apple-Maps road-distance recompute for the /// Kicks off a (throttled) Apple-Maps road-distance recompute for the
/// stations around the current fix. The app owns routing the widget and /// stations around the current fix. The app owns routing the widget and
/// Live Activity only read the cached result. /// Live Activity only read the cached result. Falls back to the last saved
/// location so it can run before the first fresh GPS fix arrives.
private func refreshRoadDistancesIfNeeded() { private func refreshRoadDistancesIfNeeded() {
guard let location else { return } let origin = location ?? FuelStore.loadLocation()
guard let origin else { return }
Task { Task {
await RoadDistanceService.refreshIfNeeded( await RoadDistanceService.refreshIfNeeded(
stations: stations, stations: stations,
lat: location.lat, lat: origin.lat,
lng: location.lng lng: origin.lng
) )
} }
} }
@@ -332,6 +334,10 @@ struct ContentView: View {
fuel: alertsFuel, radiusKM: effectiveAlertsRadiusKM) fuel: alertsFuel, radiusKM: effectiveAlertsRadiusKM)
monitor.setEnabled(alertsEnabled) monitor.setEnabled(alertsEnabled)
updateLiveActivity() updateLiveActivity()
// Compute road distances early (throttled; falls back to the
// last saved location) so distance surfaces are road-matched
// as soon as stations are available.
refreshRoadDistancesIfNeeded()
// Refresh only when the cache is stale (twice-a-day policy). // Refresh only when the cache is stale (twice-a-day policy).
// Skipped under the force-* hooks so the banner stays up. // Skipped under the force-* hooks so the banner stays up.
#if DEBUG #if DEBUG
@@ -377,6 +383,7 @@ struct ContentView: View {
monitor.update(stations: stations, favourites: refreshedFavourites, monitor.update(stations: stations, favourites: refreshedFavourites,
fuel: alertsFuel, radiusKM: effectiveAlertsRadiusKM) fuel: alertsFuel, radiusKM: effectiveAlertsRadiusKM)
updateLiveActivity() updateLiveActivity()
refreshRoadDistancesIfNeeded()
// No network fetch on foreground pull-to-refresh is the override. // No network fetch on foreground pull-to-refresh is the override.
} else { } else {
locationManager.stopForegroundTracking() locationManager.stopForegroundTracking()