import Combine import SwiftUI import Swinject enum MessageType: String { case info case warning case error case other } enum MessageSubtype: String { case pump case cgm case carb case glucose case algorithm case misc } struct MessageContent { var content: String var type: MessageType = .info var subtype: MessageSubtype = .misc var title: String = "" var useAPN: Bool = true var trigger: UNNotificationTrigger? = nil var action: NotificationAction = .none } protocol Router { var mainModalScreen: CurrentValueSubject { get } var mainSecondaryModalView: CurrentValueSubject { get } var alertMessage: PassthroughSubject { get } func view(for screen: Screen) -> AnyView func allowNotify(_ message: MessageContent, _ settings: FreeAPSSettings) -> Bool } final class BaseRouter: Router { let mainModalScreen = CurrentValueSubject(nil) let mainSecondaryModalView = CurrentValueSubject(nil) let alertMessage = PassthroughSubject() private let resolver: Resolver init(resolver: Resolver) { self.resolver = resolver } func view(for screen: Screen) -> AnyView { screen.view(resolver: resolver).asAny() } func allowNotify(_ message: MessageContent, _ settings: FreeAPSSettings) -> Bool { if message.type == .error { return true } switch message.subtype { case .pump: guard settings.notificationsPump else { return false } case .cgm: guard settings.notificationsCgm else { return false } case .carb: guard settings.notificationsCarb else { return false } case .glucose: guard settings.glucoseNotificationsAlways else { return false } case .algorithm: guard settings.notificationsAlgorithm else { return false } case .misc: return true } return true } }