MainViewModel.swift 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. import Combine
  2. import SwiftUI
  3. import Swinject
  4. extension Main {
  5. class ViewModel<Provider>: BaseViewModel<Provider>, ObservableObject where Provider: MainProvider {
  6. @Published private(set) var isAuthotized = false
  7. private(set) var modal: Modal?
  8. @Published var isModalPresented = false
  9. @Published private(set) var scene: Scene!
  10. private var nextModal: Modal?
  11. required init(provider: Provider, resolver: Resolver) {
  12. super.init(provider: provider, resolver: resolver)
  13. scene = isAuthotized ? .authorized : .onboarding
  14. }
  15. override func subscribe() {
  16. router.modalScreen
  17. .map { $0?.modal(resolver: self.resolver) }
  18. .removeDuplicates { $0?.id == $1?.id }
  19. .receive(on: RunLoop.main)
  20. .sink { modal in
  21. self.modal = modal
  22. self.isModalPresented = modal != nil
  23. }
  24. .store(in: &lifetime)
  25. provider.authorizationManager
  26. .authorizationPublisher
  27. .receive(on: RunLoop.main)
  28. .assign(to: \.isAuthotized, on: self)
  29. .store(in: &lifetime)
  30. $isAuthotized
  31. .sink { isAuthotized in
  32. self.scene = isAuthotized ? .authorized : .onboarding
  33. }
  34. .store(in: &lifetime)
  35. $isModalPresented
  36. .filter { !$0 }
  37. .sink { _ in
  38. self.router.modalScreen.send(nil)
  39. }
  40. .store(in: &lifetime)
  41. }
  42. }
  43. }