Offline banner: label the bundled-dump fallback with its snapshot date
The no-network last resort (bundled real dump) now shows a tappable banner above the tabs — 'Offline data from 15 Aug / Pull to refresh to update prices' — so stale snapshot data is never presented as live. Banner date comes from the dump's own data_updated stamp (FuelStore.offlineDataLabel, ISO 8601 with/without fractional seconds). Cleared on any successful fetch. - BundledDumpProvider.dataUpdatedStamp (JSONSerialization, app target) - ContentView: offlineDataDate state, offlineBanner view (tip-card styling, orange wifi.slash + arrow.clockwise, tap = force refresh), refresh() clears/sets it, -forceOfflineDump QA launch hook (serves the dump and skips auto-refresh so the banner stays up for captures) - Localizable.strings: 3 keys (banner title/subtitle/a11y) - +3 tests: OfflineDataLabelTests (101 total)
This commit is contained in:
@@ -782,6 +782,27 @@ struct FuelStore {
|
||||
loadString(service: dataUpdatedKey)
|
||||
}
|
||||
|
||||
/// A short label for the offline-data banner: "15 Aug" from a GOV.UK
|
||||
/// `data_updated` ISO 8601 stamp (with or without fractional seconds).
|
||||
/// Nil when the stamp is missing or unparseable — callers then hide the
|
||||
/// banner rather than label data with a wrong date.
|
||||
static func offlineDataLabel(from stamp: String?) -> String? {
|
||||
guard let stamp, !stamp.isEmpty else { return nil }
|
||||
let withFraction = ISO8601DateFormatter()
|
||||
withFraction.formatOptions = [.withInternetDateTime, .withFractionalSeconds]
|
||||
var date = withFraction.date(from: stamp)
|
||||
if date == nil {
|
||||
let plain = ISO8601DateFormatter()
|
||||
plain.formatOptions = [.withInternetDateTime]
|
||||
date = plain.date(from: stamp)
|
||||
}
|
||||
guard let date else { return nil }
|
||||
let formatter = DateFormatter()
|
||||
formatter.dateFormat = "d MMM"
|
||||
formatter.locale = Locale(identifier: "en_GB")
|
||||
return formatter.string(from: date)
|
||||
}
|
||||
|
||||
/// True when the cached data is fresh enough that a scheduled auto-refresh
|
||||
/// should be skipped (twice-a-day policy).
|
||||
static var isCacheFresh: Bool {
|
||||
|
||||
Reference in New Issue
Block a user