Router.swift 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import Combine
  2. import SwiftUI
  3. import Swinject
  4. enum MessageType: String {
  5. case info
  6. case warning
  7. case error
  8. case other
  9. }
  10. enum MessageSubtype: String {
  11. case pump
  12. case cgm
  13. case carb
  14. case glucose
  15. case algorithm
  16. case misc
  17. }
  18. struct MessageContent {
  19. var content: String
  20. var type: MessageType = .info
  21. var subtype: MessageSubtype = .algorithm
  22. var title: String = ""
  23. var useAPN: Bool = true
  24. var trigger: UNNotificationTrigger? = nil
  25. var action: NotificationAction = .none
  26. }
  27. protocol Router {
  28. var mainModalScreen: CurrentValueSubject<Screen?, Never> { get }
  29. var mainSecondaryModalView: CurrentValueSubject<AnyView?, Never> { get }
  30. var alertMessage: PassthroughSubject<MessageContent, Never> { get }
  31. func view(for screen: Screen) -> AnyView
  32. func allowNotify(_ message: MessageContent, _ settings: FreeAPSSettings) -> Bool
  33. }
  34. final class BaseRouter: Router {
  35. let mainModalScreen = CurrentValueSubject<Screen?, Never>(nil)
  36. let mainSecondaryModalView = CurrentValueSubject<AnyView?, Never>(nil)
  37. let alertMessage = PassthroughSubject<MessageContent, Never>()
  38. private let resolver: Resolver
  39. init(resolver: Resolver) {
  40. self.resolver = resolver
  41. }
  42. func view(for screen: Screen) -> AnyView {
  43. screen.view(resolver: resolver).asAny()
  44. }
  45. func allowNotify(_ message: MessageContent, _ settings: FreeAPSSettings) -> Bool {
  46. if message.type == .error { return true }
  47. switch message.subtype {
  48. case .pump:
  49. guard settings.notificationsPump else { return false }
  50. case .cgm:
  51. guard settings.notificationsCgm else { return false }
  52. case .carb:
  53. guard settings.notificationsCarb else { return false }
  54. case .glucose:
  55. guard settings.glucoseNotificationsAlways else { return false }
  56. case .algorithm:
  57. guard settings.notificationsAlgorithm else { return false }
  58. case .misc:
  59. return true
  60. }
  61. return true
  62. }
  63. }