Parent directory

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}