Files
Ascently/ios/Ascently/Utils/DataStateManager.swift
2025-11-18 12:58:45 -07:00

80 lines
2.8 KiB
Swift

//
// DataStateManager.swift
import Foundation
/// Manages the overall data state timestamp for sync purposes
class DataStateManager {
private let userDefaults = UserDefaults.standard
private enum Keys {
static let lastModified = "ascently_data_last_modified"
static let initialized = "ascently_data_state_initialized"
}
static let shared = DataStateManager()
private init() {
// Initialize with current timestamp if this is the first time
if !isInitialized() {
AppLogger.info("DataStateManager: First time initialization", tag: "DataState")
// Set initial timestamp to a very old date so server data will be considered newer
let epochTime = "1970-01-01T00:00:00.000Z"
userDefaults.set(epochTime, forKey: Keys.lastModified)
markAsInitialized()
AppLogger.info(
"DataStateManager initialized with epoch timestamp: \(epochTime)", tag: "DataState")
} else {
AppLogger.info(
"DataStateManager: Already initialized, current timestamp: \(getLastModified())",
tag: "DataState")
}
}
/// Updates the data state timestamp to the current time. Call this whenever any data is modified
/// (create, update, delete).
func updateDataState() {
let now = ISO8601DateFormatter().string(from: Date())
userDefaults.set(now, forKey: Keys.lastModified)
AppLogger.info("iOS Data state updated to: \(now)", tag: "DataState")
}
func getLastModified() -> String {
if let storedTimestamp = userDefaults.string(forKey: Keys.lastModified) {
AppLogger.debug(
"iOS DataStateManager returning stored timestamp: \(storedTimestamp)",
tag: "DataState")
return storedTimestamp
}
let epochTime = "1970-01-01T00:00:00.000Z"
AppLogger.warning(
"No data state timestamp found - returning epoch time: \(epochTime)", tag: "DataState")
return epochTime
}
func setLastModified(_ timestamp: String) {
userDefaults.set(timestamp, forKey: Keys.lastModified)
AppLogger.info("Data state set to: \(timestamp)", tag: "DataState")
}
func reset() {
userDefaults.removeObject(forKey: Keys.lastModified)
userDefaults.removeObject(forKey: Keys.initialized)
AppLogger.info("Data state reset", tag: "DataState")
}
private func isInitialized() -> Bool {
return userDefaults.bool(forKey: Keys.initialized)
}
private func markAsInitialized() {
userDefaults.set(true, forKey: Keys.initialized)
}
func getDebugInfo() -> String {
return "DataState(lastModified=\(getLastModified()), initialized=\(isInitialized()))"
}
}