diff --git a/src/components/ha-area-picker.ts b/src/components/ha-area-picker.ts
index d073c42211..1f14568261 100644
--- a/src/components/ha-area-picker.ts
+++ b/src/components/ha-area-picker.ts
@@ -94,33 +94,40 @@ export class HaAreaPicker extends LitElement {
await this._picker?.open();
}
- private _valueRenderer: PickerValueRenderer = (value) => {
- const area = this.hass.areas[value];
+ // Recompute value renderer when the areas change
+ private _computeValueRenderer = memoizeOne(
+ (_haAreas: HomeAssistant["areas"]): PickerValueRenderer =>
+ (value) => {
+ const area = this.hass.areas[value];
- if (!area) {
- return html`
-
- ${area}
- `;
- }
+ if (!area) {
+ return html`
+
+ ${area}
+ `;
+ }
- const { floor } = getAreaContext(area, this.hass);
+ const { floor } = getAreaContext(area, this.hass);
- const areaName = area ? computeAreaName(area) : undefined;
- const floorName = floor ? computeFloorName(floor) : undefined;
+ const areaName = area ? computeAreaName(area) : undefined;
+ const floorName = floor ? computeFloorName(floor) : undefined;
- const icon = area.icon;
+ const icon = area.icon;
- return html`
- ${icon
- ? html``
- : html``}
- ${areaName}
- ${floorName
- ? html`${floorName}`
- : nothing}
- `;
- };
+ return html`
+ ${icon
+ ? html``
+ : html``}
+ ${areaName}
+ ${floorName
+ ? html`${floorName}`
+ : nothing}
+ `;
+ }
+ );
private _getAreas = memoizeOne(
(
@@ -352,6 +359,8 @@ export class HaAreaPicker extends LitElement {
const placeholder =
this.placeholder ?? this.hass.localize("ui.components.area-picker.area");
+ const valueRenderer = this._computeValueRenderer(this.hass.areas);
+
return html`
@@ -375,33 +384,35 @@ export class HaAreaPicker extends LitElement {
ev.stopPropagation();
const value = ev.detail.value;
- if (!value.startsWith(ADD_NEW_ID)) {
- if (value !== this.value) {
- this._setValue(value);
- }
+ if (!value) {
+ this._setValue(undefined);
return;
}
- this.hass.loadFragmentTranslation("config");
+ if (value.startsWith(ADD_NEW_ID)) {
+ this.hass.loadFragmentTranslation("config");
- const suggestedName = value.substring(ADD_NEW_ID.length);
+ const suggestedName = value.substring(ADD_NEW_ID.length);
- showAreaRegistryDetailDialog(this, {
- suggestedName: suggestedName,
- createEntry: async (values) => {
- try {
- const area = await createAreaRegistryEntry(this.hass, values);
- this._setValue(area.area_id);
- } catch (err: any) {
- showAlertDialog(this, {
- title: this.hass.localize(
- "ui.components.area-picker.failed_create_area"
- ),
- text: err.message,
- });
- }
- },
- });
+ showAreaRegistryDetailDialog(this, {
+ suggestedName: suggestedName,
+ createEntry: async (values) => {
+ try {
+ const area = await createAreaRegistryEntry(this.hass, values);
+ this._setValue(area.area_id);
+ } catch (err: any) {
+ showAlertDialog(this, {
+ title: this.hass.localize(
+ "ui.components.area-picker.failed_create_area"
+ ),
+ text: err.message,
+ });
+ }
+ },
+ });
+ }
+
+ this._setValue(value);
}
private _setValue(value?: string) {