10 Commits
6 changed files with 22 additions and 11 deletions
@@ -118,11 +118,12 @@ public final class UNAlertNotificationDispatcher: NSObject, AlertNotificationDis
didReceive response: UNNotificationResponse,
withCompletionHandler completionHandler: @escaping () -> Void
) {
let targetTab: String? = switch response.actionIdentifier {
let targetTab: String?
switch response.actionIdentifier {
case AlertNotificationAction.viewProcessesIdentifier:
"Processes"
targetTab = "Processes"
default:
nil
targetTab = nil
}
Task { @MainActor in
AppNavigationBus.shared.request(tab: targetTab)
+2 -1
View File
@@ -4,8 +4,9 @@ import SwiftUI
/// Sidebar tab showing currently breached thresholds and the in-app
/// alert history log maintained by `AlertEngine`.
@MainActor
public struct AlertsView: View {
@State private var engine = AlertEngine.shared
@ObservedObject private var engine = AlertEngine.shared
public init() {}
+12 -6
View File
@@ -1,5 +1,6 @@
import SwiftUI
@MainActor
public struct ContentView: View {
@StateObject private var store = SystemTelemetryStore.shared
@State private var selectedTab: String? = "Dashboard"
@@ -168,7 +169,7 @@ public struct ContentView: View {
}
.padding(24)
}
.navigationTitle("MacMonitor — \(selectedTab)")
.navigationTitle("MacMonitor — \(selectedTab ?? "Dashboard")")
}
// MARK: - Dashboard Composite View
@@ -1005,8 +1006,6 @@ public struct ContentView: View {
HStack {
Text("Target Architecture:").foregroundStyle(.secondary)
Text("Intel x86_64").bold()
Text("Deployment Target:").foregroundStyle(.secondary)
Text("macOS 14.0 (Sonoma)").bold()
}
}
}
@@ -1220,6 +1219,7 @@ public struct ContentView: View {
}
// MARK: - Process Detail Inspector Sheet
@MainActor
struct ProcessDetailSheet: View {
let inspector: MMProcessDetailInspector
let pid: Int32
@@ -1248,8 +1248,9 @@ struct ProcessDetailSheet: View {
if selectedDetailTab == "Threads" {
List(threads.indices, id: \.self) { idx in
let t = threads[idx]
let threadID = "\(t["threadID"] ?? idx)"
HStack {
Text("Thread \(t["threadID"] ?? idx)").bold()
Text("Thread \(threadID)").bold()
Spacer()
Text("CPU: \(String(format: "%.1f%%", (t["cpuPercent"] as? Double) ?? 0.0))").monospacedDigit()
Text(t["state"] as? String ?? "").foregroundStyle(.secondary)
@@ -1262,10 +1263,15 @@ struct ProcessDetailSheet: View {
} else {
List(sockets.indices, id: \.self) { idx in
let s = sockets[idx]
let proto = s["protocol"] as? String ?? "TCP"
let localAddr = (s["localAddress"] as? String) ?? ""
let localPort = (s["localPort"] as? Int) ?? 0
let remoteAddr = (s["remoteAddress"] as? String) ?? ""
let remotePort = (s["remotePort"] as? Int) ?? 0
HStack {
Text(s["protocol"] as? String ?? "TCP").bold()
Text(proto).bold()
Spacer()
Text("\(s["localAddress"] ?? ""):\(s["localPort"] ?? 0) → \(s["remoteAddress"] ?? ""):\(s["remotePort"] ?? 0)")
Text("\(localAddr):\(localPort) → \(remoteAddr):\(remotePort)")
.mmMonospaced()
Text(s["tcpState"] as? String ?? "").foregroundStyle(.secondary)
}
@@ -1,7 +1,8 @@
import SwiftUI
@MainActor
public struct QuickGlancePopoverView: View {
var store: SystemTelemetryStore
@ObservedObject var store: SystemTelemetryStore
public init(store: SystemTelemetryStore) {
self.store = store
@@ -5,6 +5,7 @@ import UserNotifications
/// Preferences UI for threshold alert rules. Bound directly to
/// `AlertEngine.shared.configuration`, which auto-persists to `UserDefaults`.
@MainActor
public struct AlertsSettingsView: View {
@ObservedObject private var engine = AlertEngine.shared
@State private var authorizationStatus: UNAuthorizationStatus = .notDetermined
+1
View File
@@ -2,6 +2,7 @@ import XCTest
import SwiftUI
@testable import MacMonitor
@MainActor
final class MMMenuBarTests: XCTestCase {
func testMenuBarStatusViewInitialization() {