Files
openclaw/apps/macos/Sources/OpenClaw/DashboardGatewayMenuModel.swift
T
Peter Steinberger 94410b00d0 fix(macos): show gateway auth failures in app status (#118841)
* fix(macos): surface live gateway connection state

* chore(i18n): defer generated locale refresh

* fix(macos): preserve sleeping gateway badge state
2026-08-03 11:52:24 -07:00

78 lines
2.8 KiB
Swift

import Foundation
struct DashboardGatewayMenuItem: Equatable, Identifiable, Sendable {
let target: DashboardGatewayTarget
let name: String
let health: DashboardGatewayHealth
let isPrimary: Bool
let canPromote: Bool
let shortcutNumber: Int?
var id: String {
self.target.bridgeID
}
}
enum DashboardGatewayMenuModel {
static func items(from entries: [DashboardGatewayEntry]) -> [DashboardGatewayMenuItem] {
guard entries.count >= 2 else { return [] }
return entries.enumerated().compactMap { index, entry in
guard let target = DashboardGatewayTarget(bridgeID: entry.id) else { return nil }
return DashboardGatewayMenuItem(
target: target,
name: entry.name,
health: entry.health,
isPrimary: entry.isPrimary,
canPromote: entry.canPromote,
shortcutNumber: index < 9 ? index + 1 : nil)
}
}
static func connectionLabel(
mode: AppState.ConnectionMode,
controlState: ControlChannel.ConnectionState,
entries: [DashboardGatewayEntry]) -> String
{
guard entries.count >= 2,
let primaryName = entries.first(where: \.isPrimary)?.name.nonEmpty
else {
return switch mode {
case .unconfigured:
String(localized: "OpenClaw Not Configured")
case .remote:
self.remoteConnectionLabel(state: controlState)
case .local:
String(localized: "OpenClaw Active")
}
}
return switch mode {
case .unconfigured:
String(localized: "OpenClaw Not Configured — \(primaryName)")
case .remote:
self.remoteConnectionLabel(state: controlState, primaryName: primaryName)
case .local:
String(localized: "OpenClaw Active — \(primaryName)")
}
}
private static func remoteConnectionLabel(
state: ControlChannel.ConnectionState,
primaryName: String? = nil) -> String
{
switch (state, primaryName) {
case (.connected, nil):
String(localized: "Remote OpenClaw Active")
case let (.connected, .some(name)):
String(localized: "Remote OpenClaw Active — \(name)")
case (.connecting, nil):
String(localized: "Remote OpenClaw Connecting")
case let (.connecting, .some(name)):
String(localized: "Remote OpenClaw Connecting — \(name)")
case (.disconnected, nil), (.degraded, nil):
String(localized: "Remote OpenClaw Needs Attention")
case let (.disconnected, .some(name)), let (.degraded, .some(name)):
String(localized: "Remote OpenClaw Needs Attention — \(name)")
}
}
}