From df8cf66e02071fd4ed1db91c6bd3c84f3b37192c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Sat, 2 May 2020 19:19:45 +0200 Subject: [PATCH] Adds dialog to ask user to restart add-on on configuration changes (#5707) * Adds dialog to ask user to restart addon on configuration changes * Apply review suggestions * Show error in dialog * Remove unused import * Update hassio/src/dialogs/suggestRestart.ts * Rename Co-authored-by: Bram Kragten --- .../addon-view/config/hassio-addon-audio.ts | 4 +++ .../addon-view/config/hassio-addon-config.ts | 5 +++ .../addon-view/config/hassio-addon-network.ts | 8 +++++ hassio/src/dialogs/suggestAddonRestart.ts | 33 +++++++++++++++++++ src/data/hassio/addon.ts | 7 ++++ 5 files changed, 57 insertions(+) create mode 100644 hassio/src/dialogs/suggestAddonRestart.ts diff --git a/hassio/src/addon-view/config/hassio-addon-audio.ts b/hassio/src/addon-view/config/hassio-addon-audio.ts index c59ff8fcef..859f00ef56 100644 --- a/hassio/src/addon-view/config/hassio-addon-audio.ts +++ b/hassio/src/addon-view/config/hassio-addon-audio.ts @@ -23,6 +23,7 @@ import { fetchHassioHardwareAudio, HassioHardwareAudioDevice, } from "../../../../src/data/hassio/hardware"; +import { suggestAddonRestart } from "../../dialogs/suggestAddonRestart"; import { haStyle } from "../../../../src/resources/styles"; import { HomeAssistant } from "../../../../src/types"; import { hassioStyle } from "../../resources/hassio-style"; @@ -183,6 +184,9 @@ class HassioAddonAudio extends LitElement { } catch { this._error = "Failed to set addon audio device"; } + if (!this._error && this.addon?.state === "started") { + await suggestAddonRestart(this, this.hass, this.addon); + } } } diff --git a/hassio/src/addon-view/config/hassio-addon-config.ts b/hassio/src/addon-view/config/hassio-addon-config.ts index 0ec5e97d94..83ddefe43e 100644 --- a/hassio/src/addon-view/config/hassio-addon-config.ts +++ b/hassio/src/addon-view/config/hassio-addon-config.ts @@ -25,6 +25,8 @@ import { haStyle } from "../../../../src/resources/styles"; import type { HomeAssistant } from "../../../../src/types"; import { hassioStyle } from "../../resources/hassio-style"; +import { suggestAddonRestart } from "../../dialogs/suggestAddonRestart"; + @customElement("hassio-addon-config") class HassioAddonConfig extends LitElement { @property({ attribute: false }) public hass!: HomeAssistant; @@ -165,6 +167,9 @@ class HassioAddonConfig extends LitElement { err.body?.message || err }`; } + if (!this._error && this.addon?.state === "started") { + await suggestAddonRestart(this, this.hass, this.addon); + } } } diff --git a/hassio/src/addon-view/config/hassio-addon-network.ts b/hassio/src/addon-view/config/hassio-addon-network.ts index 5d6e705a2a..9ecc873aed 100644 --- a/hassio/src/addon-view/config/hassio-addon-network.ts +++ b/hassio/src/addon-view/config/hassio-addon-network.ts @@ -16,6 +16,8 @@ import { HassioAddonSetOptionParams, setHassioAddonOption, } from "../../../../src/data/hassio/addon"; +import { suggestAddonRestart } from "../../dialogs/suggestAddonRestart"; + import { haStyle } from "../../../../src/resources/styles"; import { HomeAssistant } from "../../../../src/types"; import { hassioStyle } from "../../resources/hassio-style"; @@ -165,6 +167,9 @@ class HassioAddonNetwork extends LitElement { err.body?.message || err }`; } + if (!this._error && this.addon?.state === "started") { + await suggestAddonRestart(this, this.hass, this.addon); + } } private async _saveTapped(): Promise { @@ -191,6 +196,9 @@ class HassioAddonNetwork extends LitElement { err.body?.message || err }`; } + if (!this._error && this.addon?.state === "started") { + await suggestAddonRestart(this, this.hass, this.addon); + } } } diff --git a/hassio/src/dialogs/suggestAddonRestart.ts b/hassio/src/dialogs/suggestAddonRestart.ts new file mode 100644 index 0000000000..dc6fe6c3b4 --- /dev/null +++ b/hassio/src/dialogs/suggestAddonRestart.ts @@ -0,0 +1,33 @@ +import type { LitElement } from "lit-element"; +import { + HassioAddonDetails, + restartHassioAddon, +} from "../../../src/data/hassio/addon"; +import { HomeAssistant } from "../../../src/types"; +import { + showConfirmationDialog, + showAlertDialog, +} from "../../../src/dialogs/generic/show-dialog-box"; + +export const suggestAddonRestart = async ( + element: LitElement, + hass: HomeAssistant, + addon: HassioAddonDetails +): Promise => { + const confirmed = await showConfirmationDialog(element, { + title: addon.name, + text: "Do you want to restart the add-on with your changes?", + confirmText: "restart add-on", + dismissText: "no", + }); + if (confirmed) { + try { + await restartHassioAddon(hass, addon.slug); + } catch (err) { + showAlertDialog(element, { + title: "Failed to restart", + text: err.body.message, + }); + } + } +}; diff --git a/src/data/hassio/addon.ts b/src/data/hassio/addon.ts index a57ec83e1c..a6c20faf54 100644 --- a/src/data/hassio/addon.ts +++ b/src/data/hassio/addon.ts @@ -175,6 +175,13 @@ export const installHassioAddon = async (hass: HomeAssistant, slug: string) => { ); }; +export const restartHassioAddon = async (hass: HomeAssistant, slug: string) => { + return hass.callApi>( + "POST", + `hassio/addons/${slug}/restart` + ); +}; + export const uninstallHassioAddon = async ( hass: HomeAssistant, slug: string