SettingsStore.swift
1126 bytes
1import Combine
2import Foundation
3import ytrssilShared
4
5@MainActor
6final class SettingsStore: ObservableObject {
7 private static let serverURLKey = "serverURL"
8 private static let tokenAccount = "apiToken"
9
10 private let defaults: UserDefaults
11 @Published private(set) var serverURL: String
12 @Published private(set) var token: String
13
14 init(defaults: UserDefaults = .standard) {
15 self.defaults = defaults
16 serverURL = defaults.string(forKey: Self.serverURLKey) ?? ""
17 token = (try? KeychainStore.load(account: Self.tokenAccount)) ?? ""
18 }
19
20 var configuration: ServerConfiguration? {
21 try? ServerConfiguration(serverURL: serverURL, token: token)
22 }
23
24 func save(serverURL: String, token: String) throws {
25 let configuration = try ServerConfiguration(serverURL: serverURL, token: token)
26
27 try KeychainStore.save(configuration.token, account: Self.tokenAccount)
28 defaults.set(configuration.baseURL.absoluteString, forKey: Self.serverURLKey)
29
30 self.serverURL = configuration.baseURL.absoluteString
31 self.token = configuration.token
32 }
33}