BaseViewModel.swift 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import Combine
  2. import SwiftUI
  3. import Swinject
  4. protocol ViewModel {
  5. func subscribe()
  6. func view(for screen: Screen) -> AnyView
  7. func cachedView(for screen: Screen) -> AnyView
  8. func showModal(for screen: Screen?)
  9. func hideModal()
  10. func cleanViewCache()
  11. }
  12. class BaseViewModel<Provider>: ViewModel, Injectable where Provider: FreeAPS.Provider {
  13. let resolver: Resolver
  14. let provider: Provider
  15. var lifetime = Lifetime()
  16. @Injected() var router: Router!
  17. private var viewCache: [Screen: AnyView] = [:]
  18. required init(provider: Provider, resolver: Resolver) {
  19. self.provider = provider
  20. self.resolver = resolver
  21. injectServices(resolver)
  22. subscribe()
  23. }
  24. func subscribe() {}
  25. func view(for screen: Screen) -> AnyView {
  26. router.view(for: screen)
  27. }
  28. func cachedView(for screen: Screen) -> AnyView {
  29. if let view = viewCache[screen] {
  30. return view
  31. }
  32. let view = view(for: screen)
  33. viewCache[screen] = view
  34. return view
  35. }
  36. func cleanViewCache() {
  37. viewCache.removeAll()
  38. }
  39. func showModal(for screen: Screen?) {
  40. router.mainModalScreen.send(screen)
  41. }
  42. func hideModal() {
  43. router.mainModalScreen.send(nil)
  44. }
  45. }