import Foundation import Observation struct ServerConfig: Equatable { var host: String var port: Int var useTLS: Bool var token: String var isConfigured: Bool { !host.trimmingCharacters(in: .whitespaces).isEmpty && !token.trimmingCharacters(in: .whitespaces).isEmpty } var baseURL: URL? { var c = URLComponents() c.scheme = useTLS ? "https" : "http" c.host = host.trimmingCharacters(in: .whitespaces) c.port = port return c.url } } @Observable final class Settings { private static let hostKey = "mm.host" private static let portKey = "mm.port" private static let tlsKey = "mm.tls" private static let tokenKey = "mm.token" var host: String { didSet { UserDefaults.standard.set(host, forKey: Self.hostKey) } } var port: Int { didSet { UserDefaults.standard.set(port, forKey: Self.portKey) } } var useTLS: Bool { didSet { UserDefaults.standard.set(useTLS, forKey: Self.tlsKey) } } var token: String { didSet { KeychainStore.set(token.isEmpty ? nil : token, for: Self.tokenKey) } } init() { let d = UserDefaults.standard host = d.string(forKey: Self.hostKey) ?? "" let p = d.integer(forKey: Self.portKey) port = p == 0 ? 8080 : p useTLS = d.bool(forKey: Self.tlsKey) token = KeychainStore.get(Self.tokenKey) ?? "" } var isConfigured: Bool { config.isConfigured } var config: ServerConfig { ServerConfig(host: host, port: port, useTLS: useTLS, token: token) } }