BaseStateModel.swift 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  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>(
  38. _ keyPath: WritableKeyPath<FreeAPSSettings, T>,
  39. on settingPublisher: U, initial: (T) -> Void, didSet: ((T) -> Void)? = nil
  40. ) where U.Output == T, U.Failure == Never {
  41. initial(settingsManager.settings[keyPath: keyPath])
  42. settingPublisher
  43. .removeDuplicates()
  44. .sink { [weak self] value in
  45. self?.settingsManager.settings[keyPath: keyPath] = value
  46. didSet?(value)
  47. }
  48. .store(in: &lifetime)
  49. }
  50. }