Просмотр исходного кода

new message alerts

(cherry picked from commit 08e8cd691fde21e918d9a89de1a9cd257cdfa841)
avouspierre 3 лет назад
Родитель
Сommit
015ff17711

+ 0 - 3
FreeAPS/Sources/APS/APSManager.swift

@@ -38,7 +38,6 @@ enum APSError: LocalizedError {
     case glucoseError(message: String)
     case apsError(message: String)
     case deviceSyncError(message: String)
-    case deviceAlert(message: String)
     case manualBasalTemp(message: String)
 
     var errorDescription: String? {
@@ -53,8 +52,6 @@ enum APSError: LocalizedError {
             return "APS error: \(message)"
         case let .deviceSyncError(message):
             return "Sync error: \(message)"
-        case let .deviceAlert(message):
-            return "Pump message: \(message)"
         case let .manualBasalTemp(message):
             return "Manual Basal Temp : \(message)"
         }

+ 21 - 2
FreeAPS/Sources/APS/DeviceDataManager.swift

@@ -66,6 +66,7 @@ final class BaseDeviceDataManager: DeviceDataManager, Injectable {
     let pumpNewStatus = PassthroughSubject<Void, Never>()
     let manualTempBasal = PassthroughSubject<Bool, Never>()
     var alertStore: [Alert]
+    private let router = FreeAPSApp.resolver.resolve(Router.self)!
     @SyncAccess private var pumpUpdateCancellable: AnyCancellable?
     private var pumpUpdatePromise: Future<Bool, Never>.Promise?
     @SyncAccess var loopInProgress: Bool = false
@@ -461,8 +462,26 @@ extension BaseDeviceDataManager: DeviceManagerDelegate {
     func issueAlert(_ alert: Alert) {
         if !alertStore.contains(where: { $0.identifier.alertIdentifier == alert.identifier.alertIdentifier }) {
             alertStore.append(alert)
-            let infoMessage = APSError.deviceAlert(message: alert.foregroundContent!.body)
-            errorSubject.send(infoMessage)
+
+            let typeMessage: MessageType
+            let alertUp = alert.identifier.alertIdentifier.uppercased()
+            if alertUp.contains("FAULT") || alertUp.contains("ERROR") {
+                typeMessage = .error
+            } else {
+                typeMessage = .warning
+            }
+
+            DispatchQueue.main.async {
+                let messageCont = MessageContent(content: alert.foregroundContent!.body, type: typeMessage)
+                self.router.alertMessage.send(messageCont)
+                // validation
+                self.pumpManager?.acknowledgeAlert(alertIdentifier: alert.identifier.alertIdentifier) { error in
+                    if let error = error {
+                        debug(.deviceManager, "acknowledge not succeeded with error \(error.localizedDescription)")
+                    }
+                }
+            }
+
             broadcaster.notify(pumpNotificationObserver.self, on: processQueue) {
                 $0.pumpNotification(alert: alert)
             }

+ 4 - 3
FreeAPS/Sources/Logger/Logger.swift

@@ -228,7 +228,7 @@ final class Logger {
         os_log("%@ - %@ - %d %{public}@", log: log, type: .info, file.file, function, line, printedMessage)
         reporter.log(category.name, printedMessage, file: file, function: function, line: line)
 
-        showAlert(message)
+        showAlert(message, type: .warning)
     }
 
     func warning(
@@ -264,9 +264,10 @@ final class Logger {
         )
     }
 
-    private func showAlert(_ message: String) {
+    private func showAlert(_ message: String, type: MessageType = .info) {
         DispatchQueue.main.async {
-            router.alertMessage.send(message)
+            let messageCont = MessageContent(content: message, type: type)
+            router.alertMessage.send(messageCont)
         }
     }
 

+ 38 - 15
FreeAPS/Sources/Modules/Main/MainStateModel.swift

@@ -30,24 +30,47 @@ extension Main {
             router.alertMessage
                 .receive(on: DispatchQueue.main)
                 .sink { message in
-                    SwiftMessages.show {
-                        let view = MessageView.viewFromNib(layout: .messageView)
+                    var config = SwiftMessages.defaultConfig
+                    let view = MessageView.viewFromNib(layout: .cardView)
+
+                    let titleContent: String
+
+                    view.configureContent(
+                        title: "title",
+                        body: NSLocalizedString(message.content, comment: "Info message"),
+                        iconImage: nil,
+                        iconText: nil,
+                        buttonImage: nil,
+                        buttonTitle: nil,
+                        buttonTapHandler: nil
+                    )
+
+                    switch message.type {
+                    case .info:
                         view.backgroundColor = .secondarySystemGroupedBackground
-                        view.titleLabel?.textColor = .label
-                        view.bodyLabel?.textColor = .label
-                        view.configureContent(
-                            title: NSLocalizedString("Info", comment: "Info title"),
-                            body: NSLocalizedString(message, comment: "Info message"),
-                            iconImage: nil,
-                            iconText: nil,
-                            buttonImage: nil,
-                            buttonTitle: nil,
-                            buttonTapHandler: nil
-                        )
+                        config.duration = .automatic
 
-                        view.bodyLabel?.text = message
-                        return view
+                        titleContent = NSLocalizedString("Info", comment: "Info title")
+                    case .warning:
+                        view.configureTheme(.warning, iconStyle: .subtle)
+                        config.duration = .forever
+                        view.button?.setImage(Icon.warningSubtle.image, for: .normal)
+                        titleContent = NSLocalizedString("Warning", comment: "Warning title")
+                        view.buttonTapHandler = { _ in SwiftMessages.hide() }
+                    case .error:
+                        view.configureTheme(.error, iconStyle: .subtle)
+                        config.duration = .forever
+                        view.button?.setImage(Icon.errorSubtle.image, for: .normal)
+                        titleContent = NSLocalizedString("Error", comment: "Error title")
+                        view.buttonTapHandler = { _ in
+                            SwiftMessages.hide()
+                        }
                     }
+
+                    view.titleLabel?.text = titleContent
+                    config.dimMode = .gray(interactive: true)
+
+                    SwiftMessages.show(config: config, view: view)
                 }
                 .store(in: &lifetime)
 

+ 13 - 2
FreeAPS/Sources/Router/Router.swift

@@ -2,17 +2,28 @@ import Combine
 import SwiftUI
 import Swinject
 
+enum MessageType {
+    case info
+    case warning
+    case error
+}
+
+struct MessageContent {
+    var content: String
+    var type: MessageType = .info
+}
+
 protocol Router {
     var mainModalScreen: CurrentValueSubject<Screen?, Never> { get }
     var mainSecondaryModalView: CurrentValueSubject<AnyView?, Never> { get }
-    var alertMessage: PassthroughSubject<String, Never> { get }
+    var alertMessage: PassthroughSubject<MessageContent, Never> { get }
     func view(for screen: Screen) -> AnyView
 }
 
 final class BaseRouter: Router {
     let mainModalScreen = CurrentValueSubject<Screen?, Never>(nil)
     let mainSecondaryModalView = CurrentValueSubject<AnyView?, Never>(nil)
-    let alertMessage = PassthroughSubject<String, Never>()
+    let alertMessage = PassthroughSubject<MessageContent, Never>()
 
     private let resolver: Resolver
 

+ 0 - 6
FreeAPS/Sources/Services/UserNotifiactions/UserNotificationsManager.swift

@@ -419,12 +419,6 @@ extension BaseUserNotificationsManager: pumpNotificationObserver {
                 trigger: nil
             )
         }
-        // Acknowledge in all case the alert to stop beep (in particular)
-        apsManager.pumpManager?.acknowledgeAlert(alertIdentifier: alert.identifier.alertIdentifier) { error in
-            if let error = error {
-                debug(.deviceManager, "acknowledge not succeeded with error \(error.localizedDescription)")
-            }
-        }
     }
 
     func pumpRemoveNotification() {