11import React , {
2- Context ,
32 createContext ,
43 useContext ,
54 useMemo ,
@@ -21,7 +20,7 @@ import {
2120 * Create i18n provider with given methods.
2221 * @param methods - I18n methods.
2322 * @param config - Default config.
24- * @returns Provider.
23+ * @returns Provider, context, and hook .
2524 */
2625export function createI18nProvider <
2726 TMethods extends I18nMethods = I18nMethods
@@ -33,15 +32,12 @@ export function createI18nProvider<
3332 const I18nContext = createContext < I18nContextPayload < TMethods > > ( null ) ;
3433 const useI18nParentInstance = ( {
3534 context
36- } : I18nProviderProps ) => {
35+ } : Partial < I18nProviderProps > ) => {
3736 const parentContext = useContext ( I18nContext ) ;
3837
3938 return context || parentContext && parentContext . config ;
4039 } ;
41- const I18nProvider = memo ( ( props : I18nProviderProps ) => {
42- const {
43- children
44- } = props ;
40+ const useI18nContextPayload = ( props : Partial < I18nProviderProps > ) => {
4541 const i18nParentInstance = useI18nParentInstance ( props ) ;
4642 const instanceProps = i18nParentInstance ? props : { ...config , ...props } ;
4743 const i18nInstance = useI18nInstance ( instanceProps , i18nParentInstance ) ;
@@ -50,29 +46,47 @@ export function createI18nProvider<
5046 [ i18nInstance ]
5147 ) ;
5248
49+ return payload ;
50+ } ;
51+ const I18nProvider = memo ( ( props : I18nProviderProps ) => {
52+ const {
53+ children
54+ } = props ;
55+ const payload = useI18nContextPayload ( props ) ;
56+
5357 return (
5458 < I18nContext . Provider value = { payload } >
5559 { children }
5660 </ I18nContext . Provider >
5761 ) ;
5862 } ) ;
63+ const useI18n = ( config ?: I18nProviderConfig ) => {
64+ const withConfigRef = useRef ( Boolean ( config ) ) ;
65+
66+ if ( withConfigRef . current ) {
67+ return useI18nContextPayload ( config ) ;
68+ }
69+
70+ return useContext ( I18nContext ) ;
71+ } ;
5972
6073 return {
74+ /**
75+ * Config and methods provider.
76+ */
6177 I18nProvider,
62- I18nContext
78+ /**
79+ * Context with config and methods.
80+ */
81+ I18nContext,
82+ /**
83+ * Hook to recieve config and methods.
84+ */
85+ useI18n
6386 } ;
6487}
6588
66- /**
67- * Create i18n hook from given context.
68- * @param context - I18n context.
69- * @returns Hook function.
70- */
71- export function createI18nHook < T extends I18nMethods > ( context : Context < I18nContextPayload < T > > ) {
72- return ( ) => useContext ( context ) ;
73- }
74-
75- function useI18nInstance ( props : I18nProviderProps , i18nParentInstance : I18nConfigInstance ) {
89+ function useI18nInstance ( props : Partial < I18nProviderProps > , i18nParentInstance : I18nConfigInstance ) {
7690 const {
7791 locale,
7892 locales,
@@ -123,7 +137,7 @@ function createI18nInstance(
123137 context,
124138 children,
125139 ...config
126- } : I18nProviderProps ,
140+ } : Partial < I18nProviderProps > ,
127141 i18nParentInstance : I18nConfigInstance
128142) {
129143 const configWithLocale = typeof locale === 'string'
0 commit comments