import React, { useEffect, useState } from 'react';
import { Helmet } from 'react-helmet';
import VisuallyHidden from '@reach/visually-hidden';
import reactElementToJSXString from 'react-element-to-jsx-string';
import lendiFallback from './fallback-styles/lendi';
import aussieFallback from './fallback-styles/aussie';
import domainFallback from './fallback-styles/domain';
import type { ThemeName } from '@lendi-ui/commons/utils';
// All CDN assets can be found in the /public folder in this repo
export const config = {
lendi: {
fontFamilies: ['Open Sans', 'Cabin'],
fallback: lendiFallback,
brandFontFace: [
,
],
},
'lendi-next': {
// ^^ duplicate of lendi above ^^, but ts complains if we don't redeclare it here
fontFamilies: ['Open Sans', 'Cabin'],
fallback: lendiFallback,
brandFontFace: [
,
],
},
domain: {
fontFamilies: ['F37 Bolton'],
fallback: domainFallback,
brandFontFace: [],
},
aussie: {
fontFamilies: ['Barlow', 'tt-commons-pro'],
fallback: aussieFallback,
brandFontFace: [
,
,
],
},
};
const FontComponent = ({
children,
disableFallbackFonts = false,
themeName,
}: {
children: any;
disableFallbackFonts?: boolean;
themeName: ThemeName;
}) => {
const currentThemeConfig = config[themeName];
const [brandFontLoaded, setBrandFontLoaded] = useState(false);
useEffect(() => {
if (!brandFontLoaded && 'fonts' in document) {
(document as any).fonts.onloadingdone = (fontFaceSetEvent: { returnValue: boolean }) => {
setBrandFontLoaded(fontFaceSetEvent?.returnValue ?? true);
};
return;
}
setBrandFontLoaded(true);
}, [brandFontLoaded]);
const FontDetector = () => {
const fontFamilies = currentThemeConfig.fontFamilies;
if (brandFontLoaded) {
return null;
}
return (
{fontFamilies.map((fontFamily, index) => (
))}
);
};
const fontLinks = currentThemeConfig.brandFontFace.map((fontFace) => reactElementToJSXString(fontFace)).join();
const useFallbackFonts = !brandFontLoaded && !disableFallbackFonts;
return (
<>
{currentThemeConfig.brandFontFace.map((fontFace) => fontFace)}
{useFallbackFonts && }
{children}
>
);
};
export const Font = FontComponent;