NightscoutConfigViewModel.swift 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  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. override func subscribe() {
  13. url = keychain.getValue(String.self, forKey: Config.urlKey) ?? ""
  14. secret = keychain.getValue(String.self, forKey: Config.secretKey) ?? ""
  15. isUploadEnabled = settingsManager.settings.isUploadEnabled ?? false
  16. $isUploadEnabled
  17. .removeDuplicates()
  18. .sink { [weak self] enabled in
  19. self?.settingsManager.settings.isUploadEnabled = enabled
  20. }.store(in: &lifetime)
  21. }
  22. func connect() {
  23. guard let url = URL(string: url) else {
  24. message = "Invalid URL"
  25. return
  26. }
  27. connecting = true
  28. message = ""
  29. provider.checkConnection(url: url, secret: secret)
  30. .receive(on: DispatchQueue.main)
  31. .sink { completion in
  32. switch completion {
  33. case .finished: break
  34. case let .failure(error):
  35. self.message = "Error: \(error.localizedDescription)"
  36. }
  37. self.connecting = false
  38. } receiveValue: {
  39. self.message = "Connected!"
  40. self.keychain.setValue(self.url, forKey: Config.urlKey)
  41. self.keychain.setValue(self.secret, forKey: Config.secretKey)
  42. }
  43. .store(in: &lifetime)
  44. }
  45. func delete() {
  46. keychain.removeObject(forKey: Config.urlKey)
  47. keychain.removeObject(forKey: Config.secretKey)
  48. url = ""
  49. secret = ""
  50. }
  51. }
  52. }