Skip to content
Closed
20 changes: 20 additions & 0 deletions hooks/useDynamicLocale/DynamicLocaleRenderer.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { useEffect } from 'react';
import PropTypes from 'prop-types';
import useDynamicLocale from './useDynamicLocale';

const DynamicLocaleRenderer = ({ children, onLoaded }) => {
const { localeLoaded, isEnglishLang } = useDynamicLocale();
useEffect(() => {
if (localeLoaded) {
onLoaded({ isEnglishLang });
}
}, [localeLoaded, onLoaded, isEnglishLang]);
return localeLoaded ? children : null;
};

DynamicLocaleRenderer.propTypes = {
children: PropTypes.node,
onLoaded: PropTypes.func,
};

export default DynamicLocaleRenderer;
3 changes: 3 additions & 0 deletions hooks/useDynamicLocale/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export { default as useDynamicLocale } from './useDynamicLocale';
export { default as DynamicLocaleRenderer } from './DynamicLocaleRenderer';

44 changes: 44 additions & 0 deletions hooks/useDynamicLocale/useDynamicLocale.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import React from 'react';
import dayjs from 'dayjs';
import availableLocales from 'dayjs/locale';
import { IntlContext } from 'react-intl';

const isEnglishLang = (locale) => {
return /^en/.test(locale);
};

const useDynamicLocale = ({ locale : localeProp } = {}) => {
const { locale: localeContext } = React.useContext(IntlContext);
const [localeLoaded, setLocaleLoaded] = React.useState(
localeProp ? isEnglishLang(localeProp) :
isEnglishLang(localeContext)
);
const locale = localeProp || localeContext;

React.useEffect(() => {
// don't load a dynamic locale if the dayjs locale is already set to it,
// or if it's already been loaded according to state...
if (!localeLoaded && dayjs.locale() !== locale) {
// check if locale is available
const available = availableLocales.findIndex(l => l.key === locale);
if (available !== -1) {
import(
/* webpackChunkName: "dayjs-locale-[request]" */
/* webpackExclude: /\.d\.ts$/ */
`dayjs/locale/${locale}`
).then(() => {
dayjs.locale(locale);
setLocaleLoaded(true);
});
}
} else if (dayjs.locale() === locale) {
setLocaleLoaded(true);
}
}, [localeLoaded, locale]);

return { localeLoaded,
isEnglish: localeProp ? localeProp === 'en' :
localeContext === 'en' };
};

export default useDynamicLocale;
Loading