From add417a1669b85a35957045a645bc093f3d4233e Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Fri, 11 Apr 2025 16:50:23 +0200 Subject: [PATCH] Wait for backup integration to setup before subscribing (#25012) --- package.json | 2 +- src/data/backup_manager.ts | 13 +++-- src/data/integration.ts | 6 +++ .../backup/dialogs/dialog-restore-backup.ts | 49 ++++++++++++------- yarn.lock | 10 ++-- 5 files changed, 51 insertions(+), 29 deletions(-) diff --git a/package.json b/package.json index 2b1685fc1e..32eeb3b9cc 100644 --- a/package.json +++ b/package.json @@ -112,7 +112,7 @@ "google-timezones-json": "1.2.0", "gulp-zopfli-green": "6.0.2", "hls.js": "patch:hls.js@npm%3A1.5.7#~/.yarn/patches/hls.js-npm-1.5.7-f5bbd3d060.patch", - "home-assistant-js-websocket": "9.4.0", + "home-assistant-js-websocket": "9.5.0", "idb-keyval": "6.2.1", "intl-messageformat": "10.7.16", "js-yaml": "4.1.0", diff --git a/src/data/backup_manager.ts b/src/data/backup_manager.ts index 245a101f91..fe127e2868 100644 --- a/src/data/backup_manager.ts +++ b/src/data/backup_manager.ts @@ -66,11 +66,16 @@ export type ManagerStateEvent = export const subscribeBackupEvents = ( hass: HomeAssistant, - callback: (event: ManagerStateEvent) => void + callback: (event: ManagerStateEvent) => void, + preCheck?: () => boolean | Promise ) => - hass.connection.subscribeMessage(callback, { - type: "backup/subscribe_events", - }); + hass.connection.subscribeMessage( + callback, + { + type: "backup/subscribe_events", + }, + { preCheck } + ); export const DEFAULT_MANAGER_STATE: ManagerStateEvent = { manager_state: "idle", diff --git a/src/data/integration.ts b/src/data/integration.ts index 21aa60965e..75cb334060 100644 --- a/src/data/integration.ts +++ b/src/data/integration.ts @@ -154,3 +154,9 @@ export const subscribeLogInfo = ( conn, onChange ); + +export const waitForIntegrationSetup = (hass: HomeAssistant, domain: string) => + hass.callWS<{ integration_loaded: boolean }>({ + type: "integration/wait", + domain, + }); diff --git a/src/panels/config/backup/dialogs/dialog-restore-backup.ts b/src/panels/config/backup/dialogs/dialog-restore-backup.ts index d70e9c5a89..e923678b4d 100644 --- a/src/panels/config/backup/dialogs/dialog-restore-backup.ts +++ b/src/panels/config/backup/dialogs/dialog-restore-backup.ts @@ -30,6 +30,7 @@ import type { HassDialog } from "../../../../dialogs/make-dialog-manager"; import { haStyle, haStyleDialog } from "../../../../resources/styles"; import type { HomeAssistant } from "../../../../types"; import type { RestoreBackupDialogParams } from "./show-dialog-restore-backup"; +import { waitForIntegrationSetup } from "../../../../data/integration"; interface FormData { encryption_key_type: "config" | "custom"; @@ -280,26 +281,36 @@ class DialogRestoreBackup extends LitElement implements HassDialog { } private _subscribeBackupEvents() { - this._unsub = subscribeBackupEvents(this.hass!, (event) => { - if (event.manager_state === "idle" && this._state === "in_progress") { - this.closeDialog(); + this._unsub = subscribeBackupEvents( + this.hass!, + (event) => { + if (event.manager_state === "idle" && this._state === "in_progress") { + this.closeDialog(); + } + if (event.manager_state !== "restore_backup") { + return; + } + this._state = event.state; + if (event.state === "completed") { + this.closeDialog(); + } + if (event.state === "failed") { + this._error = this.hass.localize( + "ui.panel.config.backup.dialogs.restore.restore_failed" + ); + } + if (event.state === "in_progress") { + this._stage = event.stage; + } + }, + async () => { + if (isComponentLoaded(this.hass, "backup")) { + return true; + } + return (await waitForIntegrationSetup(this.hass, "backup")) + .integration_loaded; } - if (event.manager_state !== "restore_backup") { - return; - } - this._state = event.state; - if (event.state === "completed") { - this.closeDialog(); - } - if (event.state === "failed") { - this._error = this.hass.localize( - "ui.panel.config.backup.dialogs.restore.restore_failed" - ); - } - if (event.state === "in_progress") { - this._stage = event.stage; - } - }); + ); } private _unsubscribe() { diff --git a/yarn.lock b/yarn.lock index 91676b9d0e..ec475b3594 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9483,7 +9483,7 @@ __metadata: gulp-rename: "npm:2.0.0" gulp-zopfli-green: "npm:6.0.2" hls.js: "patch:hls.js@npm%3A1.5.7#~/.yarn/patches/hls.js-npm-1.5.7-f5bbd3d060.patch" - home-assistant-js-websocket: "npm:9.4.0" + home-assistant-js-websocket: "npm:9.5.0" html-minifier-terser: "npm:7.2.0" husky: "npm:9.1.7" idb-keyval: "npm:6.2.1" @@ -9546,10 +9546,10 @@ __metadata: languageName: unknown linkType: soft -"home-assistant-js-websocket@npm:9.4.0": - version: 9.4.0 - resolution: "home-assistant-js-websocket@npm:9.4.0" - checksum: 10/af886bdd5d9200a7fd279082b2a108ce9deeb97e3fe9cb363e8e74ec87960d303ecb58b4ebf40efb325738f8190d4f152503bfe47e85ab6e5bf9209b0e91f838 +"home-assistant-js-websocket@npm:9.5.0": + version: 9.5.0 + resolution: "home-assistant-js-websocket@npm:9.5.0" + checksum: 10/42f991b3b85aa61be28984f099a001ac083fb3da54b2777283d0c97976c564a303d8d4ba467e1b8e29cbc33151cd6eef64c1a7d3392d62bbb9cbb27aa7ca9942 languageName: node linkType: hard