import React, { useEffect, useState } from 'react'; import PropTypes from 'prop-types'; import TContext from './TContext'; import { resolveLanguageFile, resolveLanguageFileSync } from './utils/resolver'; import useLocale from './hooks/useLocale'; import { LanguageFile, LanguageFiles } from './shared/types'; export type TProviderProps = { children?: React.ReactNode; } & ( | { defaultLocale?: never; languageFile?: LanguageFile; languageFiles?: never; locale?: never; } | { defaultLocale?: Extract; languageFile?: never; languageFiles?: LanguageFiles; locale?: Extract; } ); export default function TProvider({ children, defaultLocale, languageFile: propsLanguageFile, languageFiles, locale: propsLocale, }: TProviderProps) { const supportedLocales = languageFiles ? Object.keys(languageFiles) : []; const locale = useLocale({ defaultLocale, propsLocale, supportedLocales }); const getterOrLanguageFile = propsLanguageFile || (languageFiles && locale && languageFiles[locale] ? languageFiles[locale] : undefined); const [languageFile, setLanguageFile] = useState( resolveLanguageFileSync(getterOrLanguageFile), ); useEffect(() => { resolveLanguageFile(getterOrLanguageFile).then(setLanguageFile); }, [getterOrLanguageFile]); return {children}; } const isLanguageFile = PropTypes.oneOfType([PropTypes.object, PropTypes.func]); TProvider.propTypes = { children: PropTypes.node, defaultLocale: PropTypes.string, languageFile: isLanguageFile, languageFiles: PropTypes.objectOf(isLanguageFile), locale: PropTypes.string, };