NightscoutConfigViewModel.swift 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  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. @Published var url = ""
  7. @Published var secret = ""
  8. @Published var message = ""
  9. @Published var connecting = false
  10. override func subscribe() {
  11. url = keychain.getValue(String.self, forKey: Config.urlKey) ?? ""
  12. secret = keychain.getValue(String.self, forKey: Config.secretKey) ?? ""
  13. }
  14. func connect() {
  15. guard let url = URL(string: url) else {
  16. message = "Invalid URL"
  17. return
  18. }
  19. connecting = true
  20. message = ""
  21. provider.checkConnection(url: url, secret: secret)
  22. .receive(on: DispatchQueue.main)
  23. .sink { completion in
  24. switch completion {
  25. case .finished: break
  26. case let .failure(error):
  27. self.message = "Error: \(error.localizedDescription)"
  28. }
  29. self.connecting = false
  30. } receiveValue: {
  31. self.message = "Connected!"
  32. self.keychain.setValue(self.url, forKey: Config.urlKey)
  33. self.keychain.setValue(self.secret, forKey: Config.secretKey)
  34. }
  35. .store(in: &lifetime)
  36. }
  37. func delete() {
  38. keychain.removeObject(forKey: Config.urlKey)
  39. keychain.removeObject(forKey: Config.secretKey)
  40. url = ""
  41. secret = ""
  42. }
  43. }
  44. }