//Made by Lumaa import Foundation @Observable class UserPreferences: Codable, ObservableObject { private static let saveKey: String = "threaded-preferences.user" public static let defaultPreferences: UserPreferences = .init() // Final var displayedName: DisplayedName = .username var profilePictureShape: ProfilePictureShape = .circle var browserType: BrowserType = .inApp // Experimental var showExperimental: Bool = false var experimental: UserPreferences.Experimental init(displayedName: DisplayedName = .username, profilePictureShape: ProfilePictureShape = .circle, browserType: BrowserType = .inApp, showExperimental: Bool = false, experimental: UserPreferences.Experimental = .init()) { self.displayedName = displayedName self.profilePictureShape = profilePictureShape self.browserType = browserType self.showExperimental = showExperimental self.experimental = experimental } @Observable class Experimental: Codable, ObservableObject { private static let saveKey: String = "threaded-preferences.experimental" var replySymbol: Bool = false init(replySymbol: Bool = false) { self.replySymbol = replySymbol } func saveAsCurrent() throws { let encoder = JSONEncoder() let json = try encoder.encode(self) UserDefaults.standard.setValue(json, forKey: UserPreferences.Experimental.saveKey) } static func loadAsCurrent() throws -> UserPreferences.Experimental? { let decoder = JSONDecoder() if let data = UserDefaults.standard.data(forKey: UserPreferences.Experimental.saveKey) { let exp = try decoder.decode(UserPreferences.Experimental.self, from: data) return exp } return nil } } func saveAsCurrent() throws { let encoder = JSONEncoder() let json = try encoder.encode(self) UserDefaults.standard.setValue(json, forKey: UserPreferences.saveKey) } static func loadAsCurrent() throws -> UserPreferences? { let decoder = JSONDecoder() if let data = UserDefaults.standard.data(forKey: UserPreferences.saveKey) { let pref = try decoder.decode(UserPreferences.self, from: data) return pref } return nil } // Enums and other enum DisplayedName: Codable, CaseIterable { case username, displayName, both } enum ProfilePictureShape: Codable, CaseIterable { case circle, rounded } enum BrowserType: Codable, CaseIterable { case inApp, outApp } }