1- import { type ReactNode , useMemo } from "react" ;
1+ import { useMemo } from "react" ;
2+
3+ type ReactNode = string | JSX . Element | null ;
24
35function 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
6068let useLang : ( ) => string = ( ) => "fr" ;
6169
@@ -65,7 +73,7 @@ export function setUseLang(params: { useLang: () => string }) {
6573
6674export 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