Router.swift 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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 (
  56. message.type == .warning &&
  57. settings.glucoseNotificationsOption == GlucoseNotificationsOption.onlyAlarmLimits
  58. ) ||
  59. settings.glucoseNotificationsOption == GlucoseNotificationsOption.alwaysEveryCGM else { return false }
  60. case .algorithm:
  61. guard settings.notificationsAlgorithm else { return false }
  62. case .misc:
  63. return true
  64. }
  65. return true
  66. }
  67. }