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 ( ); }; 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;