MainStateModel.swift 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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. var config = SwiftMessages.defaultConfig
  30. let view = MessageView.viewFromNib(layout: .cardView)
  31. let titleContent: String
  32. view.configureContent(
  33. title: "title",
  34. body: NSLocalizedString(message.content, comment: "Info message"),
  35. iconImage: nil,
  36. iconText: nil,
  37. buttonImage: nil,
  38. buttonTitle: nil,
  39. buttonTapHandler: nil
  40. )
  41. switch message.type {
  42. case .info:
  43. view.backgroundColor = .secondarySystemGroupedBackground
  44. config.duration = .automatic
  45. titleContent = NSLocalizedString("Info", comment: "Info title")
  46. case .warning:
  47. view.configureTheme(.warning, iconStyle: .subtle)
  48. config.duration = .forever
  49. view.button?.setImage(Icon.warningSubtle.image, for: .normal)
  50. titleContent = NSLocalizedString("Warning", comment: "Warning title")
  51. view.buttonTapHandler = { _ in SwiftMessages.hide() }
  52. case .error:
  53. view.configureTheme(.error, iconStyle: .subtle)
  54. config.duration = .forever
  55. view.button?.setImage(Icon.errorSubtle.image, for: .normal)
  56. titleContent = NSLocalizedString("Error", comment: "Error title")
  57. view.buttonTapHandler = { _ in
  58. SwiftMessages.hide()
  59. }
  60. }
  61. view.titleLabel?.text = titleContent
  62. config.dimMode = .gray(interactive: true)
  63. SwiftMessages.show(config: config, view: view)
  64. }
  65. .store(in: &lifetime)
  66. router.mainSecondaryModalView
  67. .receive(on: DispatchQueue.main)
  68. .sink { view in
  69. self.secondaryModalView = view
  70. self.isSecondaryModalPresented = view != nil
  71. }
  72. .store(in: &lifetime)
  73. $isSecondaryModalPresented
  74. .removeDuplicates()
  75. .filter { !$0 }
  76. .sink { _ in
  77. self.router.mainSecondaryModalView.send(nil)
  78. }
  79. .store(in: &lifetime)
  80. }
  81. }
  82. }