keycloak_theme/src/lib/i18n/useKcMessage.tsx

51 lines
1.5 KiB
TypeScript
Raw Normal View History

2021-04-08 17:06:09 +02:00
import { useCallback, useReducer } from "react";
2021-03-02 23:48:31 +01:00
import { useKcLanguageTag } from "./useKcLanguageTag";
2021-04-08 17:06:09 +02:00
import { kcMessages, evtTermsUpdated } from "./kcMessages/login";
2021-03-01 20:45:37 +01:00
import type { ReactNode } from "react";
2021-04-08 17:06:09 +02:00
import { useEvt } from "evt/hooks";
2021-04-09 03:25:39 +02:00
//NOTE for later: https://github.com/remarkjs/react-markdown/blob/236182ecf30bd89c1e5a7652acaf8d0bf81e6170/src/renderers.js#L7-L35
import ReactMarkdown from "react-markdown";
2021-04-08 17:06:09 +02:00
export type MessageKey = keyof typeof kcMessages["en"];
2021-03-07 15:37:37 +01:00
export function useKcMessage() {
2021-03-02 23:48:31 +01:00
const { kcLanguageTag } = useKcLanguageTag();
2021-04-08 17:06:09 +02:00
const [trigger, forceUpdate] = useReducer((counter: number) => counter + 1, 0);
useEvt(ctx => evtTermsUpdated.attach(ctx, forceUpdate), []);
const msgStr = useCallback(
2021-03-02 22:48:36 +01:00
(key: MessageKey, ...args: (string | undefined)[]): string => {
2021-04-08 17:06:09 +02:00
let str: string = kcMessages[kcLanguageTag as any as "en"][key] ?? kcMessages["en"][key];
2021-03-01 20:45:37 +01:00
args.forEach((arg, i) => {
if (arg === undefined) {
return;
}
2021-03-02 22:48:36 +01:00
str = str.replace(new RegExp(`\\{${i}\\}`, "g"), arg);
2021-03-01 20:45:37 +01:00
});
2021-03-02 22:48:36 +01:00
return str;
},
2021-04-08 17:06:09 +02:00
[kcLanguageTag, trigger]
);
2021-04-08 15:41:40 +02:00
const msg = useCallback<(...args: Parameters<typeof msgStr>) => ReactNode>(
(key, ...args) =>
2021-04-09 03:25:39 +02:00
<ReactMarkdown allowDangerousHtml renderers={key === "termsText" ? undefined : { "paragraph": "span" }}>
{msgStr(key, ...args)}
</ReactMarkdown>,
[msgStr]
2021-03-02 22:48:36 +01:00
);
2021-03-07 15:37:37 +01:00
return { msg, msgStr };
}