From 6442606fc595b69d899d1ad499845de0d93615ed Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Mon, 28 Apr 2025 09:51:58 +0200 Subject: [PATCH] Wait for backup integration when doing a restore (#25188) Co-authored-by: Wendelin --- src/onboarding/onboarding-restore-backup.ts | 47 ++++++++++++++------- 1 file changed, 31 insertions(+), 16 deletions(-) diff --git a/src/onboarding/onboarding-restore-backup.ts b/src/onboarding/onboarding-restore-backup.ts index 7ee61e6538..aa14347449 100644 --- a/src/onboarding/onboarding-restore-backup.ts +++ b/src/onboarding/onboarding-restore-backup.ts @@ -1,27 +1,27 @@ import type { TemplateResult } from "lit"; import { css, html, LitElement, nothing } from "lit"; import { customElement, property, state } from "lit/decorators"; -import "./restore-backup/onboarding-restore-backup-restore"; -import "./restore-backup/onboarding-restore-backup-status"; -import type { LocalizeFunc } from "../common/translations/localize"; -import "./onboarding-loading"; -import { removeSearchParam } from "../common/url/search-params"; +import { storage } from "../common/decorators/storage"; import { navigate } from "../common/navigate"; -import { onBoardingStyles } from "./styles"; +import type { LocalizeFunc } from "../common/translations/localize"; +import { removeSearchParam } from "../common/url/search-params"; +import { CLOUD_AGENT, type BackupContentExtended } from "../data/backup"; import { fetchBackupOnboardingInfo, type BackupOnboardingConfig, type BackupOnboardingInfo, } from "../data/backup_onboarding"; -import { CLOUD_AGENT, type BackupContentExtended } from "../data/backup"; -import { storage } from "../common/decorators/storage"; +import type { CloudStatus } from "../data/cloud"; import { fetchHaCloudStatus, signOutHaCloud, waitForIntegration, } from "../data/onboarding"; -import type { CloudStatus } from "../data/cloud"; import { showToast } from "../util/toast"; +import "./onboarding-loading"; +import "./restore-backup/onboarding-restore-backup-restore"; +import "./restore-backup/onboarding-restore-backup-status"; +import { onBoardingStyles } from "./styles"; const STATUS_INTERVAL_IN_MS = 5000; @@ -133,15 +133,26 @@ class OnboardingRestoreBackup extends LitElement { private async _loadBackupInfo() { let onboardingInfo: BackupOnboardingConfig; - try { - if (!this._loadedIntegrations.has("backup")) { + if (this._restoreRunning || !this._loadedIntegrations.has("backup")) { + try { if ((await waitForIntegration("backup")).integration_loaded) { this._loadedIntegrations.add("backup"); } else { this._error = "Backup integration not loaded"; return; } + } catch (err: any) { + // core seems to be back up restored + if (err.status_code === 404) { + this._resetAndReload(); + return; + } + + this._scheduleLoadBackupInfo(1000); + return; } + } + try { onboardingInfo = await fetchBackupOnboardingInfo(); } catch (err: any) { if (this._restoreRunning) { @@ -157,9 +168,7 @@ class OnboardingRestoreBackup extends LitElement { // core seems to be back up restored if (err.status_code === 404) { - this._restoreRunning = undefined; - this._backupId = undefined; - window.location.replace("/"); + this._resetAndReload(); return; } } @@ -250,13 +259,19 @@ class OnboardingRestoreBackup extends LitElement { } } + private _resetAndReload() { + this._restoreRunning = undefined; + this._backupId = undefined; + window.location.replace("/"); + } + private _showCloudBackup() { this._view = "loading"; this._loadBackupInfo(); } - private _scheduleLoadBackupInfo() { - setTimeout(() => this._loadBackupInfo(), STATUS_INTERVAL_IN_MS); + private _scheduleLoadBackupInfo(delay: number = STATUS_INTERVAL_IN_MS) { + setTimeout(() => this._loadBackupInfo(), delay); } private async _backupUploaded(ev: CustomEvent) {