From bdd842cc30b5f176bf97044e5c5199995e296b45 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 16 May 2022 20:11:41 -0500 Subject: [PATCH 1/8] Support requesting translations for multiple integrations in one request - Requires https://github.com/home-assistant/core/pull/71979 --- src/data/translation.ts | 4 +++- .../config/integrations/ha-config-integrations.ts | 13 ++++++++----- src/state/connection-mixin.ts | 10 ++++++++-- src/state/translations-mixin.ts | 5 ++++- src/types.ts | 3 ++- 5 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/data/translation.ts b/src/data/translation.ts index aee999172aa6..4e3945c7c540 100644 --- a/src/data/translation.ts +++ b/src/data/translation.ts @@ -53,7 +53,8 @@ export const getHassTranslations = async ( language: string, category: TranslationCategory, integration?: string, - config_flow?: boolean + config_flow?: boolean, + integrations?: string[] ): Promise> => { const result = await hass.callWS<{ resources: Record }>({ type: "frontend/get_translations", @@ -61,6 +62,7 @@ export const getHassTranslations = async ( category, integration, config_flow, + integrations, }); return result.resources; }; diff --git a/src/panels/config/integrations/ha-config-integrations.ts b/src/panels/config/integrations/ha-config-integrations.ts index c6dbcb17872e..a69211762563 100644 --- a/src/panels/config/integrations/ha-config-integrations.ts +++ b/src/panels/config/integrations/ha-config-integrations.ts @@ -156,17 +156,20 @@ class HaConfigIntegrations extends SubscribeMixin(LitElement) { this._deviceRegistryEntries = entries; }), subscribeConfigFlowInProgress(this.hass, async (flowsInProgress) => { - const translationsPromisses: Promise[] = []; + const integrations: Set = new Set(); flowsInProgress.forEach((flow) => { // To render title placeholders if (flow.context.title_placeholders) { - translationsPromisses.push( - this.hass.loadBackendTranslation("config", flow.handler) - ); + integrations.add(flow.handler); } this._fetchManifest(flow.handler); }); - await Promise.all(translationsPromisses); + await this.hass.loadBackendTranslation( + "config", + undefined, + undefined, + Array.from(integrations) + ); await nextRender(); this._configEntriesInProgress = flowsInProgress.map((flow) => ({ ...flow, diff --git a/src/state/connection-mixin.ts b/src/state/connection-mixin.ts index 5858ac67efd2..2af1b2c80bdb 100644 --- a/src/state/connection-mixin.ts +++ b/src/state/connection-mixin.ts @@ -144,13 +144,19 @@ export const connectionMixin = >( } return resp; }, - loadBackendTranslation: (category, integration?, configFlow?) => + loadBackendTranslation: ( + category, + integration?, + configFlow?, + integrations? + ) => // @ts-ignore this._loadHassTranslations( this.hass?.language, category, integration, - configFlow + configFlow, + integrations ), loadFragmentTranslation: (fragment) => // @ts-ignore diff --git a/src/state/translations-mixin.ts b/src/state/translations-mixin.ts index 3178271b6dc3..c30f68702729 100644 --- a/src/state/translations-mixin.ts +++ b/src/state/translations-mixin.ts @@ -207,6 +207,7 @@ export default >(superClass: T) => category: Parameters[2], integration?: Parameters[3], configFlow?: Parameters[4], + integrations?: Parameters[5], force = false ): Promise { if ( @@ -269,7 +270,8 @@ export default >(superClass: T) => language, category, integration, - configFlow + configFlow, + integrations ); // Ignore the repsonse if user switched languages before we got response @@ -381,6 +383,7 @@ export default >(superClass: T) => category as TranslationCategory, undefined, includeConfigFlow && cache.configFlow, + undefined, true ); } diff --git a/src/types.ts b/src/types.ts index b6bab9a98281..989d2ac2d327 100644 --- a/src/types.ts +++ b/src/types.ts @@ -241,7 +241,8 @@ export interface HomeAssistant { loadBackendTranslation( category: Parameters[2], integration?: Parameters[3], - configFlow?: Parameters[4] + configFlow?: Parameters[4], + integrations?: Parameters[5] ): Promise; loadFragmentTranslation(fragment: string): Promise; } From c14f77407c07ed301b7ba51dd1fc4bc90121b219 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 16 May 2022 20:20:02 -0500 Subject: [PATCH 2/8] onboarding as well --- src/onboarding/onboarding-integrations.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/onboarding/onboarding-integrations.ts b/src/onboarding/onboarding-integrations.ts index 9fc15b0c0716..0e649e2eebf1 100644 --- a/src/onboarding/onboarding-integrations.ts +++ b/src/onboarding/onboarding-integrations.ts @@ -49,12 +49,19 @@ class OnboardingIntegrations extends LitElement { this.hass.loadBackendTranslation("title", undefined, true); this._unsubEvents = subscribeConfigFlowInProgress(this.hass, (flows) => { this._discovered = flows; + const integrations: Set = new Set(); for (const flow of flows) { // To render title placeholders if (flow.context.title_placeholders) { - this.hass.loadBackendTranslation("config", flow.handler); + integrations.add(flow.handler); } } + this.hass.loadBackendTranslation( + "config", + undefined, + undefined, + Array.from(integrations) + ); }); } From 61706fda01c2c6c3d18d48ec65a0d27d0b8a5ee3 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 16 May 2022 23:12:51 -0500 Subject: [PATCH 3/8] integrations -> integration --- src/data/translation.ts | 6 ++---- src/onboarding/onboarding-integrations.ts | 7 +------ .../config/integrations/ha-config-integrations.ts | 2 -- src/state/connection-mixin.ts | 10 ++-------- src/state/translations-mixin.ts | 5 +---- src/types.ts | 3 +-- 6 files changed, 7 insertions(+), 26 deletions(-) diff --git a/src/data/translation.ts b/src/data/translation.ts index 4e3945c7c540..7374f40639cc 100644 --- a/src/data/translation.ts +++ b/src/data/translation.ts @@ -52,9 +52,8 @@ export const getHassTranslations = async ( hass: HomeAssistant, language: string, category: TranslationCategory, - integration?: string, - config_flow?: boolean, - integrations?: string[] + integration?: string | string[], + config_flow?: boolean ): Promise> => { const result = await hass.callWS<{ resources: Record }>({ type: "frontend/get_translations", @@ -62,7 +61,6 @@ export const getHassTranslations = async ( category, integration, config_flow, - integrations, }); return result.resources; }; diff --git a/src/onboarding/onboarding-integrations.ts b/src/onboarding/onboarding-integrations.ts index 0e649e2eebf1..1c21b9400816 100644 --- a/src/onboarding/onboarding-integrations.ts +++ b/src/onboarding/onboarding-integrations.ts @@ -56,12 +56,7 @@ class OnboardingIntegrations extends LitElement { integrations.add(flow.handler); } } - this.hass.loadBackendTranslation( - "config", - undefined, - undefined, - Array.from(integrations) - ); + this.hass.loadBackendTranslation("config", Array.from(integrations)); }); } diff --git a/src/panels/config/integrations/ha-config-integrations.ts b/src/panels/config/integrations/ha-config-integrations.ts index a69211762563..60df2ccec4ac 100644 --- a/src/panels/config/integrations/ha-config-integrations.ts +++ b/src/panels/config/integrations/ha-config-integrations.ts @@ -166,8 +166,6 @@ class HaConfigIntegrations extends SubscribeMixin(LitElement) { }); await this.hass.loadBackendTranslation( "config", - undefined, - undefined, Array.from(integrations) ); await nextRender(); diff --git a/src/state/connection-mixin.ts b/src/state/connection-mixin.ts index 2af1b2c80bdb..5858ac67efd2 100644 --- a/src/state/connection-mixin.ts +++ b/src/state/connection-mixin.ts @@ -144,19 +144,13 @@ export const connectionMixin = >( } return resp; }, - loadBackendTranslation: ( - category, - integration?, - configFlow?, - integrations? - ) => + loadBackendTranslation: (category, integration?, configFlow?) => // @ts-ignore this._loadHassTranslations( this.hass?.language, category, integration, - configFlow, - integrations + configFlow ), loadFragmentTranslation: (fragment) => // @ts-ignore diff --git a/src/state/translations-mixin.ts b/src/state/translations-mixin.ts index c30f68702729..3178271b6dc3 100644 --- a/src/state/translations-mixin.ts +++ b/src/state/translations-mixin.ts @@ -207,7 +207,6 @@ export default >(superClass: T) => category: Parameters[2], integration?: Parameters[3], configFlow?: Parameters[4], - integrations?: Parameters[5], force = false ): Promise { if ( @@ -270,8 +269,7 @@ export default >(superClass: T) => language, category, integration, - configFlow, - integrations + configFlow ); // Ignore the repsonse if user switched languages before we got response @@ -383,7 +381,6 @@ export default >(superClass: T) => category as TranslationCategory, undefined, includeConfigFlow && cache.configFlow, - undefined, true ); } diff --git a/src/types.ts b/src/types.ts index 989d2ac2d327..b6bab9a98281 100644 --- a/src/types.ts +++ b/src/types.ts @@ -241,8 +241,7 @@ export interface HomeAssistant { loadBackendTranslation( category: Parameters[2], integration?: Parameters[3], - configFlow?: Parameters[4], - integrations?: Parameters[5] + configFlow?: Parameters[4] ): Promise; loadFragmentTranslation(fragment: string): Promise; } From e1eb67c850e069888505b1bddb4e9dc106882840 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 16 May 2022 23:32:58 -0500 Subject: [PATCH 4/8] fix cache --- src/state/translations-mixin.ts | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/state/translations-mixin.ts b/src/state/translations-mixin.ts index 3178271b6dc3..e9800e56ee7f 100644 --- a/src/state/translations-mixin.ts +++ b/src/state/translations-mixin.ts @@ -239,12 +239,21 @@ export default >(superClass: T) => }; } + const integrationsToLoad: string[] = []; + // Check if already loaded if (!force) { - if (integration) { + if (integration && Array.isArray(integration)) { + integration.forEach((i) => { + if (!alreadyLoaded.integrations.includes(i)) { + integrationsToLoad.push(i); + } + }); + } else if (integration) { if (alreadyLoaded.integrations.includes(integration)) { return this.hass!.localize; } + integrationsToLoad.push(integration); } else if ( configFlow ? alreadyLoaded.configFlow : alreadyLoaded.setup ) { @@ -253,7 +262,13 @@ export default >(superClass: T) => } // Add to cache - if (integration) { + if (integration && Array.isArray(integration)) { + integration.forEach((i) => { + if (!alreadyLoaded.integrations.includes(i)) { + alreadyLoaded.integrations.push(i); + } + }); + } else if (integration) { if (!alreadyLoaded.integrations.includes(integration)) { alreadyLoaded.integrations.push(integration); } @@ -268,7 +283,7 @@ export default >(superClass: T) => this.hass!, language, category, - integration, + integrationsToLoad.length ? integrationsToLoad : undefined, configFlow ); From 7d230eb9f2494c5e495cb8399e911c0247be1396 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 16 May 2022 23:35:05 -0500 Subject: [PATCH 5/8] short return if they are all loaded --- src/state/translations-mixin.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/state/translations-mixin.ts b/src/state/translations-mixin.ts index e9800e56ee7f..47142a82093a 100644 --- a/src/state/translations-mixin.ts +++ b/src/state/translations-mixin.ts @@ -249,6 +249,9 @@ export default >(superClass: T) => integrationsToLoad.push(i); } }); + if (!integrationsToLoad.length) { + return this.hass!.localize; + } } else if (integration) { if (alreadyLoaded.integrations.includes(integration)) { return this.hass!.localize; From ba3f401ab45b12eba38d79b374e61e9233f23190 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 16 May 2022 23:37:09 -0500 Subject: [PATCH 6/8] reduce --- src/state/translations-mixin.ts | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/state/translations-mixin.ts b/src/state/translations-mixin.ts index 47142a82093a..88e5afe187c5 100644 --- a/src/state/translations-mixin.ts +++ b/src/state/translations-mixin.ts @@ -265,16 +265,10 @@ export default >(superClass: T) => } // Add to cache - if (integration && Array.isArray(integration)) { - integration.forEach((i) => { - if (!alreadyLoaded.integrations.includes(i)) { - alreadyLoaded.integrations.push(i); - } + if (integrationsToLoad.length) { + integrationsToLoad.forEach((i) => { + alreadyLoaded.integrations.push(i); }); - } else if (integration) { - if (!alreadyLoaded.integrations.includes(integration)) { - alreadyLoaded.integrations.push(integration); - } } else { alreadyLoaded.setup = true; if (configFlow) { From 00db6b79a4bef9785c74232d5e875be8212fb5b5 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 16 May 2022 23:39:16 -0500 Subject: [PATCH 7/8] reduce --- src/state/translations-mixin.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/state/translations-mixin.ts b/src/state/translations-mixin.ts index 88e5afe187c5..0031590f1362 100644 --- a/src/state/translations-mixin.ts +++ b/src/state/translations-mixin.ts @@ -266,9 +266,7 @@ export default >(superClass: T) => // Add to cache if (integrationsToLoad.length) { - integrationsToLoad.forEach((i) => { - alreadyLoaded.integrations.push(i); - }); + alreadyLoaded.integrations.push(...integrationsToLoad); } else { alreadyLoaded.setup = true; if (configFlow) { From 69419c2b1957f21fb1ea552a27cf393f338bb973 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 16 May 2022 23:56:35 -0500 Subject: [PATCH 8/8] reduce --- src/state/translations-mixin.ts | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/state/translations-mixin.ts b/src/state/translations-mixin.ts index 0031590f1362..c1089a0e578f 100644 --- a/src/state/translations-mixin.ts +++ b/src/state/translations-mixin.ts @@ -239,16 +239,14 @@ export default >(superClass: T) => }; } - const integrationsToLoad: string[] = []; + let integrationsToLoad: string[] = []; // Check if already loaded if (!force) { if (integration && Array.isArray(integration)) { - integration.forEach((i) => { - if (!alreadyLoaded.integrations.includes(i)) { - integrationsToLoad.push(i); - } - }); + integrationsToLoad = integration.filter( + (i) => !alreadyLoaded.integrations.includes(i) + ); if (!integrationsToLoad.length) { return this.hass!.localize; } @@ -256,7 +254,7 @@ export default >(superClass: T) => if (alreadyLoaded.integrations.includes(integration)) { return this.hass!.localize; } - integrationsToLoad.push(integration); + integrationsToLoad = [integration]; } else if ( configFlow ? alreadyLoaded.configFlow : alreadyLoaded.setup ) {