diff --git a/src/data/onboarding.ts b/src/data/onboarding.ts index 7a23cd08a8..303190072b 100644 --- a/src/data/onboarding.ts +++ b/src/data/onboarding.ts @@ -128,3 +128,11 @@ export const forgotPasswordHaCloud = async (email: string) => body: JSON.stringify({ email }), }) ); + +export const waitForIntegration = (domain: string) => + handleFetchPromise<{ integration_loaded: boolean }>( + fetch("/api/onboarding/integration/wait", { + method: "POST", + body: JSON.stringify({ domain }), + }) + ); diff --git a/src/onboarding/onboarding-restore-backup.ts b/src/onboarding/onboarding-restore-backup.ts index 2aa26148a8..7ee61e6538 100644 --- a/src/onboarding/onboarding-restore-backup.ts +++ b/src/onboarding/onboarding-restore-backup.ts @@ -15,7 +15,11 @@ import { } from "../data/backup_onboarding"; import { CLOUD_AGENT, type BackupContentExtended } from "../data/backup"; import { storage } from "../common/decorators/storage"; -import { fetchHaCloudStatus, signOutHaCloud } from "../data/onboarding"; +import { + fetchHaCloudStatus, + signOutHaCloud, + waitForIntegration, +} from "../data/onboarding"; import type { CloudStatus } from "../data/cloud"; import { showToast } from "../util/toast"; @@ -57,8 +61,13 @@ class OnboardingRestoreBackup extends LitElement { }) private _restoreRunning?: boolean; + private _loadedIntegrations = new Set(); + protected render(): TemplateResult { return html` + ${this._error && this._view !== "restore" + ? html`${this._error}` + : nothing} ${this._view === "loading" ? html`` : this._view === "upload" @@ -125,6 +134,14 @@ class OnboardingRestoreBackup extends LitElement { private async _loadBackupInfo() { let onboardingInfo: BackupOnboardingConfig; try { + if (!this._loadedIntegrations.has("backup")) { + if ((await waitForIntegration("backup")).integration_loaded) { + this._loadedIntegrations.add("backup"); + } else { + this._error = "Backup integration not loaded"; + return; + } + } onboardingInfo = await fetchBackupOnboardingInfo(); } catch (err: any) { if (this._restoreRunning) { @@ -169,6 +186,14 @@ class OnboardingRestoreBackup extends LitElement { if (this.mode === "cloud") { try { + if (!this._loadedIntegrations.has("cloud")) { + if ((await waitForIntegration("cloud")).integration_loaded) { + this._loadedIntegrations.add("cloud"); + } else { + this._error = "Cloud integration not loaded"; + return; + } + } this._cloudStatus = await fetchHaCloudStatus(); } catch (err: any) { this._error = err?.message || "Cannot get Home Assistant Cloud status";