NightscoutConfigViewModel.swift 3.1 KB

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