Make helper forms lazy load (#17068)

This commit is contained in:
Bram Kragten 2023-06-28 15:55:46 +02:00 committed by GitHub
parent e6d77af438
commit c0613545e7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -33,38 +33,59 @@ import { haStyleDialog } from "../../../resources/styles";
import { HomeAssistant } from "../../../types"; import { HomeAssistant } from "../../../types";
import { brandsUrl } from "../../../util/brands-url"; import { brandsUrl } from "../../../util/brands-url";
import { Helper, HelperDomain } from "./const"; import { Helper, HelperDomain } from "./const";
import "./forms/ha-counter-form";
import "./forms/ha-input_boolean-form";
import "./forms/ha-input_button-form";
import "./forms/ha-input_datetime-form";
import "./forms/ha-input_number-form";
import "./forms/ha-input_select-form";
import "./forms/ha-input_text-form";
import "./forms/ha-schedule-form";
import "./forms/ha-timer-form";
import type { ShowDialogHelperDetailParams } from "./show-dialog-helper-detail"; import type { ShowDialogHelperDetailParams } from "./show-dialog-helper-detail";
type HelperCreators = { type HelperCreators = {
[domain in HelperDomain]: ( [domain in HelperDomain]: {
hass: HomeAssistant, create: (
// Not properly typed because there is currently a mismatch for this._item between: hass: HomeAssistant,
// 1. Type passed to form should be Helper // Not properly typed because there is currently a mismatch for this._item between:
// 2. Type received by creator should be MutableParams version // 1. Type passed to form should be Helper
// The two are not compatible. // 2. Type received by creator should be MutableParams version
params: any // The two are not compatible.
) => Promise<Helper>; params: any
) => Promise<Helper>;
import: () => Promise<unknown>;
};
}; };
const HELPERS: HelperCreators = { const HELPERS: HelperCreators = {
input_boolean: createInputBoolean, input_boolean: {
input_button: createInputButton, create: createInputBoolean,
input_text: createInputText, import: () => import("./forms/ha-input_boolean-form"),
input_number: createInputNumber, },
input_datetime: createInputDateTime, input_button: {
input_select: createInputSelect, create: createInputButton,
counter: createCounter, import: () => import("./forms/ha-input_button-form"),
timer: createTimer, },
schedule: createSchedule, input_text: {
create: createInputText,
import: () => import("./forms/ha-input_text-form"),
},
input_number: {
create: createInputNumber,
import: () => import("./forms/ha-input_number-form"),
},
input_datetime: {
create: createInputDateTime,
import: () => import("./forms/ha-input_datetime-form"),
},
input_select: {
create: createInputSelect,
import: () => import("./forms/ha-input_select-form"),
},
counter: {
create: createCounter,
import: () => import("./forms/ha-counter-form"),
},
timer: {
create: createTimer,
import: () => import("./forms/ha-timer-form"),
},
schedule: {
create: createSchedule,
import: () => import("./forms/ha-schedule-form"),
},
}; };
@customElement("dialog-helper-detail") @customElement("dialog-helper-detail")
@ -85,6 +106,8 @@ export class DialogHelperDetail extends LitElement {
@state() private _helperFlows?: string[]; @state() private _helperFlows?: string[];
@state() private _loading = false;
private _params?: ShowDialogHelperDetailParams; private _params?: ShowDialogHelperDetailParams;
public async showDialog(params: ShowDialogHelperDetailParams): Promise<void> { public async showDialog(params: ShowDialogHelperDetailParams): Promise<void> {
@ -140,7 +163,7 @@ export class DialogHelperDetail extends LitElement {
${this.hass!.localize("ui.common.back")} ${this.hass!.localize("ui.common.back")}
</mwc-button> </mwc-button>
`; `;
} else if (this._helperFlows === undefined) { } else if (this._loading || this._helperFlows === undefined) {
content = html`<ha-circular-progress active></ha-circular-progress>`; content = html`<ha-circular-progress active></ha-circular-progress>`;
} else { } else {
const items: [string, string][] = []; const items: [string, string][] = [];
@ -250,7 +273,7 @@ export class DialogHelperDetail extends LitElement {
this._submitting = true; this._submitting = true;
this._error = ""; this._error = "";
try { try {
await HELPERS[this._domain](this.hass, this._item); await HELPERS[this._domain].create(this.hass, this._item);
this.closeDialog(); this.closeDialog();
} catch (err: any) { } catch (err: any) {
this._error = err.message || "Unknown error"; this._error = err.message || "Unknown error";
@ -259,14 +282,22 @@ export class DialogHelperDetail extends LitElement {
} }
} }
private _domainPicked(ev: CustomEvent<RequestSelectedDetail>): void { private async _domainPicked(
ev: CustomEvent<RequestSelectedDetail>
): Promise<void> {
if (!shouldHandleRequestSelectedEvent(ev)) { if (!shouldHandleRequestSelectedEvent(ev)) {
return; return;
} }
const domain = (ev.currentTarget! as any).domain; const domain = (ev.currentTarget! as any).domain;
if (domain in HELPERS) { if (domain in HELPERS) {
this._domain = domain; this._loading = true;
try {
await HELPERS[domain].import();
this._domain = domain;
} finally {
this._loading = false;
}
this._focusForm(); this._focusForm();
} else { } else {
showConfigFlowDialog(this, { showConfigFlowDialog(this, {