From eae066efb1e94d6c5f09c55dc63d2d886dbcea6a Mon Sep 17 00:00:00 2001
From: Marcin Sobczyk <msobczyk@syncad.com>
Date: Thu, 13 Mar 2025 13:45:55 +0100
Subject: [PATCH] Suppress WorkerCancelled exception of update node/alarms data
 when entering dashboard

---
 clive/__private/ui/app.py                      | 18 ++++++++++++++----
 .../finish_profile_creation_mixin.py           |  3 ++-
 clive/__private/ui/screens/unlock/unlock.py    |  2 +-
 3 files changed, 17 insertions(+), 6 deletions(-)

diff --git a/clive/__private/ui/app.py b/clive/__private/ui/app.py
index 9a25ab2a5d..eac92904ba 100644
--- a/clive/__private/ui/app.py
+++ b/clive/__private/ui/app.py
@@ -13,6 +13,7 @@ from textual.app import App
 from textual.binding import Binding
 from textual.notifications import Notification, Notify, SeverityLevel
 from textual.reactive import var
+from textual.worker import WorkerCancelled
 
 from clive.__private.core.constants.terminal import TERMINAL_HEIGHT, TERMINAL_WIDTH
 from clive.__private.core.constants.tui.bindings import APP_QUIT_KEY_BINDING
@@ -242,12 +243,21 @@ class Clive(App[int]):
     def trigger_app_state_watchers(self) -> None:
         self.world.mutate_reactive(TUIWorld.app_state)  # type: ignore[arg-type]
 
-    def update_alarms_data_asap_on_newest_node_data(self) -> Worker[None]:
+    def update_alarms_data_asap_on_newest_node_data(self, *, suppress_cancelled_error: bool = False) -> Worker[None]:
         """Update alarms on the newest possible node data."""
+
         async def update_alarms_data_on_newest_node_data() -> None:
-            await self.update_data_from_node().wait()
-            await self.update_alarms_data().wait()
-        return self.run_worker(update_alarms_data_on_newest_node_data())
+            try:
+                await self.update_data_from_node().wait()
+                await self.update_alarms_data().wait()
+            except WorkerCancelled as error:
+                logger.warning("Update alarms data on newest node data cancelled.")
+                if not suppress_cancelled_error:
+                    logger.warning(f"Re-raising exception: {error}")
+                    raise
+                logger.warning(f"Ignoring exception: {error}")
+
+        return self.run_worker(update_alarms_data_on_newest_node_data(), exclusive=True)
 
     @work(name="alarms data update worker", group="alarms_data", exclusive=True)
     async def update_alarms_data(self) -> None:
diff --git a/clive/__private/ui/forms/create_profile/finish_profile_creation_mixin.py b/clive/__private/ui/forms/create_profile/finish_profile_creation_mixin.py
index ad69c5f655..52fd14c8a5 100644
--- a/clive/__private/ui/forms/create_profile/finish_profile_creation_mixin.py
+++ b/clive/__private/ui/forms/create_profile/finish_profile_creation_mixin.py
@@ -14,7 +14,8 @@ class FinishProfileCreationMixin(FormScreenBase[CreateProfileContext]):
 
     async def _finish(self) -> None:
         self._owner.add_post_action(
-            self.app.update_alarms_data_asap_on_newest_node_data, self.app.resume_refresh_alarms_data_interval
+            lambda: self.app.update_alarms_data_asap_on_newest_node_data(suppress_cancelled_error=True),
+            self.app.resume_refresh_alarms_data_interval,
         )
 
         profile = self.context.profile
diff --git a/clive/__private/ui/screens/unlock/unlock.py b/clive/__private/ui/screens/unlock/unlock.py
index 194b55e9ca..44f1eff6eb 100644
--- a/clive/__private/ui/screens/unlock/unlock.py
+++ b/clive/__private/ui/screens/unlock/unlock.py
@@ -123,7 +123,7 @@ class Unlock(BaseScreen):
         await self.world.load_profile_based_on_beekepeer()
         await self.app.switch_mode("dashboard")
         self._remove_welcome_modes()
-        self.app.update_alarms_data_asap_on_newest_node_data()
+        self.app.update_alarms_data_asap_on_newest_node_data(suppress_cancelled_error=True)
         self.app.resume_refresh_node_data_interval()
         self.app.resume_refresh_alarms_data_interval()
 
-- 
GitLab