Add Smart data checking mode
This commit is contained in:
+39
-3
@@ -370,6 +370,8 @@ struct FuelStore {
|
||||
static let liveActivityRadiusKey = "fuelboard.liveActivityRadiusMiles" // Int miles (5/10/15)
|
||||
static let onboardingCompletedKey = "fuelboard.onboardingCompleted" // Bool
|
||||
static let lastRefreshKey = "fuelboard.lastRefresh" // TimeInterval (seconds since 1970)
|
||||
static let dataRefreshModeKey = "fuelboard.dataRefreshMode" // DataRefreshMode raw value
|
||||
static let lastSmartProbeKey = "fuelboard.lastSmartProbe" // TimeInterval (seconds since 1970)
|
||||
static let relaySourceKey = "fuelboard.relaySource" // String — "api" | "csv"
|
||||
static let stationCountKey = "fuelboard.stationCount" // String — station count
|
||||
static let dataUpdatedKey = "fuelboard.dataUpdated" // String — govUK dataset update time
|
||||
@@ -861,10 +863,24 @@ struct FuelStore {
|
||||
saveString(enabled ? "1" : "0", service: liveActivityFollowSearchKey)
|
||||
}
|
||||
|
||||
// MARK: Refresh policy — data is cached; the app only auto-refreshes
|
||||
// twice a day (pull-to-refresh is the manual override).
|
||||
// MARK: Refresh policy — Standard is cache-first/twice-daily; Smart keeps
|
||||
// the same full-dump freshness cap but may probe the tiny mirror pointer
|
||||
// more often in the background and only refresh the full dump if it changed.
|
||||
|
||||
static let refreshInterval: TimeInterval = 12 * 60 * 60
|
||||
static let smartProbeInterval: TimeInterval = 4 * 60 * 60
|
||||
|
||||
static func loadDataRefreshMode() -> DataRefreshMode {
|
||||
if let raw = loadString(service: dataRefreshModeKey),
|
||||
let mode = DataRefreshMode(rawValue: raw) {
|
||||
return mode
|
||||
}
|
||||
return .standard
|
||||
}
|
||||
|
||||
static func saveDataRefreshMode(_ mode: DataRefreshMode) {
|
||||
saveString(mode.rawValue, service: dataRefreshModeKey)
|
||||
}
|
||||
|
||||
static func loadLastRefresh() -> Date? {
|
||||
if let raw = loadString(service: lastRefreshKey), let ts = TimeInterval(raw) {
|
||||
@@ -877,6 +893,17 @@ struct FuelStore {
|
||||
saveString(String(date.timeIntervalSince1970), service: lastRefreshKey)
|
||||
}
|
||||
|
||||
static func loadLastSmartProbe() -> Date? {
|
||||
if let raw = loadString(service: lastSmartProbeKey), let ts = TimeInterval(raw) {
|
||||
return Date(timeIntervalSince1970: ts)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
static func saveLastSmartProbe(_ date: Date = Date()) {
|
||||
saveString(String(date.timeIntervalSince1970), service: lastSmartProbeKey)
|
||||
}
|
||||
|
||||
// MARK: Relay metadata — shown in Settings → About. Written after each
|
||||
// successful full fetch so the About section reflects the live source.
|
||||
|
||||
@@ -929,8 +956,17 @@ struct FuelStore {
|
||||
/// True when the cached data is fresh enough that a scheduled auto-refresh
|
||||
/// should be skipped (twice-a-day policy).
|
||||
static var isCacheFresh: Bool {
|
||||
isCacheFresh(now: Date())
|
||||
}
|
||||
|
||||
static func isCacheFresh(now: Date) -> Bool {
|
||||
guard let last = loadLastRefresh() else { return false }
|
||||
return Date().timeIntervalSince(last) < refreshInterval
|
||||
return now.timeIntervalSince(last) < refreshInterval
|
||||
}
|
||||
|
||||
static func isSmartProbeDue(now: Date = Date()) -> Bool {
|
||||
guard let last = loadLastSmartProbe() else { return true }
|
||||
return now.timeIntervalSince(last) >= smartProbeInterval
|
||||
}
|
||||
|
||||
// MARK: Onboarding — the app shows the intro screen on first launch only
|
||||
|
||||
Reference in New Issue
Block a user