MainViewModel.swift 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  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 var isAlertPresented = false
  10. @Published var alertMessage = ""
  11. @Published private(set) var scene: Scene!
  12. required init(provider: Provider, resolver: Resolver) {
  13. super.init(provider: provider, resolver: resolver)
  14. scene = isAuthotized ? .authorized : .onboarding
  15. }
  16. override func subscribe() {
  17. router.mainModalScreen
  18. .map { $0?.modal(resolver: self.resolver) }
  19. .removeDuplicates { $0?.id == $1?.id }
  20. .receive(on: RunLoop.main)
  21. .sink { modal in
  22. self.modal = modal
  23. self.isModalPresented = modal != nil
  24. }
  25. .store(in: &lifetime)
  26. provider.authorizationManager
  27. .authorizationPublisher
  28. .receive(on: RunLoop.main)
  29. .assign(to: \.isAuthotized, on: self)
  30. .store(in: &lifetime)
  31. $isAuthotized
  32. .sink { isAuthotized in
  33. self.scene = isAuthotized ? .authorized : .onboarding
  34. }
  35. .store(in: &lifetime)
  36. $isModalPresented
  37. .filter { !$0 }
  38. .sink { _ in
  39. self.router.mainModalScreen.send(nil)
  40. }
  41. .store(in: &lifetime)
  42. router.alertMessage
  43. .receive(on: DispatchQueue.main)
  44. .sink { message in
  45. self.isAlertPresented = true
  46. self.alertMessage = message
  47. }
  48. .store(in: &lifetime)
  49. }
  50. }
  51. }