NightscoutConfigStateModel.swift 2.7 KB

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