Skip to content

Commit 2a911f1

Browse files
committed
Update i18n so that we can return React component
1 parent f0a98df commit 2a911f1

File tree

2 files changed

+26
-17
lines changed

2 files changed

+26
-17
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@
163163
"./Footer": "./dist/Footer.js",
164164
"./Download": "./dist/Download.js",
165165
"./Display": "./dist/Display.js",
166+
"./ConsentBannerNext": "./dist/ConsentBannerNext/index.js",
166167
"./ConsentBanner": "./dist/ConsentBanner/index.js",
167168
"./Checkbox": "./dist/Checkbox.js",
168169
"./Card": "./dist/Card.js",

src/i18n.tsx renamed to src/i18n.ts

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
import { type ReactNode, useMemo } from "react";
1+
import { useMemo } from "react";
2+
3+
type ReactNode = string | JSX.Element | null;
24

35
function getLanguageBestApprox<Language extends string>(params: {
46
languages: readonly Language[];
@@ -31,31 +33,37 @@ function getLanguageBestApprox<Language extends string>(params: {
3133
return undefined;
3234
}
3335

34-
type Message = NonNullable<ReactNode> | ((params: any) => NonNullable<ReactNode>);
35-
type Messages = Record<string, Message>;
36-
37-
type FrMessagesToTranslationFunction<FrMessages extends Messages> = {
38-
(messageKey: NonFunctionMessageKey<FrMessages>): string;
36+
type FrMessagesToTranslationFunction<
37+
FrMessages extends Record<string, ReactNode | ((params: any) => ReactNode)>
38+
> = {
39+
<K extends NonFunctionMessageKey<FrMessages>>(messageKey: K): FrMessages[K] extends (
40+
params: any
41+
) => infer R
42+
? R
43+
: FrMessages[K];
44+
} & {
3945
<K extends FunctionMessageKey<FrMessages>>(
4046
messageKey: K,
4147
params: ExtractArgument<FrMessages[K]>
42-
): string;
48+
): FrMessages[K] extends (params: any) => infer R ? R : FrMessages[K];
4349
};
4450

45-
type ExtractArgument<TMessage extends Message> = TMessage extends (
51+
type ExtractArgument<Message extends ReactNode | ((params: any) => ReactNode)> = Message extends (
4652
params: any
47-
) => Exclude<Message, string>
48-
? Parameters<TMessage>[0]
53+
) => any
54+
? Parameters<Message>[0]
4955
: never;
5056

51-
type NonFunctionMessageKey<FrMessages extends Messages> = {
52-
[Key in keyof FrMessages]: FrMessages[Key] extends string ? Key : never;
57+
type NonFunctionMessageKey<
58+
FrMessages extends Record<string, ReactNode | ((params: any) => ReactNode)>
59+
> = {
60+
[Key in keyof FrMessages]: FrMessages[Key] extends (params: any) => any ? never : Key;
61+
//[Key in keyof FrMessages]: FrMessages[Key] extends "accept all" ? "accept all" : never;
5362
}[keyof FrMessages];
5463

55-
type FunctionMessageKey<FrMessages extends Messages> = Exclude<
56-
keyof FrMessages,
57-
NonFunctionMessageKey<FrMessages>
58-
>;
64+
type FunctionMessageKey<
65+
FrMessages extends Record<string, ReactNode | ((params: any) => ReactNode)>
66+
> = Exclude<keyof FrMessages, NonFunctionMessageKey<FrMessages>>;
5967

6068
let useLang: () => string = () => "fr";
6169

@@ -65,7 +73,7 @@ export function setUseLang(params: { useLang: () => string }) {
6573

6674
export function createComponentI18nApi<
6775
ComponentName extends string,
68-
FrMessages extends Messages
76+
FrMessages extends Record<string, ReactNode | ((params: any) => ReactNode)>
6977
>(params: {
7078
componentName: ComponentName;
7179
frMessages: FrMessages;

0 commit comments

Comments
 (0)