diff --git a/src/data/cloud.ts b/src/data/cloud.ts index c732b2a65f..5db22590c4 100644 --- a/src/data/cloud.ts +++ b/src/data/cloud.ts @@ -148,6 +148,11 @@ export const updateCloudPref = ( ...prefs, }); +export const removeCloudData = (hass: HomeAssistant) => + hass.callWS({ + type: "cloud/remove_data", + }); + export const updateCloudGoogleEntityConfig = ( hass: HomeAssistant, entity_id: string, diff --git a/src/panels/config/cloud/account/cloud-account.ts b/src/panels/config/cloud/account/cloud-account.ts index 8c81013cd2..8f11c1b8d2 100644 --- a/src/panels/config/cloud/account/cloud-account.ts +++ b/src/panels/config/cloud/account/cloud-account.ts @@ -1,6 +1,7 @@ import "@material/mwc-button"; import { css, html, LitElement } from "lit"; import { customElement, property, state } from "lit/decorators"; +import { mdiDeleteForever, mdiDotsVertical } from "@mdi/js"; import { formatDateTime } from "../../../../common/datetime/format_date_time"; import { fireEvent } from "../../../../common/dom/fire_event"; import { debounce } from "../../../../common/util/debounce"; @@ -12,9 +13,13 @@ import { cloudLogout, CloudStatusLoggedIn, fetchCloudSubscriptionInfo, + removeCloudData, SubscriptionInfo, } from "../../../../data/cloud"; -import { showConfirmationDialog } from "../../../../dialogs/generic/show-dialog-box"; +import { + showAlertDialog, + showConfirmationDialog, +} from "../../../../dialogs/generic/show-dialog-box"; import "../../../../layouts/hass-subpage"; import { SubscribeMixin } from "../../../../mixins/subscribe-mixin"; import { haStyle } from "../../../../resources/styles"; @@ -43,6 +48,20 @@ export class CloudAccount extends SubscribeMixin(LitElement) { .narrow=${this.narrow} header="Home Assistant Cloud" > + + + + + ${this.hass.localize( + "ui.panel.config.cloud.account.reset_cloud_data" + )} + + +
Home Assistant Cloud @@ -257,6 +276,36 @@ export class CloudAccount extends SubscribeMixin(LitElement) { fireEvent(this, "ha-refresh-cloud-status"); } + private async _deleteCloudData() { + const confirm = await showConfirmationDialog(this, { + title: this.hass.localize( + "ui.panel.config.cloud.account.reset_data_confirm_title" + ), + text: this.hass.localize( + "ui.panel.config.cloud.account.reset_data_confirm_text" + ), + confirmText: this.hass.localize("ui.panel.config.cloud.account.reset"), + destructive: true, + }); + if (!confirm) { + return; + } + try { + await cloudLogout(this.hass); + await removeCloudData(this.hass); + } catch (err: any) { + showAlertDialog(this, { + title: this.hass.localize( + "ui.panel.config.cloud.account.reset_data_failed" + ), + text: err?.message, + }); + return; + } finally { + fireEvent(this, "ha-refresh-cloud-status"); + } + } + static get styles() { return [ haStyle, diff --git a/src/panels/config/cloud/login/cloud-login.ts b/src/panels/config/cloud/login/cloud-login.ts index 57bb65b235..50571b07a1 100644 --- a/src/panels/config/cloud/login/cloud-login.ts +++ b/src/panels/config/cloud/login/cloud-login.ts @@ -2,6 +2,7 @@ import "@material/mwc-button"; import "@material/mwc-list/mwc-list"; import { css, html, LitElement, TemplateResult } from "lit"; import { customElement, property, query, state } from "lit/decorators"; +import { mdiDeleteForever, mdiDotsVertical } from "@mdi/js"; import { fireEvent } from "../../../../common/dom/fire_event"; import { navigate } from "../../../../common/navigate"; import "../../../../components/buttons/ha-progress-button"; @@ -11,7 +12,7 @@ import "../../../../components/ha-icon-next"; import "../../../../components/ha-list-item"; import type { HaTextField } from "../../../../components/ha-textfield"; import "../../../../components/ha-textfield"; -import { cloudLogin } from "../../../../data/cloud"; +import { cloudLogin, removeCloudData } from "../../../../data/cloud"; import { showAlertDialog, showConfirmationDialog, @@ -51,6 +52,20 @@ export class CloudLogin extends LitElement { .narrow=${this.narrow} header="Home Assistant Cloud" > + + + + + ${this.hass.localize( + "ui.panel.config.cloud.account.reset_cloud_data" + )} + + +
Home Assistant Cloud @@ -280,6 +295,35 @@ export class CloudLogin extends LitElement { fireEvent(this, "flash-message-changed", { value: "" }); } + private async _deleteCloudData() { + const confirm = await showConfirmationDialog(this, { + title: this.hass.localize( + "ui.panel.config.cloud.account.reset_data_confirm_title" + ), + text: this.hass.localize( + "ui.panel.config.cloud.account.reset_data_confirm_text" + ), + confirmText: this.hass.localize("ui.panel.config.cloud.account.reset"), + destructive: true, + }); + if (!confirm) { + return; + } + try { + await removeCloudData(this.hass); + } catch (err: any) { + showAlertDialog(this, { + title: this.hass.localize( + "ui.panel.config.cloud.account.reset_data_failed" + ), + text: err?.message, + }); + return; + } finally { + fireEvent(this, "ha-refresh-cloud-status"); + } + } + static get styles() { return [ haStyle, diff --git a/src/translations/en.json b/src/translations/en.json index c016bba08a..1fa1aa6875 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -3500,6 +3500,11 @@ "account_created": "Account created! Check your email for instructions on how to activate your account." }, "account": { + "reset_cloud_data": "Reset cloud data", + "reset_data_confirm_title": "Reset cloud data?", + "reset_data_confirm_text": "This will reset all your cloud settings. This includes your remote connection, Google Assistant and Amazon Alexa integrations. This action cannot be undone.", + "reset": "Reset", + "reset_data_failed": "Failed to reset cloud data", "thank_you_note": "Thank you for being part of Home Assistant Cloud. It's because of people like you that we are able to make a great home automation experience for everyone. Thank you!", "nabu_casa_account": "Nabu Casa Account", "connection_status": "Cloud connection status",