MainStateModel.swift 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import SwiftMessages
  2. import SwiftUI
  3. import Swinject
  4. extension Main {
  5. final class StateModel: BaseStateModel<Provider> {
  6. private(set) var modal: Modal?
  7. @Published var isModalPresented = false
  8. @Published var isSecondaryModalPresented = false
  9. @Published var secondaryModalView: AnyView? = nil
  10. override func subscribe() {
  11. router.mainModalScreen
  12. .map { $0?.modal(resolver: self.resolver!) }
  13. .removeDuplicates { $0?.id == $1?.id }
  14. .receive(on: DispatchQueue.main)
  15. .sink { modal in
  16. self.modal = modal
  17. self.isModalPresented = modal != nil
  18. }
  19. .store(in: &lifetime)
  20. $isModalPresented
  21. .filter { !$0 }
  22. .sink { _ in
  23. self.router.mainModalScreen.send(nil)
  24. }
  25. .store(in: &lifetime)
  26. router.alertMessage
  27. .receive(on: DispatchQueue.main)
  28. .sink { message in
  29. SwiftMessages.show {
  30. let view = MessageView.viewFromNib(layout: .messageView)
  31. view.backgroundColor = .secondarySystemGroupedBackground
  32. view.titleLabel?.textColor = .label
  33. view.bodyLabel?.textColor = .label
  34. view.configureContent(
  35. title: NSLocalizedString("Info", comment: "Info title"),
  36. body: NSLocalizedString(message, comment: "Info message"),
  37. iconImage: nil,
  38. iconText: nil,
  39. buttonImage: nil,
  40. buttonTitle: nil,
  41. buttonTapHandler: nil
  42. )
  43. view.bodyLabel?.text = message
  44. return view
  45. }
  46. }
  47. .store(in: &lifetime)
  48. router.mainSecondaryModalView
  49. .receive(on: DispatchQueue.main)
  50. .sink { view in
  51. self.secondaryModalView = view
  52. self.isSecondaryModalPresented = view != nil
  53. }
  54. .store(in: &lifetime)
  55. $isSecondaryModalPresented
  56. .removeDuplicates()
  57. .filter { !$0 }
  58. .sink { _ in
  59. self.router.mainSecondaryModalView.send(nil)
  60. }
  61. .store(in: &lifetime)
  62. }
  63. }
  64. }