MainViewModel.swift 1.7 KB

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