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}