mac: make status rows disabled menu items

This commit is contained in:
Peter Steinberger
2025-12-09 22:02:15 +01:00
parent 0377d13d3d
commit a032614dc7

View File

@@ -180,52 +180,39 @@ struct MenuContent: View {
} }
private var statusRow: some View { private var statusRow: some View {
if let activity = self.activityStore.current { let (label, color): (String, Color) = {
let color: Color = activity.role == .main ? .accentColor : .gray if let activity = self.activityStore.current {
let roleLabel = activity.role == .main ? "Main" : "Other" let color: Color = activity.role == .main ? .accentColor : .gray
let text = "\(roleLabel) · \(activity.label)" let roleLabel = activity.role == .main ? "Main" : "Other"
return HStack(spacing: 8) { let text = "\(roleLabel) · \(activity.label)"
Circle() return (text, color)
.fill(color)
.frame(width: 8, height: 8)
Text(text)
.font(.caption.weight(.semibold))
.foregroundStyle(.primary)
} }
.padding(.vertical, 4)
.disabled(true)
} else {
let health = self.healthStore.state let health = self.healthStore.state
let isRefreshing = self.healthStore.isRefreshing let isRefreshing = self.healthStore.isRefreshing
let lastAge = self.healthStore.lastSuccess.map { age(from: $0) } let lastAge = self.healthStore.lastSuccess.map { age(from: $0) }
let label: String
let color: Color
if isRefreshing { if isRefreshing {
label = "Health check running…" return ("Health check running…", health.tint)
color = health.tint
} else {
switch health {
case .ok:
let ageText = lastAge.map { " · checked \($0)" } ?? ""
label = "Health ok\(ageText)"
color = .green
case .linkingNeeded:
label = "Health: login required"
color = .red
case let .degraded(reason):
let detail = HealthStore.shared.degradedSummary ?? reason
let ageText = lastAge.map { " · checked \($0)" } ?? ""
label = "\(detail)\(ageText)"
color = .orange
case .unknown:
label = "Health pending"
color = .secondary
}
} }
return HStack(spacing: 8) { switch health {
case .ok:
let ageText = lastAge.map { " · checked \($0)" } ?? ""
return ("Health ok\(ageText)", .green)
case .linkingNeeded:
return ("Health: login required", .red)
case let .degraded(reason):
let detail = HealthStore.shared.degradedSummary ?? reason
let ageText = lastAge.map { " · checked \($0)" } ?? ""
return ("\(detail)\(ageText)", .orange)
case .unknown:
return ("Health pending", .secondary)
}
}()
return Button(action: {}) {
HStack(spacing: 8) {
Circle() Circle()
.fill(color) .fill(color)
.frame(width: 8, height: 8) .frame(width: 8, height: 8)
@@ -234,50 +221,46 @@ struct MenuContent: View {
.foregroundStyle(.primary) .foregroundStyle(.primary)
} }
.padding(.vertical, 4) .padding(.vertical, 4)
.disabled(true)
} }
.buttonStyle(.plain)
.disabled(true)
} }
private var heartbeatStatusRow: some View { private var heartbeatStatusRow: some View {
let label: String let (label, color): (String, Color) = {
let color: Color if case .degraded = self.controlChannel.state {
return ("Control channel disconnected", .red)
if case .degraded = self.controlChannel.state { } else if let evt = self.heartbeatStore.lastEvent {
label = "Control channel disconnected" let ageText = age(from: Date(timeIntervalSince1970: evt.ts / 1000))
color = .red switch evt.status {
} else if let evt = self.heartbeatStore.lastEvent { case "sent":
let ageText = age(from: Date(timeIntervalSince1970: evt.ts / 1000)) return ("Last heartbeat sent · \(ageText)", .blue)
switch evt.status { case "ok-empty", "ok-token":
case "sent": return ("Heartbeat ok · \(ageText)", .green)
label = "Last heartbeat sent · \(ageText)" case "skipped":
color = .blue return ("Heartbeat skipped · \(ageText)", .secondary)
case "ok-empty", "ok-token": case "failed":
label = "Heartbeat ok · \(ageText)" return ("Heartbeat failed · \(ageText)", .red)
color = .green default:
case "skipped": return ("Heartbeat · \(ageText)", .secondary)
label = "Heartbeat skipped · \(ageText)" }
color = .secondary } else {
case "failed": return ("No heartbeat yet", .secondary)
label = "Heartbeat failed · \(ageText)"
color = .red
default:
label = "Heartbeat · \(ageText)"
color = .secondary
} }
} else { }()
label = "No heartbeat yet"
color = .secondary
}
return HStack(spacing: 8) { return Button(action: {}) {
Circle() HStack(spacing: 8) {
.fill(color) Circle()
.frame(width: 8, height: 8) .fill(color)
Text(label) .frame(width: 8, height: 8)
.font(.caption.weight(.semibold)) Text(label)
.foregroundStyle(.primary) .font(.caption.weight(.semibold))
.foregroundStyle(.primary)
}
.padding(.vertical, 2)
} }
.padding(.vertical, 2) .buttonStyle(.plain)
.disabled(true) .disabled(true)
} }