mac: make status rows disabled menu items
This commit is contained in:
@@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user