From 9710142c474ea19335f29e203df361659fa36e5a Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 26 Nov 2025 15:54:31 +0100 Subject: [PATCH] Resubscribe to descriptions when labs feat changes (#28145) --- .../add-automation-element-dialog.ts | 39 +++++++++---- .../condition/ha-automation-condition.ts | 55 ++++++++++++++++--- .../trigger/ha-automation-trigger.ts | 50 +++++++++++++++-- 3 files changed, 119 insertions(+), 25 deletions(-) diff --git a/src/panels/config/automation/add-automation-element-dialog.ts b/src/panels/config/automation/add-automation-element-dialog.ts index 8c2d2481bf..466a94f089 100644 --- a/src/panels/config/automation/add-automation-element-dialog.ts +++ b/src/panels/config/automation/add-automation-element-dialog.ts @@ -246,6 +246,31 @@ class DialogAddAutomationElement ) { this._calculateUsedDomains(); } + + if (changedProps.has("_newTriggersAndConditions")) { + this._subscribeDescriptions(); + } + } + + private _subscribeDescriptions() { + this._unsubscribe(); + if (this._params?.type === "trigger") { + this._triggerDescriptions = {}; + this._unsub = subscribeTriggers(this.hass, (triggers) => { + this._triggerDescriptions = { + ...this._triggerDescriptions, + ...triggers, + }; + }); + } else if (this._params?.type === "condition") { + this._conditionDescriptions = {}; + this._unsub = subscribeConditions(this.hass, (conditions) => { + this._conditionDescriptions = { + ...this._conditionDescriptions, + ...conditions, + }; + }); + } } public hassSubscribe() { @@ -279,21 +304,11 @@ class DialogAddAutomationElement } else if (this._params?.type === "trigger") { this.hass.loadBackendTranslation("triggers"); getTriggerIcons(this.hass); - this._unsub = subscribeTriggers(this.hass, (triggers) => { - this._triggerDescriptions = { - ...this._triggerDescriptions, - ...triggers, - }; - }); + this._subscribeDescriptions(); } else if (this._params?.type === "condition") { this.hass.loadBackendTranslation("conditions"); getConditionIcons(this.hass); - this._unsub = subscribeConditions(this.hass, (conditions) => { - this._conditionDescriptions = { - ...this._conditionDescriptions, - ...conditions, - }; - }); + this._subscribeDescriptions(); } window.addEventListener("resize", this._updateNarrow); diff --git a/src/panels/config/automation/condition/ha-automation-condition.ts b/src/panels/config/automation/condition/ha-automation-condition.ts index 9a6aaf4a57..ea20b92a67 100644 --- a/src/panels/config/automation/condition/ha-automation-condition.ts +++ b/src/panels/config/automation/condition/ha-automation-condition.ts @@ -1,6 +1,9 @@ import { mdiDragHorizontalVariant, mdiPlus } from "@mdi/js"; import deepClone from "deep-clone-simple"; -import type { HassServiceTarget } from "home-assistant-js-websocket"; +import type { + HassServiceTarget, + UnsubscribeFunc, +} from "home-assistant-js-websocket"; import type { PropertyValues } from "lit"; import { html, LitElement, nothing } from "lit"; import { customElement, property, queryAll, state } from "lit/decorators"; @@ -25,6 +28,7 @@ import { CONDITION_BUILDING_BLOCKS, subscribeConditions, } from "../../../../data/condition"; +import { subscribeLabFeatures } from "../../../../data/labs"; import { SubscribeMixin } from "../../../../mixins/subscribe-mixin"; import type { HomeAssistant } from "../../../../types"; import { @@ -74,19 +78,52 @@ export default class HaAutomationCondition extends SubscribeMixin(LitElement) { private _conditionKeys = new WeakMap(); + private _unsub?: Promise; + + // @ts-ignore + @state() private _newTriggersAndConditions = false; + + public disconnectedCallback() { + super.disconnectedCallback(); + this._unsubscribe(); + } + protected hassSubscribe() { return [ - subscribeConditions(this.hass, (conditions) => - this._addConditions(conditions) - ), + subscribeLabFeatures(this.hass!.connection, (features) => { + this._newTriggersAndConditions = + features.find( + (feature) => + feature.domain === "automation" && + feature.preview_feature === "new_triggers_conditions" + )?.enabled ?? false; + }), ]; } - private _addConditions(conditions: ConditionDescriptions) { - this._conditionDescriptions = { - ...this._conditionDescriptions, - ...conditions, - }; + private _subscribeDescriptions() { + this._unsubscribe(); + this._conditionDescriptions = {}; + this._unsub = subscribeConditions(this.hass, (descriptions) => { + this._conditionDescriptions = { + ...this._conditionDescriptions, + ...descriptions, + }; + }); + } + + private _unsubscribe() { + if (this._unsub) { + this._unsub.then((unsub) => unsub()); + this._unsub = undefined; + } + } + + protected willUpdate(changedProperties: PropertyValues): void { + super.willUpdate(changedProperties); + if (changedProperties.has("_newTriggersAndConditions")) { + this._subscribeDescriptions(); + } } protected firstUpdated(changedProps: PropertyValues) { diff --git a/src/panels/config/automation/trigger/ha-automation-trigger.ts b/src/panels/config/automation/trigger/ha-automation-trigger.ts index 5df376a004..0510cfe166 100644 --- a/src/panels/config/automation/trigger/ha-automation-trigger.ts +++ b/src/panels/config/automation/trigger/ha-automation-trigger.ts @@ -1,6 +1,9 @@ import { mdiDragHorizontalVariant, mdiPlus } from "@mdi/js"; import deepClone from "deep-clone-simple"; -import type { HassServiceTarget } from "home-assistant-js-websocket"; +import type { + HassServiceTarget, + UnsubscribeFunc, +} from "home-assistant-js-websocket"; import type { PropertyValues } from "lit"; import { html, LitElement, nothing } from "lit"; import { customElement, property, state } from "lit/decorators"; @@ -21,6 +24,7 @@ import { type Trigger, type TriggerList, } from "../../../../data/automation"; +import { subscribeLabFeatures } from "../../../../data/labs"; import type { TriggerDescriptions } from "../../../../data/trigger"; import { isTriggerList, subscribeTriggers } from "../../../../data/trigger"; import { SubscribeMixin } from "../../../../mixins/subscribe-mixin"; @@ -67,16 +71,54 @@ export default class HaAutomationTrigger extends SubscribeMixin(LitElement) { private _triggerKeys = new WeakMap(); + private _unsub?: Promise; + @state() private _triggerDescriptions: TriggerDescriptions = {}; + // @ts-ignore + @state() private _newTriggersAndConditions = false; + + public disconnectedCallback() { + super.disconnectedCallback(); + this._unsubscribe(); + } + protected hassSubscribe() { return [ - subscribeTriggers(this.hass, (triggers) => this._addTriggers(triggers)), + subscribeLabFeatures(this.hass!.connection, (features) => { + this._newTriggersAndConditions = + features.find( + (feature) => + feature.domain === "automation" && + feature.preview_feature === "new_triggers_conditions" + )?.enabled ?? false; + }), ]; } - private _addTriggers(triggers: TriggerDescriptions) { - this._triggerDescriptions = { ...this._triggerDescriptions, ...triggers }; + private _subscribeDescriptions() { + this._unsubscribe(); + this._triggerDescriptions = {}; + this._unsub = subscribeTriggers(this.hass, (descriptions) => { + this._triggerDescriptions = { + ...this._triggerDescriptions, + ...descriptions, + }; + }); + } + + private _unsubscribe() { + if (this._unsub) { + this._unsub.then((unsub) => unsub()); + this._unsub = undefined; + } + } + + protected willUpdate(changedProperties: PropertyValues): void { + super.willUpdate(changedProperties); + if (changedProperties.has("_newTriggersAndConditions")) { + this._subscribeDescriptions(); + } } protected firstUpdated(changedProps: PropertyValues) {