From 03e728fe0492b8f3503491cc735e7be31223631f Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Tue, 7 May 2024 20:04:27 +0200 Subject: [PATCH] Load scripts after component rendered #470 --- .../keycloakify/generateFtl/generateFtl.ts | 44 ++++++------------- src/lib/usePrepareTemplate.ts | 17 ++++++- src/login/Template.tsx | 14 +++++- src/login/kcContext/kcContextMocks.ts | 3 +- 4 files changed, 44 insertions(+), 34 deletions(-) diff --git a/src/bin/keycloakify/generateFtl/generateFtl.ts b/src/bin/keycloakify/generateFtl/generateFtl.ts index 00d8050b..d01e3939 100644 --- a/src/bin/keycloakify/generateFtl/generateFtl.ts +++ b/src/bin/keycloakify/generateFtl/generateFtl.ts @@ -4,7 +4,6 @@ import { generateCssCodeToDefineGlobals } from "../replacers/replaceImportsInCss import { replaceImportsInInlineCssCode } from "../replacers/replaceImportsInInlineCssCode"; import * as fs from "fs"; import { join as pathJoin } from "path"; -import { objectKeys } from "tsafe/objectKeys"; import type { BuildOptions } from "../buildOptions"; import { assert } from "tsafe/assert"; import { type ThemeType, nameOfTheGlobal, basenameOfTheKeycloakifyResourcesDir, resources_common } from "../../constants"; @@ -96,35 +95,20 @@ export function generateFtlFilesCodeFactory(params: { } //FTL is no valid html, we can't insert with cheerio, we put placeholder for injecting later. - const replaceValueBySearchValue = { - '{ "x": "vIdLqMeOed9sdLdIdOxdK0d" }': fs - .readFileSync(pathJoin(__dirname, "ftl_object_to_js_code_declaring_an_object.ftl")) - .toString("utf8") - .match(/^', - " ", - "" - ].join("\n") - }; + const ftlObjectToJsCodeDeclaringAnObject = fs + .readFileSync(pathJoin(__dirname, "ftl_object_to_js_code_declaring_an_object.ftl")) + .toString("utf8") + .match(/^", - "", - objectKeys(replaceValueBySearchValue)[1] - ].join("\n") - ); + const ftlObjectToJsCodeDeclaringAnObjectPlaceholder = '{ "x": "vIdLqMeOed9sdLdIdOxdK0d" }'; + + $("head").prepend([""].join("\n")); // Remove part of the document marked as ignored. { @@ -159,7 +143,7 @@ export function generateFtlFilesCodeFactory(params: { let ftlCode = $.html(); Object.entries({ - ...replaceValueBySearchValue, + [ftlObjectToJsCodeDeclaringAnObjectPlaceholder]: ftlObjectToJsCodeDeclaringAnObject, "PAGE_ID_xIgLsPgGId9D8e": pageId }).map(([searchValue, replaceValue]) => (ftlCode = ftlCode.replace(searchValue, replaceValue))); diff --git a/src/lib/usePrepareTemplate.ts b/src/lib/usePrepareTemplate.ts index bca15c35..c264480d 100644 --- a/src/lib/usePrepareTemplate.ts +++ b/src/lib/usePrepareTemplate.ts @@ -70,6 +70,21 @@ export function usePrepareTemplate(params: { setReady(); })(); + return () => { + isUnmounted = true; + removeArray.forEach(remove => remove()); + }; + }, []); + + useEffect(() => { + if (!isReady) { + return; + } + + let isUnmounted = false; + + const removeArray: (() => void)[] = []; + scripts.forEach(script => { const { remove } = headInsert({ "type": "javascript", @@ -83,7 +98,7 @@ export function usePrepareTemplate(params: { isUnmounted = true; removeArray.forEach(remove => remove()); }; - }, []); + }, [isReady]); useSetClassName({ "target": "html", diff --git a/src/login/Template.tsx b/src/login/Template.tsx index bbcdd488..eb20a2f2 100644 --- a/src/login/Template.tsx +++ b/src/login/Template.tsx @@ -26,7 +26,7 @@ export default function Template(props: TemplateProps) { const { msg, msgStr, changeLocale, labelBySupportedLanguageTag, currentLanguageTag } = i18n; - const { realm, locale, auth, url, message, isAppInitiatedAction, authenticationSession } = kcContext; + const { realm, locale, auth, url, message, isAppInitiatedAction, authenticationSession, scripts } = kcContext; const { isReady } = usePrepareTemplate({ "styles": !doUseDefaultCss @@ -64,7 +64,17 @@ export default function Template(props: TemplateProps) { ].join("\n") } } - ]) + ]), + ...scripts.map( + script => + ({ + "isModule": false, + "source": { + "type": "url", + "src": script + } + } as const) + ) ], "htmlClassName": getClassName("kcHtmlClass"), "bodyClassName": getClassName("kcBodyClass"), diff --git a/src/login/kcContext/kcContextMocks.ts b/src/login/kcContext/kcContextMocks.ts index ca09bb3a..bd6c89c3 100644 --- a/src/login/kcContext/kcContextMocks.ts +++ b/src/login/kcContext/kcContextMocks.ts @@ -421,7 +421,8 @@ export const kcContextMocks = [ "context": "REGISTRATION_PROFILE" as const, attributes, attributesByName - } + }, + "scripts": [...registerCommon.scripts, "https://www.google.com/recaptcha/api.js"] }) ]; })(),