Co-authored-by: tobi <tobi.smethurst@protonmail.com> Reviewed-on: https://codeberg.org/superseriousbusiness/masto-fe-standalone/pulls/88 Co-authored-by: Zoë Bijl <moiety@noreply.codeberg.org> Co-committed-by: Zoë Bijl <moiety@noreply.codeberg.org>
62 lines
1.4 KiB
TypeScript
62 lines
1.4 KiB
TypeScript
import { useEffect, useState } from "react";
|
|
|
|
import { IntlProvider as BaseIntlProvider } from "react-intl";
|
|
|
|
import { getLocale, isLocaleLoaded } from "./global_locale";
|
|
import { loadLocale } from "./load_locale";
|
|
|
|
function onProviderError(error: unknown) {
|
|
// Silent the error, like upstream does
|
|
if (process.env.NODE_ENV === "production") {
|
|
return;
|
|
}
|
|
|
|
// This browser does not advertise Intl support for this locale, we only print a warning
|
|
// As-per the spec, the browser should select the best matching locale
|
|
if (
|
|
error &&
|
|
typeof error === "object" &&
|
|
error instanceof Error &&
|
|
error.message.match("MISSING_DATA")
|
|
) {
|
|
console.warn(error.message);
|
|
}
|
|
|
|
console.error(error);
|
|
}
|
|
|
|
export const IntlProvider: React.FC<
|
|
Omit<React.ComponentProps<typeof BaseIntlProvider>, "locale" | "messages">
|
|
> = ({ children, ...props }) => {
|
|
const [localeLoaded, setLocaleLoaded] = useState(false);
|
|
|
|
useEffect(() => {
|
|
async function loadLocaleData() {
|
|
if (!isLocaleLoaded()) {
|
|
await loadLocale();
|
|
}
|
|
|
|
setLocaleLoaded(true);
|
|
}
|
|
void loadLocaleData();
|
|
}, []);
|
|
|
|
if (!localeLoaded) {
|
|
return null;
|
|
}
|
|
|
|
const { locale, messages } = getLocale();
|
|
|
|
return (
|
|
<BaseIntlProvider
|
|
locale={locale}
|
|
messages={messages}
|
|
onError={onProviderError}
|
|
textComponent='span'
|
|
{...props}
|
|
>
|
|
{children}
|
|
</BaseIntlProvider>
|
|
);
|
|
};
|