From b43a09a1c7fa7172647aa7ce1708a3edb9e050f3 Mon Sep 17 00:00:00 2001 From: Zoltan Papp Date: Mon, 11 May 2026 13:22:30 +0200 Subject: [PATCH] [client/ui] Add tray icon for needs-login/login-failed states MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The tray now switches to a dedicated lock icon when the daemon reports NeedsLogin, SessionExpired or LoginFailed — the latter mirrors the CLI, which groups these three statuses together as "needs authentication" and prints the same "Run netbird up" prompt. The macOS template variant reuses the existing error-macos PNG because the project's macOS tray PNGs use a 2-color (black + transparent) convention that rsvg-convert of the badge-style SVG sources can't reproduce. The earlier badge-style SVG sketches in assets/svg/ are removed (they were marked as reference only and never matched the shipping PNG design). --- .../netbird-systemtray-needs-login-macos.png | Bin 0 -> 3555 bytes .../assets/netbird-systemtray-needs-login.png | Bin 0 -> 9909 bytes client/ui/assets/svg/_base.svg | 14 -------------- client/ui/assets/svg/appicon.svg | 17 ----------------- client/ui/assets/svg/connected-macos.svg | 10 ---------- client/ui/assets/svg/connected.svg | 14 -------------- client/ui/assets/svg/connecting-macos.svg | 9 --------- client/ui/assets/svg/connecting.svg | 9 --------- client/ui/assets/svg/disconnected-macos.svg | 10 ---------- client/ui/assets/svg/disconnected.svg | 10 ---------- client/ui/assets/svg/error-macos.svg | 11 ----------- .../assets/svg/{error.svg => needs-login.svg} | 5 ++--- .../ui/assets/svg/update-connected-macos.svg | 10 ---------- client/ui/assets/svg/update-connected.svg | 10 ---------- .../assets/svg/update-disconnected-macos.svg | 10 ---------- client/ui/assets/svg/update-disconnected.svg | 10 ---------- client/ui/icons.go | 6 ++++++ client/ui/tray.go | 16 +++++++++++++++- 18 files changed, 23 insertions(+), 148 deletions(-) create mode 100644 client/ui/assets/netbird-systemtray-needs-login-macos.png create mode 100644 client/ui/assets/netbird-systemtray-needs-login.png delete mode 100644 client/ui/assets/svg/_base.svg delete mode 100644 client/ui/assets/svg/appicon.svg delete mode 100644 client/ui/assets/svg/connected-macos.svg delete mode 100644 client/ui/assets/svg/connected.svg delete mode 100644 client/ui/assets/svg/connecting-macos.svg delete mode 100644 client/ui/assets/svg/connecting.svg delete mode 100644 client/ui/assets/svg/disconnected-macos.svg delete mode 100644 client/ui/assets/svg/disconnected.svg delete mode 100644 client/ui/assets/svg/error-macos.svg rename client/ui/assets/svg/{error.svg => needs-login.svg} (71%) delete mode 100644 client/ui/assets/svg/update-connected-macos.svg delete mode 100644 client/ui/assets/svg/update-connected.svg delete mode 100644 client/ui/assets/svg/update-disconnected-macos.svg delete mode 100644 client/ui/assets/svg/update-disconnected.svg diff --git a/client/ui/assets/netbird-systemtray-needs-login-macos.png b/client/ui/assets/netbird-systemtray-needs-login-macos.png new file mode 100644 index 0000000000000000000000000000000000000000..580fe647c29bce036a816fd20f7ce0a6ac0824cb GIT binary patch literal 3555 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 OdBMWYyyBea{eJ@L!Le-s literal 0 HcmV?d00001 diff --git a/client/ui/assets/netbird-systemtray-needs-login.png b/client/ui/assets/netbird-systemtray-needs-login.png new file mode 100644 index 0000000000000000000000000000000000000000..c4b8b4bf47bb3d1c49de83b29316dbf355d85ab5 GIT binary patch literal 9909 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 - - - - - - - diff --git a/client/ui/assets/svg/appicon.svg b/client/ui/assets/svg/appicon.svg deleted file mode 100644 index 773ad3417..000000000 --- a/client/ui/assets/svg/appicon.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - diff --git a/client/ui/assets/svg/connected-macos.svg b/client/ui/assets/svg/connected-macos.svg deleted file mode 100644 index d1e2ce18c..000000000 --- a/client/ui/assets/svg/connected-macos.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/client/ui/assets/svg/connected.svg b/client/ui/assets/svg/connected.svg deleted file mode 100644 index 687d8e2e5..000000000 --- a/client/ui/assets/svg/connected.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - diff --git a/client/ui/assets/svg/connecting-macos.svg b/client/ui/assets/svg/connecting-macos.svg deleted file mode 100644 index 04d666c5f..000000000 --- a/client/ui/assets/svg/connecting-macos.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/client/ui/assets/svg/connecting.svg b/client/ui/assets/svg/connecting.svg deleted file mode 100644 index d3818055a..000000000 --- a/client/ui/assets/svg/connecting.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/client/ui/assets/svg/disconnected-macos.svg b/client/ui/assets/svg/disconnected-macos.svg deleted file mode 100644 index 06802c9d4..000000000 --- a/client/ui/assets/svg/disconnected-macos.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/client/ui/assets/svg/disconnected.svg b/client/ui/assets/svg/disconnected.svg deleted file mode 100644 index 31eab7970..000000000 --- a/client/ui/assets/svg/disconnected.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/client/ui/assets/svg/error-macos.svg b/client/ui/assets/svg/error-macos.svg deleted file mode 100644 index 4c6d4e76d..000000000 --- a/client/ui/assets/svg/error-macos.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/client/ui/assets/svg/error.svg b/client/ui/assets/svg/needs-login.svg similarity index 71% rename from client/ui/assets/svg/error.svg rename to client/ui/assets/svg/needs-login.svg index 46ac0d762..5c01b48d4 100644 --- a/client/ui/assets/svg/error.svg +++ b/client/ui/assets/svg/needs-login.svg @@ -5,7 +5,6 @@ - - - + + diff --git a/client/ui/assets/svg/update-connected-macos.svg b/client/ui/assets/svg/update-connected-macos.svg deleted file mode 100644 index 774e631e6..000000000 --- a/client/ui/assets/svg/update-connected-macos.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/client/ui/assets/svg/update-connected.svg b/client/ui/assets/svg/update-connected.svg deleted file mode 100644 index 45e22693b..000000000 --- a/client/ui/assets/svg/update-connected.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/client/ui/assets/svg/update-disconnected-macos.svg b/client/ui/assets/svg/update-disconnected-macos.svg deleted file mode 100644 index fe161cc44..000000000 --- a/client/ui/assets/svg/update-disconnected-macos.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/client/ui/assets/svg/update-disconnected.svg b/client/ui/assets/svg/update-disconnected.svg deleted file mode 100644 index 657974005..000000000 --- a/client/ui/assets/svg/update-disconnected.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/client/ui/icons.go b/client/ui/icons.go index 28d4582cc..3fe3ea9ef 100644 --- a/client/ui/icons.go +++ b/client/ui/icons.go @@ -26,6 +26,9 @@ var iconConnecting []byte //go:embed assets/netbird-systemtray-error.png var iconError []byte +//go:embed assets/netbird-systemtray-needs-login.png +var iconNeedsLogin []byte + //go:embed assets/netbird-systemtray-update-connected.png var iconUpdateConnected []byte @@ -44,6 +47,9 @@ var iconConnectingMacOS []byte //go:embed assets/netbird-systemtray-error-macos.png var iconErrorMacOS []byte +//go:embed assets/netbird-systemtray-needs-login-macos.png +var iconNeedsLoginMacOS []byte + //go:embed assets/netbird-systemtray-update-connected-macos.png var iconUpdateConnectedMacOS []byte diff --git a/client/ui/tray.go b/client/ui/tray.go index fd8ab351f..27b8b545c 100644 --- a/client/ui/tray.go +++ b/client/ui/tray.go @@ -80,6 +80,12 @@ const ( // completed an SSO authentication on this profile. Mirrors // internal.StatusNeedsLogin. statusNeedsLogin = "NeedsLogin" + // statusLoginFailed is what the daemon publishes when a login attempt + // failed with a non-auth error (management unreachable, init error, + // etc.). The CLI groups it with NeedsLogin/SessionExpired and prompts + // the user to run "netbird up", so we mirror that here. Mirrors + // internal.StatusLoginFailed. + statusLoginFailed = "LoginFailed" // External URLs. urlGitHubRepo = "https://github.com/netbirdio/netbird" @@ -434,7 +440,8 @@ func (t *Tray) applyStatus(st services.Status) { if iconChanged { t.applyIcon() needsLogin := strings.EqualFold(st.Status, statusNeedsLogin) || - strings.EqualFold(st.Status, statusSessionExpired) + strings.EqualFold(st.Status, statusSessionExpired) || + strings.EqualFold(st.Status, statusLoginFailed) daemonUnavailable := strings.EqualFold(st.Status, services.StatusDaemonUnavailable) if t.statusItem != nil { // When the daemon needs re-authentication the status row turns @@ -542,6 +549,9 @@ func (t *Tray) iconForState() (icon, dark []byte) { connecting := strings.EqualFold(statusLabel, "Connecting") errored := strings.EqualFold(statusLabel, "Error") || strings.EqualFold(statusLabel, services.StatusDaemonUnavailable) + needsLogin := strings.EqualFold(statusLabel, statusNeedsLogin) || + strings.EqualFold(statusLabel, statusSessionExpired) || + strings.EqualFold(statusLabel, statusLoginFailed) if runtime.GOOS == "darwin" { switch { @@ -549,6 +559,8 @@ func (t *Tray) iconForState() (icon, dark []byte) { return iconConnectingMacOS, nil case errored: return iconErrorMacOS, nil + case needsLogin: + return iconNeedsLoginMacOS, nil case connected && hasUpdate: return iconUpdateConnectedMacOS, nil case connected: @@ -565,6 +577,8 @@ func (t *Tray) iconForState() (icon, dark []byte) { return iconConnecting, nil case errored: return iconError, nil + case needsLogin: + return iconNeedsLogin, nil case connected && hasUpdate: return iconUpdateConnected, nil case connected: