keycloakify 10.0.0-rc.77 → 10.0.0-rc.79

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/account/Template.js +2 -2
  2. package/account/Template.js.map +1 -1
  3. package/account/i18n/i18n.d.ts +5 -5
  4. package/account/i18n/i18n.js +13 -35
  5. package/account/i18n/i18n.js.map +1 -1
  6. package/account/i18n/index.d.ts +1 -1
  7. package/account/i18n/index.js +1 -1
  8. package/account/i18n/index.js.map +1 -1
  9. package/account/i18n/useI18n.d.ts +13 -0
  10. package/account/i18n/useI18n.js +26 -0
  11. package/account/i18n/useI18n.js.map +1 -0
  12. package/bin/440.index.js +15 -19
  13. package/bin/751.index.js +0 -2
  14. package/bin/shared/constants.d.ts +0 -1
  15. package/bin/shared/constants.js +0 -1
  16. package/bin/shared/constants.js.map +1 -1
  17. package/login/KcContext/KcContext.d.ts +5 -1
  18. package/login/KcContext/KcContext.js +0 -1
  19. package/login/KcContext/KcContext.js.map +1 -1
  20. package/login/KcContext/kcContextMocks.js +4 -1
  21. package/login/KcContext/kcContextMocks.js.map +1 -1
  22. package/login/Template.js +2 -2
  23. package/login/Template.js.map +1 -1
  24. package/login/i18n/i18n.d.ts +8 -5
  25. package/login/i18n/i18n.js +24 -39
  26. package/login/i18n/i18n.js.map +1 -1
  27. package/login/i18n/index.d.ts +1 -1
  28. package/login/i18n/index.js +1 -1
  29. package/login/i18n/index.js.map +1 -1
  30. package/login/i18n/useI18n.d.ts +13 -0
  31. package/login/i18n/useI18n.js +26 -0
  32. package/login/i18n/useI18n.js.map +1 -0
  33. package/login/lib/useDownloadTerms.d.ts +5 -4
  34. package/login/lib/useDownloadTerms.js +26 -5
  35. package/login/lib/useDownloadTerms.js.map +1 -1
  36. package/login/pages/Register.js +7 -6
  37. package/login/pages/Register.js.map +1 -1
  38. package/login/pages/Terms.d.ts +1 -1
  39. package/login/pages/Terms.js +6 -4
  40. package/login/pages/Terms.js.map +1 -1
  41. package/package.json +15 -7
  42. package/src/account/Template.tsx +2 -2
  43. package/src/account/i18n/i18n.tsx +22 -56
  44. package/src/account/i18n/index.ts +1 -1
  45. package/src/account/i18n/useI18n.ts +44 -0
  46. package/src/bin/keycloakify/generateFtl/generateFtl.ts +1 -6
  47. package/src/bin/keycloakify/generateFtl/kcContextDeclarationTemplate.ftl +8 -1
  48. package/src/bin/keycloakify/generateResources/generateMessageProperties.ts +23 -17
  49. package/src/bin/shared/constants.ts +0 -2
  50. package/src/login/KcContext/KcContext.ts +6 -14
  51. package/src/login/KcContext/kcContextMocks.ts +4 -1
  52. package/src/login/Template.tsx +2 -2
  53. package/src/login/i18n/i18n.tsx +40 -61
  54. package/src/login/i18n/index.ts +1 -1
  55. package/src/login/i18n/useI18n.ts +44 -0
  56. package/src/login/lib/useDownloadTerms.tsx +88 -0
  57. package/src/login/pages/Register.tsx +12 -12
  58. package/src/login/pages/Terms.tsx +12 -11
  59. package/src/tools/react-markdown.ts +3 -0
  60. package/tools/react-markdown.d.ts +3 -0
  61. package/tools/react-markdown.js +4 -0
  62. package/tools/react-markdown.js.map +1 -0
  63. package/vite-plugin/index.js +0 -2
  64. package/src/login/lib/useDownloadTerms.ts +0 -57
  65. package/src/tools/Markdown.ts +0 -3
  66. package/tools/Markdown.d.ts +0 -2
  67. package/tools/Markdown.js +0 -3
  68. package/tools/Markdown.js.map +0 -1
@@ -1,4 +1,5 @@
1
- export type KcContextLike = {
1
+ /// <reference types="react" />
2
+ export type KcContextLike_useDownloadTerms = {
2
3
  pageId: string;
3
4
  locale?: {
4
5
  currentLanguageTag: string;
@@ -7,7 +8,7 @@ export type KcContextLike = {
7
8
  };
8
9
  /** Allow to avoid bundling the terms and download it on demand*/
9
10
  export declare function useDownloadTerms(params: {
10
- kcContext: KcContextLike;
11
+ kcContext: KcContextLike_useDownloadTerms;
11
12
  downloadTermsMarkdown: (params: {
12
13
  currentLanguageTag: string;
13
14
  }) => Promise<{
@@ -17,10 +18,10 @@ export declare function useDownloadTerms(params: {
17
18
  }): void;
18
19
  export declare function useTermsMarkdown(): {
19
20
  isDownloadComplete: false;
21
+ ReactMarkdown?: undefined;
20
22
  termsMarkdown?: undefined;
21
- termsLanguageTag?: undefined;
22
23
  } | {
23
24
  isDownloadComplete: boolean;
25
+ ReactMarkdown: (props: Readonly<import("react-markdown/lib").Options>) => JSX.Element;
24
26
  termsMarkdown: string;
25
- termsLanguageTag: string | undefined;
26
27
  };
@@ -1,3 +1,5 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState, useEffect } from "react";
1
3
  import { fallbackLanguageTag } from "../../login/i18n";
2
4
  import { assert } from "tsafe/assert";
3
5
  import { createStatefulObservable, useRerenderOnChange } from "../../tools/StatefulObservable";
@@ -10,9 +12,28 @@ export function useDownloadTerms(params) {
10
12
  useOnFistMount(async () => {
11
13
  var _a, _b;
12
14
  if (kcContext.pageId === "terms.ftl" || kcContext.termsAcceptanceRequired) {
13
- obs.current = await downloadTermsMarkdown({
14
- currentLanguageTag: (_b = (_a = kcContext.locale) === null || _a === void 0 ? void 0 : _a.currentLanguageTag) !== null && _b !== void 0 ? _b : fallbackLanguageTag
15
- });
15
+ const currentLanguageTag = (_b = (_a = kcContext.locale) === null || _a === void 0 ? void 0 : _a.currentLanguageTag) !== null && _b !== void 0 ? _b : fallbackLanguageTag;
16
+ const [ReactMarkdown_base, { termsMarkdown, termsLanguageTag }] = await Promise.all([
17
+ import("../../tools/react-markdown").then(_ => _.default),
18
+ downloadTermsMarkdown({ currentLanguageTag })
19
+ ]);
20
+ const htmlLang = termsLanguageTag !== currentLanguageTag ? termsLanguageTag : undefined;
21
+ const ReactMarkdown = htmlLang === undefined
22
+ ? ReactMarkdown_base
23
+ : props => {
24
+ const [anchor, setAnchor] = useState(null);
25
+ useEffect(() => {
26
+ if (anchor === null) {
27
+ return;
28
+ }
29
+ const parent = anchor.parentElement;
30
+ assert(parent !== null);
31
+ parent.setAttribute("lang", htmlLang);
32
+ anchor.remove();
33
+ }, [anchor]);
34
+ return (_jsxs(_Fragment, { children: [_jsx(ReactMarkdown_base, Object.assign({}, props)), _jsx("div", { ref: setAnchor, style: { display: "none" }, "aria-hidden": true })] }));
35
+ };
36
+ obs.current = { ReactMarkdown, termsMarkdown };
16
37
  }
17
38
  });
18
39
  }
@@ -21,7 +42,7 @@ export function useTermsMarkdown() {
21
42
  if (obs.current === undefined) {
22
43
  return { isDownloadComplete: false };
23
44
  }
24
- const { termsMarkdown, termsLanguageTag } = obs.current;
25
- return { isDownloadComplete: true, termsMarkdown, termsLanguageTag };
45
+ const { ReactMarkdown, termsMarkdown } = obs.current;
46
+ return { isDownloadComplete: true, ReactMarkdown, termsMarkdown };
26
47
  }
27
48
  //# sourceMappingURL=useDownloadTerms.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useDownloadTerms.js","sourceRoot":"","sources":["../../src/login/lib/useDownloadTerms.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EACH,wBAAwB,EACxB,mBAAmB,EACtB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAGnE,MAAM,GAAG,GAAG,wBAAwB,CAMlC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;AAUnB,MAAM,EAAkD,CAAC;AAEzD,iEAAiE;AACjE,MAAM,UAAU,gBAAgB,CAAC,MAKhC;IACG,MAAM,EAAE,SAAS,EAAE,qBAAqB,EAAE,GAAG,MAAM,CAAC;IAEpD,cAAc,CAAC,KAAK,IAAI,EAAE;;QACtB,IAAI,SAAS,CAAC,MAAM,KAAK,WAAW,IAAI,SAAS,CAAC,uBAAuB,EAAE;YACvE,GAAG,CAAC,OAAO,GAAG,MAAM,qBAAqB,CAAC;gBACtC,kBAAkB,EACd,MAAA,MAAA,SAAS,CAAC,MAAM,0CAAE,kBAAkB,mCAAI,mBAAmB;aAClE,CAAC,CAAC;SACN;IACL,CAAC,CAAC,CAAC;AACP,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC5B,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAEzB,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS,EAAE;QAC3B,OAAO,EAAE,kBAAkB,EAAE,KAAc,EAAE,CAAC;KACjD;IAED,MAAM,EAAE,aAAa,EAAE,gBAAgB,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC;IAExD,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,aAAa,EAAE,gBAAgB,EAAE,CAAC;AACzE,CAAC"}
1
+ {"version":3,"file":"useDownloadTerms.js","sourceRoot":"","sources":["../../src/login/lib/useDownloadTerms.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AACrG,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAInE,MAAM,GAAG,GAAG,wBAAwB,CAMlC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;AAUnB,MAAM,EAAmE,CAAC;AAE1E,iEAAiE;AACjE,MAAM,UAAU,gBAAgB,CAAC,MAGhC;IACG,MAAM,EAAE,SAAS,EAAE,qBAAqB,EAAE,GAAG,MAAM,CAAC;IAEpD,cAAc,CAAC,KAAK,IAAI,EAAE;;QACtB,IAAI,SAAS,CAAC,MAAM,KAAK,WAAW,IAAI,SAAS,CAAC,uBAAuB,EAAE;YACvE,MAAM,kBAAkB,GAAG,MAAA,MAAA,SAAS,CAAC,MAAM,0CAAE,kBAAkB,mCAAI,mBAAmB,CAAC;YAEvF,MAAM,CAAC,kBAAkB,EAAE,EAAE,aAAa,EAAE,gBAAgB,EAAE,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBAChF,MAAM,CAAC,4BAA4B,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;gBACzD,qBAAqB,CAAC,EAAE,kBAAkB,EAAE,CAAC;aACvC,CAAC,CAAC;YAEZ,MAAM,QAAQ,GAAG,gBAAgB,KAAK,kBAAkB,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC;YAExF,MAAM,aAAa,GACf,QAAQ,KAAK,SAAS;gBAClB,CAAC,CAAC,kBAAkB;gBACpB,CAAC,CAAC,KAAK,CAAC,EAAE;oBACJ,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAwB,IAAI,CAAC,CAAC;oBAElE,SAAS,CAAC,GAAG,EAAE;wBACX,IAAI,MAAM,KAAK,IAAI,EAAE;4BACjB,OAAO;yBACV;wBAED,MAAM,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC;wBAEpC,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC;wBAExB,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;wBAEtC,MAAM,CAAC,MAAM,EAAE,CAAC;oBACpB,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;oBAEb,OAAO,CACH,8BACI,KAAC,kBAAkB,oBAAK,KAAK,EAAI,EACjC,cAAK,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,wBAAgB,IAChE,CACN,CAAC;gBACN,CAAC,CAAC;YAEZ,GAAG,CAAC,OAAO,GAAG,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC;SAClD;IACL,CAAC,CAAC,CAAC;AACP,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC5B,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAEzB,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS,EAAE;QAC3B,OAAO,EAAE,kBAAkB,EAAE,KAAc,EAAE,CAAC;KACjD;IAED,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC;IAErD,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC;AACtE,CAAC"}
@@ -1,6 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { useState } from "react";
3
- import { Markdown } from "../../tools/Markdown";
4
3
  import { useTermsMarkdown } from "../../login/lib/useDownloadTerms";
5
4
  import { getKcClsx } from "../../login/lib/kcClsx";
6
5
  export default function Register(props) {
@@ -16,12 +15,14 @@ export default function Register(props) {
16
15
  }
17
16
  function TermsAcceptance(props) {
18
17
  const { i18n, kcClsx, messagesPerField } = props;
19
- const { msg } = i18n;
20
- // NOTE: Refer to https://docs.keycloakify.dev/terms-and-conditions to load your terms and conditions.
21
- const { termsMarkdown } = useTermsMarkdown();
22
- if (termsMarkdown === undefined) {
18
+ const { msg, msgStr } = i18n;
19
+ return (_jsxs(_Fragment, { children: [_jsx("div", Object.assign({ className: "form-group" }, { children: _jsxs("div", Object.assign({ className: kcClsx("kcInputWrapperClass") }, { children: [msg("termsTitle"), _jsx("div", Object.assign({ id: "kc-registration-terms-text" }, { children: msgStr("termsText") ? msg("termsText") : _jsx(TermsMarkdown, {}) }))] })) })), _jsxs("div", Object.assign({ className: "form-group" }, { children: [_jsxs("div", Object.assign({ className: kcClsx("kcLabelWrapperClass") }, { children: [_jsx("input", { type: "checkbox", id: "termsAccepted", name: "termsAccepted", className: kcClsx("kcCheckboxInputClass"), "aria-invalid": messagesPerField.existsError("termsAccepted") }), _jsx("label", Object.assign({ htmlFor: "termsAccepted", className: kcClsx("kcLabelClass") }, { children: msg("acceptTerms") }))] })), messagesPerField.existsError("termsAccepted") && (_jsx("div", Object.assign({ className: kcClsx("kcLabelWrapperClass") }, { children: _jsx("span", Object.assign({ id: "input-error-terms-accepted", className: kcClsx("kcInputErrorMessageClass"), "aria-live": "polite" }, { children: messagesPerField.get("termsAccepted") })) })))] }))] }));
20
+ }
21
+ function TermsMarkdown() {
22
+ const { isDownloadComplete, termsMarkdown, ReactMarkdown } = useTermsMarkdown();
23
+ if (!isDownloadComplete) {
23
24
  return null;
24
25
  }
25
- return (_jsxs(_Fragment, { children: [_jsx("div", Object.assign({ className: "form-group" }, { children: _jsxs("div", Object.assign({ className: kcClsx("kcInputWrapperClass") }, { children: [msg("termsTitle"), _jsx("div", Object.assign({ id: "kc-registration-terms-text" }, { children: _jsx(Markdown, { children: termsMarkdown }) }))] })) })), _jsxs("div", Object.assign({ className: "form-group" }, { children: [_jsxs("div", Object.assign({ className: kcClsx("kcLabelWrapperClass") }, { children: [_jsx("input", { type: "checkbox", id: "termsAccepted", name: "termsAccepted", className: kcClsx("kcCheckboxInputClass"), "aria-invalid": messagesPerField.existsError("termsAccepted") }), _jsx("label", Object.assign({ htmlFor: "termsAccepted", className: kcClsx("kcLabelClass") }, { children: msg("acceptTerms") }))] })), messagesPerField.existsError("termsAccepted") && (_jsx("div", Object.assign({ className: kcClsx("kcLabelWrapperClass") }, { children: _jsx("span", Object.assign({ id: "input-error-terms-accepted", className: kcClsx("kcInputErrorMessageClass"), "aria-live": "polite" }, { children: messagesPerField.get("termsAccepted") })) })))] }))] }));
26
+ return _jsx(ReactMarkdown, { children: termsMarkdown });
26
27
  }
27
28
  //# sourceMappingURL=Register.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Register.js","sourceRoot":"","sources":["../../src/login/pages/Register.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Register.js","sourceRoot":"","sources":["../../src/login/pages/Register.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAC1E,OAAO,EAAE,SAAS,EAAe,MAAM,8BAA8B,CAAC;AAWtE,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,KAAoB;IACjD,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,OAAO,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,GAAG,KAAK,CAAC;IAExH,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;QACzB,eAAe;QACf,OAAO;KACV,CAAC,CAAC;IAEH,MAAM,EAAE,GAAG,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,GAAG,SAAS,CAAC;IAE1G,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAE7B,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAElE,OAAO,CACH,KAAC,QAAQ,kBACL,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,IAAI,EACV,eAAe,EAAE,eAAe,EAChC,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,GAAG,CAAC,eAAe,CAAC,EAChC,cAAc,EAAE,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,EACjD,qBAAqB,sBAErB,8BAAM,EAAE,EAAC,kBAAkB,EAAC,SAAS,EAAE,MAAM,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,kBAAkB,EAAE,MAAM,EAAC,MAAM,iBACvG,KAAC,qBAAqB,IAClB,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,EACd,8BAA8B,EAAE,oBAAoB,EACpD,yBAAyB,EAAE,yBAAyB,GACtD,EACD,uBAAuB,IAAI,KAAC,eAAe,IAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,gBAAgB,GAAI,EAC9G,iBAAiB,IAAI,CAClB,4BAAK,SAAS,EAAC,YAAY,gBACvB,4BAAK,SAAS,EAAE,MAAM,CAAC,qBAAqB,CAAC,gBACzC,cAAK,SAAS,EAAC,aAAa,eAAW,SAAS,kBAAe,gBAAgB,GAAQ,IACrF,IACJ,CACT,EACD,6BAAK,SAAS,EAAE,MAAM,CAAC,kBAAkB,CAAC,iBACtC,4BAAK,EAAE,EAAC,iBAAiB,EAAC,SAAS,EAAE,MAAM,CAAC,oBAAoB,CAAC,gBAC7D,4BAAK,SAAS,EAAE,MAAM,CAAC,2BAA2B,CAAC,gBAC/C,yBACI,0BAAG,IAAI,EAAE,GAAG,CAAC,QAAQ,gBAAG,GAAG,CAAC,aAAa,CAAC,IAAK,GAC5C,IACL,IACJ,EACN,4BAAK,EAAE,EAAC,iBAAiB,EAAC,SAAS,EAAE,MAAM,CAAC,oBAAoB,CAAC,gBAC7D,gBACI,QAAQ,EAAE,CAAC,iBAAiB,EAC5B,SAAS,EAAE,MAAM,CAAC,eAAe,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,oBAAoB,CAAC,EACtG,IAAI,EAAC,QAAQ,EACb,KAAK,EAAE,MAAM,CAAC,YAAY,CAAC,GAC7B,IACA,KACJ,KACH,IACA,CACd,CAAC;AACN,CAAC;AAED,SAAS,eAAe,CAAC,KAAmH;IACxI,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE,GAAG,KAAK,CAAC;IAEjD,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAE7B,OAAO,CACH,8BACI,4BAAK,SAAS,EAAC,YAAY,gBACvB,6BAAK,SAAS,EAAE,MAAM,CAAC,qBAAqB,CAAC,iBACxC,GAAG,CAAC,YAAY,CAAC,EAClB,4BAAK,EAAE,EAAC,4BAA4B,gBAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAC,aAAa,KAAG,IAAO,KACrG,IACJ,EACN,6BAAK,SAAS,EAAC,YAAY,iBACvB,6BAAK,SAAS,EAAE,MAAM,CAAC,qBAAqB,CAAC,iBACzC,gBACI,IAAI,EAAC,UAAU,EACf,EAAE,EAAC,eAAe,EAClB,IAAI,EAAC,eAAe,EACpB,SAAS,EAAE,MAAM,CAAC,sBAAsB,CAAC,kBAC3B,gBAAgB,CAAC,WAAW,CAAC,eAAe,CAAC,GAC7D,EACF,8BAAO,OAAO,EAAC,eAAe,EAAC,SAAS,EAAE,MAAM,CAAC,cAAc,CAAC,gBAC3D,GAAG,CAAC,aAAa,CAAC,IACf,KACN,EACL,gBAAgB,CAAC,WAAW,CAAC,eAAe,CAAC,IAAI,CAC9C,4BAAK,SAAS,EAAE,MAAM,CAAC,qBAAqB,CAAC,gBACzC,6BAAM,EAAE,EAAC,4BAA4B,EAAC,SAAS,EAAE,MAAM,CAAC,0BAA0B,CAAC,eAAY,QAAQ,gBAClG,gBAAgB,CAAC,GAAG,CAAC,eAAe,CAAC,IACnC,IACL,CACT,KACC,IACP,CACN,CAAC;AACN,CAAC;AAED,SAAS,aAAa;IAClB,MAAM,EAAE,kBAAkB,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,gBAAgB,EAAE,CAAC;IAEhF,IAAI,CAAC,kBAAkB,EAAE;QACrB,OAAO,IAAI,CAAC;KACf;IAED,OAAO,KAAC,aAAa,cAAE,aAAa,GAAiB,CAAC;AAC1D,CAAC"}
@@ -4,4 +4,4 @@ import type { KcContext } from "../KcContext";
4
4
  import type { I18n } from "../i18n";
5
5
  export default function Terms(props: PageProps<Extract<KcContext, {
6
6
  pageId: "terms.ftl";
7
- }>, I18n>): JSX.Element | null;
7
+ }>, I18n>): JSX.Element;
@@ -1,5 +1,4 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Markdown } from "../../tools/Markdown";
3
2
  import { getKcClsx } from "../../login/lib/kcClsx";
4
3
  import { useTermsMarkdown } from "../../login/lib/useDownloadTerms";
5
4
  export default function Terms(props) {
@@ -9,11 +8,14 @@ export default function Terms(props) {
9
8
  classes
10
9
  });
11
10
  const { msg, msgStr } = i18n;
12
- const { locale, url } = kcContext;
13
- const { isDownloadComplete, termsMarkdown, termsLanguageTag } = useTermsMarkdown();
11
+ const { url } = kcContext;
12
+ return (_jsxs(Template, Object.assign({ kcContext: kcContext, i18n: i18n, doUseDefaultCss: doUseDefaultCss, classes: classes, displayMessage: false, headerNode: msg("termsTitle") }, { children: [_jsx("div", Object.assign({ id: "kc-terms-text" }, { children: msgStr("termsText") ? msg("termsText") : _jsx(TermsMarkdown, {}) })), _jsxs("form", Object.assign({ className: "form-actions", action: url.loginAction, method: "POST" }, { children: [_jsx("input", { className: kcClsx("kcButtonClass", "kcButtonClass", "kcButtonClass", "kcButtonPrimaryClass", "kcButtonLargeClass"), name: "accept", id: "kc-accept", type: "submit", value: msgStr("doAccept") }), _jsx("input", { className: kcClsx("kcButtonClass", "kcButtonDefaultClass", "kcButtonLargeClass"), name: "cancel", id: "kc-decline", type: "submit", value: msgStr("doDecline") })] })), _jsx("div", { className: "clearfix" })] })));
13
+ }
14
+ function TermsMarkdown() {
15
+ const { isDownloadComplete, termsMarkdown, ReactMarkdown } = useTermsMarkdown();
14
16
  if (!isDownloadComplete) {
15
17
  return null;
16
18
  }
17
- return (_jsxs(Template, Object.assign({ kcContext: kcContext, i18n: i18n, doUseDefaultCss: doUseDefaultCss, classes: classes, displayMessage: false, headerNode: msg("termsTitle") }, { children: [_jsx("div", Object.assign({ id: "kc-terms-text", lang: termsLanguageTag !== (locale === null || locale === void 0 ? void 0 : locale.currentLanguageTag) ? termsLanguageTag : undefined }, { children: _jsx(Markdown, { children: termsMarkdown }) })), _jsxs("form", Object.assign({ className: "form-actions", action: url.loginAction, method: "POST" }, { children: [_jsx("input", { className: kcClsx("kcButtonClass", "kcButtonClass", "kcButtonClass", "kcButtonPrimaryClass", "kcButtonLargeClass"), name: "accept", id: "kc-accept", type: "submit", value: msgStr("doAccept") }), _jsx("input", { className: kcClsx("kcButtonClass", "kcButtonDefaultClass", "kcButtonLargeClass"), name: "cancel", id: "kc-decline", type: "submit", value: msgStr("doDecline") })] })), _jsx("div", { className: "clearfix" })] })));
19
+ return _jsx(ReactMarkdown, { children: termsMarkdown });
18
20
  }
19
21
  //# sourceMappingURL=Terms.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Terms.js","sourceRoot":"","sources":["../../src/login/pages/Terms.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAK1E,MAAM,CAAC,OAAO,UAAU,KAAK,CAAC,KAAmE;IAC7F,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAEtE,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;QACzB,eAAe;QACf,OAAO;KACV,CAAC,CAAC;IAEH,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAE7B,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,SAAS,CAAC;IAElC,MAAM,EAAE,kBAAkB,EAAE,aAAa,EAAE,gBAAgB,EAAE,GAAG,gBAAgB,EAAE,CAAC;IAEnF,IAAI,CAAC,kBAAkB,EAAE;QACrB,OAAO,IAAI,CAAC;KACf;IAED,OAAO,CACH,MAAC,QAAQ,kBACL,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,IAAI,EACV,eAAe,EAAE,eAAe,EAChC,OAAO,EAAE,OAAO,EAChB,cAAc,EAAE,KAAK,EACrB,UAAU,EAAE,GAAG,CAAC,YAAY,CAAC,iBAE7B,4BAAK,EAAE,EAAC,eAAe,EAAC,IAAI,EAAE,gBAAgB,MAAK,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,kBAAkB,CAAA,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,gBACxG,KAAC,QAAQ,cAAE,aAAa,GAAY,IAClC,EACN,8BAAM,SAAS,EAAC,cAAc,EAAC,MAAM,EAAE,GAAG,CAAC,WAAW,EAAE,MAAM,EAAC,MAAM,iBACjE,gBACI,SAAS,EAAE,MAAM,CAAC,eAAe,EAAE,eAAe,EAAE,eAAe,EAAE,sBAAsB,EAAE,oBAAoB,CAAC,EAClH,IAAI,EAAC,QAAQ,EACb,EAAE,EAAC,WAAW,EACd,IAAI,EAAC,QAAQ,EACb,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,GAC3B,EACF,gBACI,SAAS,EAAE,MAAM,CAAC,eAAe,EAAE,sBAAsB,EAAE,oBAAoB,CAAC,EAChF,IAAI,EAAC,QAAQ,EACb,EAAE,EAAC,YAAY,EACf,IAAI,EAAC,QAAQ,EACb,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,GAC5B,KACC,EACP,cAAK,SAAS,EAAC,UAAU,GAAG,KACrB,CACd,CAAC;AACN,CAAC"}
1
+ {"version":3,"file":"Terms.js","sourceRoot":"","sources":["../../src/login/pages/Terms.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAK1E,MAAM,CAAC,OAAO,UAAU,KAAK,CAAC,KAAmE;IAC7F,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAEtE,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;QACzB,eAAe;QACf,OAAO;KACV,CAAC,CAAC;IAEH,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAE7B,MAAM,EAAE,GAAG,EAAE,GAAG,SAAS,CAAC;IAE1B,OAAO,CACH,MAAC,QAAQ,kBACL,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,IAAI,EACV,eAAe,EAAE,eAAe,EAChC,OAAO,EAAE,OAAO,EAChB,cAAc,EAAE,KAAK,EACrB,UAAU,EAAE,GAAG,CAAC,YAAY,CAAC,iBAE7B,4BAAK,EAAE,EAAC,eAAe,gBAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAC,aAAa,KAAG,IAAO,EAC1F,8BAAM,SAAS,EAAC,cAAc,EAAC,MAAM,EAAE,GAAG,CAAC,WAAW,EAAE,MAAM,EAAC,MAAM,iBACjE,gBACI,SAAS,EAAE,MAAM,CAAC,eAAe,EAAE,eAAe,EAAE,eAAe,EAAE,sBAAsB,EAAE,oBAAoB,CAAC,EAClH,IAAI,EAAC,QAAQ,EACb,EAAE,EAAC,WAAW,EACd,IAAI,EAAC,QAAQ,EACb,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,GAC3B,EACF,gBACI,SAAS,EAAE,MAAM,CAAC,eAAe,EAAE,sBAAsB,EAAE,oBAAoB,CAAC,EAChF,IAAI,EAAC,QAAQ,EACb,EAAE,EAAC,YAAY,EACf,IAAI,EAAC,QAAQ,EACb,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,GAC5B,KACC,EACP,cAAK,SAAS,EAAC,UAAU,GAAG,KACrB,CACd,CAAC;AACN,CAAC;AAED,SAAS,aAAa;IAClB,MAAM,EAAE,kBAAkB,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,gBAAgB,EAAE,CAAC;IAEhF,IAAI,CAAC,kBAAkB,EAAE;QACrB,OAAO,IAAI,CAAC;KACf;IAED,OAAO,KAAC,aAAa,cAAE,aAAa,GAAiB,CAAC;AAC1D,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "keycloakify",
3
- "version": "10.0.0-rc.77",
3
+ "version": "10.0.0-rc.79",
4
4
  "description": "Create Keycloak themes using React",
5
5
  "repository": {
6
6
  "type": "git",
@@ -136,6 +136,9 @@
136
136
  "account/i18n/index.d.ts",
137
137
  "account/i18n/index.js",
138
138
  "account/i18n/index.js.map",
139
+ "account/i18n/useI18n.d.ts",
140
+ "account/i18n/useI18n.js",
141
+ "account/i18n/useI18n.js.map",
139
142
  "account/index.d.ts",
140
143
  "account/index.js",
141
144
  "account/index.js.map",
@@ -289,6 +292,9 @@
289
292
  "login/i18n/index.d.ts",
290
293
  "login/i18n/index.js",
291
294
  "login/i18n/index.js.map",
295
+ "login/i18n/useI18n.d.ts",
296
+ "login/i18n/useI18n.js",
297
+ "login/i18n/useI18n.js.map",
292
298
  "login/index.d.ts",
293
299
  "login/index.js",
294
300
  "login/index.js.map",
@@ -444,6 +450,7 @@
444
450
  "src/account/i18n/baseMessages/zh-CN.ts",
445
451
  "src/account/i18n/i18n.tsx",
446
452
  "src/account/i18n/index.ts",
453
+ "src/account/i18n/useI18n.ts",
447
454
  "src/account/index.ts",
448
455
  "src/account/lib/kcClsx.ts",
449
456
  "src/account/pages/Account.tsx",
@@ -572,9 +579,10 @@
572
579
  "src/login/i18n/baseMessages/zh-CN.ts",
573
580
  "src/login/i18n/i18n.tsx",
574
581
  "src/login/i18n/index.ts",
582
+ "src/login/i18n/useI18n.ts",
575
583
  "src/login/index.ts",
576
584
  "src/login/lib/kcClsx.ts",
577
- "src/login/lib/useDownloadTerms.ts",
585
+ "src/login/lib/useDownloadTerms.tsx",
578
586
  "src/login/lib/useUserProfileForm.tsx",
579
587
  "src/login/pages/Code.tsx",
580
588
  "src/login/pages/DeleteAccountConfirm.tsx",
@@ -616,7 +624,6 @@
616
624
  "src/tools/ExtractAfterStartingWith.ts",
617
625
  "src/tools/HTMLElement.prototype.prepend.ts",
618
626
  "src/tools/LazyOrNot.ts",
619
- "src/tools/Markdown.ts",
620
627
  "src/tools/Object.fromEntries.ts",
621
628
  "src/tools/StatefulObservable/README.md",
622
629
  "src/tools/StatefulObservable/StatefulObservable.ts",
@@ -632,6 +639,7 @@
632
639
  "src/tools/emailRegExp.ts",
633
640
  "src/tools/formatNumber.ts",
634
641
  "src/tools/pathBasename.ts",
642
+ "src/tools/react-markdown.ts",
635
643
  "src/tools/structuredCloneButFunctions.ts",
636
644
  "src/tools/useConst.ts",
637
645
  "src/tools/useConstCallback.ts",
@@ -699,9 +707,6 @@
699
707
  "tools/LazyOrNot.d.ts",
700
708
  "tools/LazyOrNot.js",
701
709
  "tools/LazyOrNot.js.map",
702
- "tools/Markdown.d.ts",
703
- "tools/Markdown.js",
704
- "tools/Markdown.js.map",
705
710
  "tools/Object.fromEntries.d.ts",
706
711
  "tools/Object.fromEntries.js",
707
712
  "tools/Object.fromEntries.js.map",
@@ -744,6 +749,9 @@
744
749
  "tools/pathBasename.d.ts",
745
750
  "tools/pathBasename.js",
746
751
  "tools/pathBasename.js.map",
752
+ "tools/react-markdown.d.ts",
753
+ "tools/react-markdown.js",
754
+ "tools/react-markdown.js.map",
747
755
  "tools/structuredCloneButFunctions.d.ts",
748
756
  "tools/structuredCloneButFunctions.js",
749
757
  "tools/structuredCloneButFunctions.js.map",
@@ -824,7 +832,7 @@
824
832
  "react": "*"
825
833
  },
826
834
  "dependencies": {
827
- "react-markdown": "^5.0.3",
835
+ "react-markdown": "^9.0.1",
828
836
  "tsafe": "^1.6.6"
829
837
  },
830
838
  "devDependencies": {
@@ -13,7 +13,7 @@ export default function Template(props: TemplateProps<KcContext, I18n>) {
13
13
 
14
14
  const { kcClsx } = getKcClsx({ doUseDefaultCss, classes });
15
15
 
16
- const { msg, msgStr, getChangeLocalUrl, labelBySupportedLanguageTag, currentLanguageTag } = i18n;
16
+ const { msg, msgStr, getChangeLocaleUrl, labelBySupportedLanguageTag, currentLanguageTag } = i18n;
17
17
 
18
18
  const { locale, url, features, realm, message, referrer } = kcContext;
19
19
 
@@ -79,7 +79,7 @@ export default function Template(props: TemplateProps<KcContext, I18n>) {
79
79
  <ul>
80
80
  {locale.supported.map(({ languageTag }) => (
81
81
  <li key={languageTag} className="kc-dropdown-item">
82
- <a href={getChangeLocalUrl(languageTag)}>{labelBySupportedLanguageTag[languageTag]}</a>
82
+ <a href={getChangeLocaleUrl(languageTag)}>{labelBySupportedLanguageTag[languageTag]}</a>
83
83
  </li>
84
84
  ))}
85
85
  </ul>
@@ -1,10 +1,8 @@
1
1
  import "keycloakify/tools/Object.fromEntries";
2
- import { useEffect, useState } from "react";
3
2
  import { assert } from "tsafe/assert";
4
3
  import messages_fallbackLanguage from "./baseMessages/en";
5
4
  import { getMessages } from "./baseMessages";
6
5
  import type { KcContext } from "../KcContext";
7
- import { Reflect } from "tsafe/Reflect";
8
6
 
9
7
  export const fallbackLanguageTag = "en";
10
8
 
@@ -30,7 +28,7 @@ export type GenericI18n<MessageKey extends string> = {
30
28
  * Redirect to this url to change the language.
31
29
  * After reload currentLanguageTag === newLanguageTag
32
30
  */
33
- getChangeLocalUrl: (newLanguageTag: string) => string;
31
+ getChangeLocaleUrl: (newLanguageTag: string) => string;
34
32
  /**
35
33
  * e.g. "en" => "English", "fr" => "Français", ...
36
34
  *
@@ -88,7 +86,9 @@ export type GenericI18n<MessageKey extends string> = {
88
86
  isFetchingTranslations: boolean;
89
87
  };
90
88
 
91
- function createGetI18n<ExtraMessageKey extends string = never>(extraMessages: { [languageTag: string]: { [key in ExtraMessageKey]: string } }) {
89
+ export function createGetI18n<ExtraMessageKey extends string = never>(messageBundle: {
90
+ [languageTag: string]: { [key in ExtraMessageKey]: string };
91
+ }) {
92
92
  type I18n = GenericI18n<MessageKey | ExtraMessageKey>;
93
93
 
94
94
  type Result = { i18n: I18n; prI18n_currentLanguage: Promise<I18n> | undefined };
@@ -108,9 +108,9 @@ function createGetI18n<ExtraMessageKey extends string = never>(extraMessages: {
108
108
  return cachedResult;
109
109
  }
110
110
 
111
- const partialI18n: Pick<I18n, "currentLanguageTag" | "getChangeLocalUrl" | "labelBySupportedLanguageTag"> = {
111
+ const partialI18n: Pick<I18n, "currentLanguageTag" | "getChangeLocaleUrl" | "labelBySupportedLanguageTag"> = {
112
112
  currentLanguageTag: kcContext.locale?.currentLanguageTag ?? fallbackLanguageTag,
113
- getChangeLocalUrl: newLanguageTag => {
113
+ getChangeLocaleUrl: newLanguageTag => {
114
114
  const { locale } = kcContext;
115
115
 
116
116
  assert(locale !== undefined, "Internationalization not enabled");
@@ -126,8 +126,8 @@ function createGetI18n<ExtraMessageKey extends string = never>(extraMessages: {
126
126
 
127
127
  const { createI18nTranslationFunctions } = createI18nTranslationFunctionsFactory<MessageKey, ExtraMessageKey>({
128
128
  messages_fallbackLanguage,
129
- extraMessages_fallbackLanguage: extraMessages[fallbackLanguageTag],
130
- extraMessages: extraMessages[partialI18n.currentLanguageTag]
129
+ messageBundle_fallbackLanguage: messageBundle[fallbackLanguageTag],
130
+ messageBundle_currentLanguage: messageBundle[partialI18n.currentLanguageTag]
131
131
  });
132
132
 
133
133
  const isCurrentLanguageFallbackLanguage = partialI18n.currentLanguageTag === fallbackLanguageTag;
@@ -135,17 +135,19 @@ function createGetI18n<ExtraMessageKey extends string = never>(extraMessages: {
135
135
  const result: Result = {
136
136
  i18n: {
137
137
  ...partialI18n,
138
- ...createI18nTranslationFunctions({ messages: undefined }),
138
+ ...createI18nTranslationFunctions({
139
+ messages_currentLanguage: isCurrentLanguageFallbackLanguage ? messages_fallbackLanguage : undefined
140
+ }),
139
141
  isFetchingTranslations: !isCurrentLanguageFallbackLanguage
140
142
  },
141
143
  prI18n_currentLanguage: isCurrentLanguageFallbackLanguage
142
144
  ? undefined
143
145
  : (async () => {
144
- const messages = await getMessages(partialI18n.currentLanguageTag);
146
+ const messages_currentLanguage = await getMessages(partialI18n.currentLanguageTag);
145
147
 
146
148
  const i18n_currentLanguage: I18n = {
147
149
  ...partialI18n,
148
- ...createI18nTranslationFunctions({ messages }),
150
+ ...createI18nTranslationFunctions({ messages_currentLanguage }),
149
151
  isFetchingTranslations: false
150
152
  };
151
153
 
@@ -168,66 +170,30 @@ function createGetI18n<ExtraMessageKey extends string = never>(extraMessages: {
168
170
  return { getI18n };
169
171
  }
170
172
 
171
- export function createUseI18n<ExtraMessageKey extends string = never>(extraMessages: {
172
- [languageTag: string]: { [key in ExtraMessageKey]: string };
173
- }) {
174
- type I18n = GenericI18n<MessageKey | ExtraMessageKey>;
175
-
176
- const { getI18n } = createGetI18n(extraMessages);
177
-
178
- function useI18n(params: { kcContext: KcContextLike }): { i18n: I18n } {
179
- const { kcContext } = params;
180
-
181
- const { i18n, prI18n_currentLanguage } = getI18n({ kcContext });
182
-
183
- const [i18n_toReturn, setI18n_toReturn] = useState<I18n>(i18n);
184
-
185
- useEffect(() => {
186
- let isActive = true;
187
-
188
- prI18n_currentLanguage?.then(i18n => {
189
- if (!isActive) {
190
- return;
191
- }
192
-
193
- setI18n_toReturn(i18n);
194
- });
195
-
196
- return () => {
197
- isActive = false;
198
- };
199
- }, []);
200
-
201
- return { i18n: i18n_toReturn };
202
- }
203
-
204
- return { useI18n, ofTypeI18n: Reflect<I18n>() };
205
- }
206
-
207
173
  function createI18nTranslationFunctionsFactory<MessageKey extends string, ExtraMessageKey extends string>(params: {
208
174
  messages_fallbackLanguage: Record<MessageKey, string>;
209
- extraMessages_fallbackLanguage: Record<ExtraMessageKey, string> | undefined;
210
- extraMessages: Partial<Record<ExtraMessageKey, string>> | undefined;
175
+ messageBundle_fallbackLanguage: Record<ExtraMessageKey, string> | undefined;
176
+ messageBundle_currentLanguage: Partial<Record<ExtraMessageKey, string>> | undefined;
211
177
  }) {
212
- const { extraMessages } = params;
178
+ const { messageBundle_currentLanguage } = params;
213
179
 
214
180
  const messages_fallbackLanguage = {
215
181
  ...params.messages_fallbackLanguage,
216
- ...params.extraMessages_fallbackLanguage
182
+ ...params.messageBundle_fallbackLanguage
217
183
  };
218
184
 
219
185
  function createI18nTranslationFunctions(params: {
220
- messages: Partial<Record<MessageKey, string>> | undefined;
186
+ messages_currentLanguage: Partial<Record<MessageKey, string>> | undefined;
221
187
  }): Pick<GenericI18n<MessageKey | ExtraMessageKey>, "msg" | "msgStr" | "advancedMsg" | "advancedMsgStr"> {
222
- const messages = {
223
- ...params.messages,
224
- ...extraMessages
188
+ const messages_currentLanguage = {
189
+ ...params.messages_currentLanguage,
190
+ ...messageBundle_currentLanguage
225
191
  };
226
192
 
227
193
  function resolveMsg(props: { key: string; args: (string | undefined)[]; doRenderAsHtml: boolean }): string | JSX.Element | undefined {
228
194
  const { key, args, doRenderAsHtml } = props;
229
195
 
230
- const messageOrUndefined: string | undefined = (messages as any)[key] ?? (messages_fallbackLanguage as any)[key];
196
+ const messageOrUndefined: string | undefined = (messages_currentLanguage as any)[key] ?? (messages_fallbackLanguage as any)[key];
231
197
 
232
198
  if (messageOrUndefined === undefined) {
233
199
  return undefined;
@@ -1,5 +1,5 @@
1
1
  import type { GenericI18n, MessageKey, KcContextLike } from "./i18n";
2
2
  export type { MessageKey, KcContextLike };
3
3
  export type I18n = GenericI18n<MessageKey>;
4
- export { createUseI18n } from "./i18n";
4
+ export { createUseI18n } from "./useI18n";
5
5
  export { fallbackLanguageTag } from "./i18n";
@@ -0,0 +1,44 @@
1
+ import { useEffect, useState } from "react";
2
+ import {
3
+ createGetI18n,
4
+ type GenericI18n,
5
+ type MessageKey,
6
+ type KcContextLike
7
+ } from "./i18n";
8
+ import { Reflect } from "tsafe/Reflect";
9
+
10
+ export function createUseI18n<ExtraMessageKey extends string = never>(extraMessages: {
11
+ [languageTag: string]: { [key in ExtraMessageKey]: string };
12
+ }) {
13
+ type I18n = GenericI18n<MessageKey | ExtraMessageKey>;
14
+
15
+ const { getI18n } = createGetI18n(extraMessages);
16
+
17
+ function useI18n(params: { kcContext: KcContextLike }): { i18n: I18n } {
18
+ const { kcContext } = params;
19
+
20
+ const { i18n, prI18n_currentLanguage } = getI18n({ kcContext });
21
+
22
+ const [i18n_toReturn, setI18n_toReturn] = useState<I18n>(i18n);
23
+
24
+ useEffect(() => {
25
+ let isActive = true;
26
+
27
+ prI18n_currentLanguage?.then(i18n => {
28
+ if (!isActive) {
29
+ return;
30
+ }
31
+
32
+ setI18n_toReturn(i18n);
33
+ });
34
+
35
+ return () => {
36
+ isActive = false;
37
+ };
38
+ }, []);
39
+
40
+ return { i18n: i18n_toReturn };
41
+ }
42
+
43
+ return { useI18n, ofTypeI18n: Reflect<I18n>() };
44
+ }
@@ -8,8 +8,7 @@ import { assert } from "tsafe/assert";
8
8
  import {
9
9
  type ThemeType,
10
10
  basenameOfTheKeycloakifyResourcesDir,
11
- resources_common,
12
- nameOfTheLocalizationRealmOverridesUserProfileProperty
11
+ resources_common
13
12
  } from "../../shared/constants";
14
13
  import { getThisCodebaseRootDirPath } from "../../tools/getThisCodebaseRootDirPath";
15
14
 
@@ -119,10 +118,6 @@ export function generateFtlFilesCodeFactory(params: {
119
118
  .replace("KEYCLOAKIFY_THEME_TYPE_dExKd3xEdr", themeType)
120
119
  .replace("KEYCLOAKIFY_THEME_NAME_cXxKd3xEer", themeName)
121
120
  .replace("RESOURCES_COMMON_cLsLsMrtDkpVv", resources_common)
122
- .replace(
123
- "lOCALIZATION_REALM_OVERRIDES_USER_PROFILE_PROPERTY_KEY_aaGLsPgGIdeeX",
124
- nameOfTheLocalizationRealmOverridesUserProfileProperty
125
- )
126
121
  .replace(
127
122
  "USER_DEFINED_EXCLUSIONS_eKsaY4ZsZ4eMr2",
128
123
  buildContext.kcContextExclusionsFtlCode ?? ""
@@ -33,8 +33,9 @@ kcContext.pageId = "${pageId}";
33
33
  if( kcContext.url && kcContext.url.resourcesPath ){
34
34
  kcContext.url.resourcesCommonPath = kcContext.url.resourcesPath + "/" + "RESOURCES_COMMON_cLsLsMrtDkpVv";
35
35
  }
36
+ kcContext["x-keycloakify"] = {};
36
37
  <#if profile?? && profile.attributes??>
37
- kcContext.lOCALIZATION_REALM_OVERRIDES_USER_PROFILE_PROPERTY_KEY_aaGLsPgGIdeeX = {
38
+ kcContext["x-keycloakify"].realmMessageBundleUserProfile = {
38
39
  <#list profile.attributes as attribute>
39
40
  <#if attribute.annotations?? && attribute.displayName??>
40
41
  "${attribute.displayName}": decodeHtmlEntities("${advancedMsg(attribute.displayName)?js_string}"),
@@ -61,6 +62,9 @@ if( kcContext.url && kcContext.url.resourcesPath ){
61
62
  </#list>
62
63
  };
63
64
  </#if>
65
+ <#if pageId == "terms.ftl" || termsAcceptanceRequired?? && termsAcceptanceRequired>
66
+ kcContext["x-keycloakify"].realmMessageBundleTermsText= decodeHtmlEntities("${msg("termsText")?js_string}");
67
+ </#if>
64
68
  attributes_to_attributesByName: {
65
69
  if( !kcContext.profile ){
66
70
  break attributes_to_attributesByName;
@@ -198,6 +202,9 @@ function decodeHtmlEntities(htmlStr){
198
202
  ) || (
199
203
  key == "execution" &&
200
204
  are_same_path(path, [])
205
+ ) || (
206
+ key == "entity" &&
207
+ are_same_path(path, ["user"])
201
208
  )
202
209
  >
203
210
  <#-- <#local out_seq += ["/*" + path?join(".") + "." + key + " excluded*/"]> -->
@@ -9,6 +9,8 @@ import * as babelParser from "@babel/parser";
9
9
  import babelGenerate from "@babel/generator";
10
10
  import * as babelTypes from "@babel/types";
11
11
  import { escapeStringForPropertiesFile } from "../../tools/escapeStringForPropertiesFile";
12
+ import { getThisCodebaseRootDirPath } from "../../tools/getThisCodebaseRootDirPath";
13
+ import * as fs from "fs";
12
14
 
13
15
  export function generateMessageProperties(params: {
14
16
  themeSrcDirPath: string;
@@ -39,10 +41,6 @@ export function generateMessageProperties(params: {
39
41
  readFileSync(file).toString("utf8").includes("createUseI18n")
40
42
  );
41
43
 
42
- if (files.length === 0) {
43
- return [];
44
- }
45
-
46
44
  const extraMessages = files
47
45
  .map(file => {
48
46
  const root = recast.parse(readFileSync(file).toString("utf8"), {
@@ -99,15 +97,28 @@ export function generateMessageProperties(params: {
99
97
  return extraMessages;
100
98
  });
101
99
 
102
- const languageTags = extraMessages
103
- .map(extraMessage => Object.keys(extraMessage))
104
- .flat()
105
- .reduce(...removeDuplicates<string>());
100
+ const languageTags = [
101
+ ...extraMessages.map(extraMessage => Object.keys(extraMessage)).flat(),
102
+ ...fs
103
+ .readdirSync(
104
+ pathJoin(
105
+ getThisCodebaseRootDirPath(),
106
+ "src",
107
+ themeType,
108
+ "i18n",
109
+ "baseMessages"
110
+ )
111
+ )
112
+ .filter(baseName => baseName !== "index.ts")
113
+ .map(baseName => baseName.replace(/\.ts$/, ""))
114
+ ].reduce(...removeDuplicates<string>());
106
115
 
107
116
  const keyValueMapByLanguageTag: Record<string, Record<string, string>> = {};
108
117
 
109
118
  for (const languageTag of languageTags) {
110
- const keyValueMap: Record<string, string> = {};
119
+ const keyValueMap: Record<string, string> = {
120
+ termsText: ""
121
+ };
111
122
 
112
123
  for (const extraMessage of extraMessages) {
113
124
  const keyValueMap_i = extraMessage[languageTag];
@@ -152,14 +163,9 @@ export function generateMessageProperties(params: {
152
163
 
153
164
  out.push({
154
165
  languageTag,
155
- propertiesFileSource: [
156
- "# This file was generated by keycloakify",
157
- "",
158
- "parent=base",
159
- "",
160
- propertiesFileSource,
161
- ""
162
- ].join("\n")
166
+ propertiesFileSource: ["", "parent=base", "", propertiesFileSource, ""].join(
167
+ "\n"
168
+ )
163
169
  });
164
170
  }
165
171
 
@@ -1,5 +1,3 @@
1
- export const nameOfTheLocalizationRealmOverridesUserProfileProperty =
2
- "__localizationRealmOverridesUserProfile";
3
1
  export const keycloak_resources = "keycloak-resources";
4
2
  export const resources_common = "resources-common";
5
3
  export const lastKeycloakVersionWithAccountV1 = "21.1.2";