Trends: price-history fetch failure with no data raises the connection banner
A history fetch that comes back empty BECAUSE the mirror is unreachable
(pointer probe failed) was only an in-sheet retry card — no global signal.
Now it also raises the red connection banner ('Check your internet
connection / Tap to try again'), so a network problem is visible on every
tab, not just inside the Trends sheet. A successful load clears the
banner (only when the banner is the connection banner — never clobbers
the offline-dump banner).
- TrendsView: onHistoryUnavailable/onHistoryRecovered closures fired from
load() (loadFailed -> unavailable; hasAnyData -> recovered);
-forceHistoryFailure QA hook (forces the unreachable state, skips
auto-refresh like the other force-* hooks)
- FavouritesView: closures threaded through the Trends sheet init
- ContentView: wires them to dataStatus (.live -> .connectionProblem on
failure; recovered clears only .connectionProblem)
- fuelboard-development skill: hook + wiring documented
This commit is contained in:
@@ -16,6 +16,12 @@ struct TrendsView: View {
|
||||
let selectedFuel: FuelType
|
||||
let priceDisplayStyle: PriceDisplayStyle
|
||||
|
||||
/// Propagated up to ContentView so a price-history fetch that fails with
|
||||
/// NO data raises the global connection banner (same red banner as the
|
||||
/// stations fetch). `onHistoryRecovered` fires once data loads again.
|
||||
var onHistoryUnavailable: (() -> Void)? = nil
|
||||
var onHistoryRecovered: (() -> Void)? = nil
|
||||
|
||||
@Environment(\.dismiss) private var dismiss
|
||||
|
||||
@State private var fuel: FuelType = .e10
|
||||
@@ -80,6 +86,15 @@ struct TrendsView: View {
|
||||
}
|
||||
|
||||
private func load() async {
|
||||
// QA hook: force the unreachable state for screenshots (same pattern
|
||||
// as -showTrends / -forceConnectionProblem). Runs before the fetch so
|
||||
// the retry state renders immediately with no spinner flash.
|
||||
if ProcessInfo.processInfo.arguments.contains("-forceHistoryFailure") {
|
||||
series = []
|
||||
loadFailed = true
|
||||
onHistoryUnavailable?()
|
||||
return
|
||||
}
|
||||
isLoading = true
|
||||
loadFailed = false
|
||||
defer { isLoading = false }
|
||||
@@ -98,6 +113,14 @@ struct TrendsView: View {
|
||||
loadFailed = firstSnapshot == nil
|
||||
}
|
||||
series = fetched
|
||||
// A failure with no data IS a connection problem — raise the global
|
||||
// banner so the user isn't stuck with a silent retry state. Success
|
||||
// clears it (only if the banner is the connection banner).
|
||||
if loadFailed {
|
||||
onHistoryUnavailable?()
|
||||
} else if hasAnyData {
|
||||
onHistoryRecovered?()
|
||||
}
|
||||
}
|
||||
|
||||
private func yLabel(_ pence: Double) -> String {
|
||||
|
||||
Reference in New Issue
Block a user