BaseStateModel.swift 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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. router.mainSecondaryModalView.send(nil)
  34. }
  35. func view(for screen: Screen) -> AnyView {
  36. router.view(for: screen)
  37. }
  38. func subscribeSetting<T: Equatable, U: Publisher>(
  39. _ keyPath: WritableKeyPath<FreeAPSSettings, T>,
  40. on settingPublisher: U, initial: (T) -> Void, map: ((T) -> (T))? = nil, didSet: ((T) -> Void)? = nil
  41. ) where U.Output == T, U.Failure == Never {
  42. initial(settingsManager.settings[keyPath: keyPath])
  43. settingPublisher
  44. .removeDuplicates()
  45. .map(map ?? { $0 })
  46. .sink { [weak self] value in
  47. self?.settingsManager.settings[keyPath: keyPath] = value
  48. didSet?(value)
  49. }
  50. .store(in: &lifetime)
  51. }
  52. func subscribePreferencesSetting<T: Equatable, U: Publisher>(
  53. _ keyPath: WritableKeyPath<Preferences, T>,
  54. on preferencesPublisher: U, initial: (T) -> Void, map: ((T) -> (T))? = nil, didSet: ((T) -> Void)? = nil
  55. ) where U.Output == T, U.Failure == Never {
  56. initial(settingsManager.preferences[keyPath: keyPath])
  57. preferencesPublisher
  58. .removeDuplicates()
  59. .map(map ?? { $0 })
  60. .sink { [weak self] value in
  61. self?.settingsManager.preferences[keyPath: keyPath] = value
  62. didSet?(value)
  63. }
  64. .store(in: &lifetime)
  65. }
  66. }