NightscoutConfigStateModel.swift 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import Combine
  2. import SwiftUI
  3. extension NightscoutConfig {
  4. final class StateModel: BaseStateModel<Provider> {
  5. @Injected() var keychain: Keychain!
  6. @Published var url = ""
  7. @Published var secret = ""
  8. @Published var message = ""
  9. @Published var connecting = false
  10. @Published var isUploadEnabled = false
  11. @Published var useLocalSource = false
  12. @Published var localPort: Decimal = 0
  13. override func subscribe() {
  14. url = keychain.getValue(String.self, forKey: Config.urlKey) ?? ""
  15. secret = keychain.getValue(String.self, forKey: Config.secretKey) ?? ""
  16. subscribeSetting(\.isUploadEnabled, on: $isUploadEnabled) { isUploadEnabled = $0 }
  17. subscribeSetting(\.useLocalGlucoseSource, on: $useLocalSource) { useLocalSource = $0 }
  18. subscribeSetting(\.localGlucosePort, on: $localPort.map(Int.init)) { localPort = Decimal($0) }
  19. }
  20. func connect() {
  21. guard let url = URL(string: url) else {
  22. message = "Invalid URL"
  23. return
  24. }
  25. connecting = true
  26. message = ""
  27. provider.checkConnection(url: url, secret: secret.isEmpty ? nil : secret)
  28. .receive(on: DispatchQueue.main)
  29. .sink { completion in
  30. switch completion {
  31. case .finished: break
  32. case let .failure(error):
  33. self.message = "Error: \(error.localizedDescription)"
  34. }
  35. self.connecting = false
  36. } receiveValue: {
  37. self.message = "Connected!"
  38. self.keychain.setValue(self.url, forKey: Config.urlKey)
  39. self.keychain.setValue(self.secret, forKey: Config.secretKey)
  40. }
  41. .store(in: &lifetime)
  42. }
  43. func delete() {
  44. keychain.removeObject(forKey: Config.urlKey)
  45. keychain.removeObject(forKey: Config.secretKey)
  46. url = ""
  47. secret = ""
  48. }
  49. }
  50. }