From 58f484ad085c3ca61ae9c22c256426a2ee8d7117 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Bombeck?= Date: Thu, 21 May 2026 21:28:25 +0200 Subject: [PATCH] feat(settings): add 'warning' state to IntegrationStatusPill for persistent failures MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The pill previously collapsed both error_transient and error_reauth onto the same red 'reconnect' chip. The v1.4.42 persistent failure kind (Withings 293 / contract mismatch) maps to error_transient but reauth won't fix it. Adds a fourth pill state — warning — with an amber dracula-yellow chip and locale-aware copy ('Verbunden, aber Serverfehler' / 'Connected, server error'). Wiring at the call-site is deferred so the persistent kind can flow through the API payload first. --- messages/de.json | 1 + messages/en.json | 1 + messages/es.json | 7 +++--- messages/fr.json | 7 +++--- messages/it.json | 7 +++--- messages/pl.json | 7 +++--- .../settings/integration-status-pill.tsx | 22 +++++++++++++++---- 7 files changed, 36 insertions(+), 16 deletions(-) diff --git a/messages/de.json b/messages/de.json index 02a90b3e5..71214dc44 100644 --- a/messages/de.json +++ b/messages/de.json @@ -1892,6 +1892,7 @@ "integrationPill": { "connected": "Verbunden", "errorReconnect": "Fehler — neu verbinden", + "warningServerError": "Verbunden, aber Serverfehler", "notConnected": "Nicht verbunden", "justNow": "gerade eben", "minutesAgo": "vor {count} min", diff --git a/messages/en.json b/messages/en.json index 01f79cfaf..b07f3d193 100644 --- a/messages/en.json +++ b/messages/en.json @@ -1892,6 +1892,7 @@ "integrationPill": { "connected": "Connected", "errorReconnect": "Error — reconnect", + "warningServerError": "Connected, server error", "notConnected": "Not connected", "justNow": "just now", "minutesAgo": "{count} min ago", diff --git a/messages/es.json b/messages/es.json index eb07d4fc2..a4b42fd9f 100644 --- a/messages/es.json +++ b/messages/es.json @@ -1890,9 +1890,10 @@ } }, "integrationPill": { - "connected": "Connected", - "errorReconnect": "Error — reconnect", - "notConnected": "Not connected", + "connected": "Conectado", + "errorReconnect": "Error — reconectar", + "warningServerError": "Conectado, error del servidor", + "notConnected": "No conectado", "justNow": "just now", "minutesAgo": "{count} min ago", "hoursAgo": "{count} h ago", diff --git a/messages/fr.json b/messages/fr.json index b3eeca3d1..ea3dfcf96 100644 --- a/messages/fr.json +++ b/messages/fr.json @@ -1890,9 +1890,10 @@ } }, "integrationPill": { - "connected": "Connected", - "errorReconnect": "Error — reconnect", - "notConnected": "Not connected", + "connected": "Connecté", + "errorReconnect": "Erreur — reconnecter", + "warningServerError": "Connecté, erreur serveur", + "notConnected": "Non connecté", "justNow": "just now", "minutesAgo": "{count} min ago", "hoursAgo": "{count} h ago", diff --git a/messages/it.json b/messages/it.json index ffd073b74..a026bb38c 100644 --- a/messages/it.json +++ b/messages/it.json @@ -1890,9 +1890,10 @@ } }, "integrationPill": { - "connected": "Connected", - "errorReconnect": "Error — reconnect", - "notConnected": "Not connected", + "connected": "Connesso", + "errorReconnect": "Errore — riconnetti", + "warningServerError": "Connesso, errore del server", + "notConnected": "Non connesso", "justNow": "just now", "minutesAgo": "{count} min ago", "hoursAgo": "{count} h ago", diff --git a/messages/pl.json b/messages/pl.json index 231a03a2e..4d36e8d6e 100644 --- a/messages/pl.json +++ b/messages/pl.json @@ -1890,9 +1890,10 @@ } }, "integrationPill": { - "connected": "Connected", - "errorReconnect": "Error — reconnect", - "notConnected": "Not connected", + "connected": "Połączono", + "errorReconnect": "Błąd — połącz ponownie", + "warningServerError": "Połączono, błąd serwera", + "notConnected": "Nie połączono", "justNow": "just now", "minutesAgo": "{count} min ago", "hoursAgo": "{count} h ago", diff --git a/src/components/settings/integration-status-pill.tsx b/src/components/settings/integration-status-pill.tsx index 2377e8190..0dbde5897 100644 --- a/src/components/settings/integration-status-pill.tsx +++ b/src/components/settings/integration-status-pill.tsx @@ -26,7 +26,11 @@ import { cn } from "@/lib/utils"; * abbreviated time form into a 12 char string at most. */ -export type IntegrationPillState = "connected" | "error" | "disconnected"; +export type IntegrationPillState = + | "connected" + | "warning" + | "error" + | "disconnected"; interface IntegrationStatusPillProps { state: IntegrationPillState; @@ -74,10 +78,15 @@ export function IntegrationStatusPill({ }: IntegrationStatusPillProps) { const { t } = useTranslations(); - // chipClass only applies to the `connected` branch — `error` falls back - // to `variant="destructive"` and `disconnected` to `variant="outline"`. + // chipClass only applies to the `connected` and `warning` branches — + // `error` falls back to `variant="destructive"` and `disconnected` to + // `variant="outline"`. The warning chip uses amber tokens to signal + // "connected, but the upstream just returned a contract-level error + // a reauth won't fix" — distinct from the red reconnect pill. const connectedChipClass = "border-dracula-green/30 bg-dracula-green/15 text-dracula-green"; + const warningChipClass = + "border-dracula-yellow/30 bg-dracula-yellow/15 text-dracula-yellow"; let label: string; let icon: React.ReactNode; @@ -87,6 +96,10 @@ export function IntegrationStatusPill({ label = t("settings.integrationPill.connected"); icon =