Refine trends and debug harness; clean up warnings

This commit is contained in:
FuelBoard Contributor
2026-08-17 14:06:26 +01:00
parent 68d970720a
commit 63084322f6
16 changed files with 398 additions and 80 deletions
+51 -7
View File
@@ -222,15 +222,36 @@ struct ContentView: View {
// opens the given tab; `-skipOnboarding` skips onboarding
// without touching the stored flag.
let args = ProcessInfo.processInfo.arguments
#if DEBUG
showWidgetMock = args.contains("-widgets")
// `-seedFavourite <substring>` pins the first matching station
// for Unleaded via the normal save path (keychain + app group)
// so screenshot captures can show a populated Favourites tab.
if let i = args.firstIndex(of: "-seedFavourite"), i + 1 < args.count {
let query = args[i + 1]
if let station = FuelStore.loadStations()
.first(where: { $0.name.localizedCaseInsensitiveContains(query) }) {
FuelStore.saveFavourites([FavouriteEntry(station: station, fuel: .e10)])
// Repeatable: each occurrence adds another favourite (QA temp).
// Optional ":fuel" suffix (e10|e5|diesel) picks the
// fuel, so the fuel-aware Trends open can be verified (QA temp).
let seedQueries = args.enumerated()
.filter { $0.element == "-seedFavourite" }
.compactMap { i, _ in
i + 1 < args.count ? args[i + 1] : nil
}
if !seedQueries.isEmpty {
let stations = FuelStore.loadStations()
var favs = seedQueries.compactMap { query in
let parts = query.split(separator: ":", maxSplits: 1)
let name = String(parts[0])
let fuel = parts.count > 1
? FuelType(rawValue: String(parts[1])) ?? .e10
: FuelType.e10
return stations.first { $0.name.localizedCaseInsensitiveContains(name) }
.map { FavouriteEntry(station: $0, fuel: fuel) }
}
if favs.isEmpty, let q = seedQueries.first,
let s = stations.first(where: { $0.name.localizedCaseInsensitiveContains(q.split(separator: ":").first.map(String.init) ?? q) }) {
favs = [FavouriteEntry(station: s, fuel: .e10)]
}
if !favs.isEmpty {
FuelStore.saveFavourites(favs)
}
}
if let i = args.firstIndex(of: "-tab"), i + 1 < args.count {
@@ -241,6 +262,14 @@ struct ContentView: View {
default: selectedTab = 0
}
}
// QA temp: `-fuel <e10|e5|diesel>` sets the app-wide selected
// fuel so the fuel-aware Trends open can be verified (simulates
// the user having switched to the diesel tab).
if let i = args.firstIndex(of: "-fuel"), i + 1 < args.count,
let f = FuelType(rawValue: args[i + 1]) {
selectedFuel = f
FuelStore.saveSelectedFuel(f)
}
// `-forceOfflineDump` / `-forceConnectionProblem` simulate the two
// failure legs for the screenshot harness. The auto-refresh below
// is skipped so the banner stays up (a live fetch would clear it).
@@ -254,6 +283,9 @@ struct ContentView: View {
: FuelStore.loadStations()
dataStatus = .connectionProblem
}
#else
showWidgetMock = false
#endif
// Onboarding runs first on a fresh install it owns the initial
// permission prompts (location, notifications, and the data/local
// network probe on the Data page). Location tracking and the first
@@ -261,8 +293,13 @@ struct ContentView: View {
// Launch-arg hook (UI-testing/screenshot harness, same pattern as
// StationsView's `-showKeySheet`): skip onboarding without
// touching the stored flag.
#if DEBUG
let shouldSkipOnboarding = args.contains("-skipOnboarding")
#else
let shouldSkipOnboarding = false
#endif
if FuelStore.loadHasCompletedOnboarding()
|| args.contains("-skipOnboarding") {
|| shouldSkipOnboarding {
locationManager.startForegroundTracking()
// Geofences must follow the user even in the background:
// wire the delegate hook (fires on every fix incl. background
@@ -284,7 +321,14 @@ struct ContentView: View {
updateLiveActivity()
// Refresh only when the cache is stale (twice-a-day policy).
// Skipped under the force-* hooks so the banner stays up.
if !args.contains("-forceOfflineDump") && !args.contains("-forceConnectionProblem") && !args.contains("-forceHistoryFailure") {
#if DEBUG
let shouldSkipInitialRefresh = args.contains("-forceOfflineDump")
|| args.contains("-forceConnectionProblem")
|| args.contains("-forceHistoryFailure")
#else
let shouldSkipInitialRefresh = false
#endif
if !shouldSkipInitialRefresh {
Task { await refresh() }
}
} else {