diff --git a/clive/__private/ui/app.py b/clive/__private/ui/app.py index 9a25ab2a5df3c4a298c9d34203767b97553b50a8..eac92904ba43df7210c426e42e3b2347af112355 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 ad69c5f655815fafae63112b750894c1be0b8e7b..52fd14c8a5c87d2a16e5171c838978c9617357e9 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 194b55e9caf5441fe8eeabd253810a13beebf7ee..44f1eff6eb82486251f581d2aff3fba5156e7c81 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()