Parent directory

SettingsStore.swift

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