1import Foundation23class HistoryManager: ObservableObject {4 static let shared = HistoryManager()56 @Published var history: [Wallpaper] = []7 8 9 10 @Published var persistenceError: String?1112 private let key = "wallpaperHistory"13 private let maxHistoryItems: Int14 private let defaults: UserDefaults15 private let encoder: JSONEncoder16 private let decoder: JSONDecoder1718 init(19 defaults: UserDefaults = .standard,20 encoder: JSONEncoder = JSONEncoder(),21 decoder: JSONDecoder = JSONDecoder(),22 maxHistoryItems: Int = 5023 ) {24 self.defaults = defaults25 self.encoder = encoder26 self.decoder = decoder27 self.maxHistoryItems = maxHistoryItems28 loadHistory()29 }3031 func addToHistory(_ wallpaper: Wallpaper) {32 33 if let index = history.firstIndex(where: { $0.id == wallpaper.id }) {34 history.remove(at: index)35 }3637 history.insert(wallpaper, at: 0)3839 if history.count > maxHistoryItems {40 history = Array(history.prefix(maxHistoryItems))41 }4243 persist(history)44 }4546 func clearHistory() {47 history = []48 persist(history)49 }5051 52 53 54 55 56 func persist(_ entries: [Wallpaper]) {57 do {58 let data = try encoder.encode(entries)59 defaults.set(data, forKey: key)60 persistenceError = nil61 } catch {62 persistenceError = "Failed to save history: \(error.localizedDescription)"63 }64 }6566 67 68 69 func decodeHistory(from data: Data?) -> [Wallpaper]? {70 guard let data else {71 persistenceError = nil72 return nil73 }74 do {75 let decoded = try decoder.decode([Wallpaper].self, from: data)76 persistenceError = nil77 return decoded78 } catch {79 persistenceError = "Failed to load history: \(error.localizedDescription)"80 return nil81 }82 }8384 private func loadHistory() {85 let stored = defaults.data(forKey: key)86 history = decodeHistory(from: stored) ?? history87 }88}