BaseStateModel.swift 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import Combine
  2. import SwiftUI
  3. import Swinject
  4. protocol StateModel: ObservableObject {
  5. var resolver: Resolver? { get set }
  6. var isInitial: Bool { get set }
  7. func subscribe()
  8. func showModal(for screen: Screen?)
  9. func hideModal()
  10. func view(for screen: Screen) -> AnyView
  11. }
  12. class BaseStateModel<Provider>: StateModel, Injectable where Provider: FreeAPS.Provider {
  13. @Injected() var router: Router!
  14. @Injected() var settingsManager: SettingsManager!
  15. var isInitial: Bool = true
  16. private(set) var provider: Provider!
  17. var resolver: Resolver? {
  18. didSet {
  19. if let resolver = resolver {
  20. injectServices(resolver)
  21. provider = Provider(resolver: resolver)
  22. subscribe()
  23. }
  24. }
  25. }
  26. var lifetime = Lifetime()
  27. func subscribe() {}
  28. func showModal(for screen: Screen?) {
  29. router.mainModalScreen.send(screen)
  30. }
  31. func hideModal() {
  32. router.mainModalScreen.send(nil)
  33. }
  34. func view(for screen: Screen) -> AnyView {
  35. router.view(for: screen)
  36. }
  37. func subscribeSetting<T: Equatable, U: Publisher>(_ keyPath: WritableKeyPath<FreeAPSSettings, T>, on settingPublisher: U)
  38. where U.Output == T, U.Failure == Never
  39. {
  40. settingPublisher
  41. .removeDuplicates()
  42. .assign(to: (\SettingsManager.settings).appending(path: keyPath), on: settingsManager)
  43. .store(in: &lifetime)
  44. }
  45. }