Restore smart settings and sync watch favourites
This commit is contained in:
@@ -0,0 +1,24 @@
|
||||
import Foundation
|
||||
|
||||
enum DataRefreshMode: String, CaseIterable, Identifiable {
|
||||
case standard
|
||||
case smart
|
||||
|
||||
var id: String { rawValue }
|
||||
|
||||
var displayName: String {
|
||||
switch self {
|
||||
case .standard: return "Standard"
|
||||
case .smart: return "Smart"
|
||||
}
|
||||
}
|
||||
|
||||
var summary: String {
|
||||
switch self {
|
||||
case .standard:
|
||||
return "Saves battery. Refreshes price data up to twice daily."
|
||||
case .smart:
|
||||
return "Checks for newer data more often in the background and refreshes full prices only when an update is available."
|
||||
}
|
||||
}
|
||||
}
|
||||
+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 watchRefreshRequestKey = "fuelboard.watchRefreshRequest" // TimeInterval (seconds since 1970)
|
||||
static let watchRefreshHandledKey = "fuelboard.watchRefreshHandled" // TimeInterval (seconds since 1970)
|
||||
static let relaySourceKey = "fuelboard.relaySource" // String — "api" | "csv"
|
||||
@@ -863,10 +865,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) {
|
||||
@@ -879,6 +895,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)
|
||||
}
|
||||
|
||||
static func requestWatchRefresh(_ date: Date = Date()) {
|
||||
saveString(String(date.timeIntervalSince1970), service: watchRefreshRequestKey)
|
||||
}
|
||||
@@ -959,8 +986,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