NightscoutConfigStateModel.swift 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  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. isUploadEnabled = settingsManager.settings.isUploadEnabled
  17. useLocalSource = settingsManager.settings.useLocalGlucoseSource
  18. localPort = Decimal(settingsManager.settings.localGlucosePort)
  19. subscribeSetting(\.isUploadEnabled, on: $isUploadEnabled)
  20. subscribeSetting(\.useLocalGlucoseSource, on: $useLocalSource)
  21. subscribeSetting(\.localGlucosePort, on: $localPort.map(Int.init))
  22. }
  23. func connect() {
  24. guard let url = URL(string: url) else {
  25. message = "Invalid URL"
  26. return
  27. }
  28. connecting = true
  29. message = ""
  30. provider.checkConnection(url: url, secret: secret.isEmpty ? nil : secret)
  31. .receive(on: DispatchQueue.main)
  32. .sink { completion in
  33. switch completion {
  34. case .finished: break
  35. case let .failure(error):
  36. self.message = "Error: \(error.localizedDescription)"
  37. }
  38. self.connecting = false
  39. } receiveValue: {
  40. self.message = "Connected!"
  41. self.keychain.setValue(self.url, forKey: Config.urlKey)
  42. self.keychain.setValue(self.secret, forKey: Config.secretKey)
  43. }
  44. .store(in: &lifetime)
  45. }
  46. func delete() {
  47. keychain.removeObject(forKey: Config.urlKey)
  48. keychain.removeObject(forKey: Config.secretKey)
  49. url = ""
  50. secret = ""
  51. }
  52. }
  53. }