From 58d0f3053d87a70bc34d3d19bb6b84861e6b98d5 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sat, 6 Dec 2025 23:43:36 +0100 Subject: [PATCH] feat(mac): show relay run indicator in menu --- apps/macos/Sources/Clawdis/AppMain.swift | 28 +++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/apps/macos/Sources/Clawdis/AppMain.swift b/apps/macos/Sources/Clawdis/AppMain.swift index f9be47f7e..c18e58c47 100644 --- a/apps/macos/Sources/Clawdis/AppMain.swift +++ b/apps/macos/Sources/Clawdis/AppMain.swift @@ -631,10 +631,14 @@ struct ClawdisApp: App { private struct MenuContent: View { @ObservedObject var state: AppState + @ObservedObject private var relayManager = RelayProcessManager.shared @Environment(\.openSettings) private var openSettings var body: some View { - Toggle(isOn: self.activeBinding) { Text("Clawdis Active") } + VStack(alignment: .leading, spacing: 8) { + self.relayStatusRow + Toggle(isOn: self.activeBinding) { Text("Clawdis Active") } + } Toggle(isOn: self.$state.swabbleEnabled) { Text("Voice Wake") } .disabled(!voiceWakeSupported) .opacity(voiceWakeSupported ? 1 : 0.5) @@ -654,6 +658,28 @@ private struct MenuContent: View { NotificationCenter.default.post(name: .clawdisSelectSettingsTab, object: tab) } + private var relayStatusRow: some View { + let status = self.relayManager.status + return HStack(spacing: 8) { + Circle() + .fill(self.statusColor(status)) + .frame(width: 8, height: 8) + Text(status.label) + .font(.caption.weight(.semibold)) + .foregroundStyle(.primary) + } + .padding(.vertical, 4) + } + + private func statusColor(_ status: RelayProcessManager.Status) -> Color { + switch status { + case .running: return .green + case .starting, .restarting: return .orange + case .failed: return .red + case .stopped: return .secondary + } + } + private var activeBinding: Binding { Binding(get: { !self.state.isPaused }, set: { self.state.isPaused = !$0 }) }