import TRenderEngine from '@native-html/transient-render-engine'; import React, { PropsWithChildren, ReactElement } from 'react'; import { Platform } from 'react-native'; import useTRenderEngine from './hooks/useTRenderEngine'; import { TRenderEngineConfig } from './shared-types'; import defaultSystemFonts from './defaultSystemFonts'; const defaultTRenderEngine = {} as any; const TRenderEngineContext = React.createContext(defaultTRenderEngine); /** * Default fallback font for special keys such as 'sans-serif', 'monospace', * 'serif', based on current platform. */ export const defaultFallbackFonts = { 'sans-serif': Platform.select({ ios: 'system', default: 'sans-serif' }), monospace: Platform.select({ ios: 'Menlo', default: 'monospace' }), serif: Platform.select({ ios: 'Times New Roman', default: 'serif' }), }; export const defaultTRenderEngineProviderProps: TRenderEngineConfig = { htmlParserOptions: { decodeEntities: true, }, emSize: 14, ignoredDomTags: [], ignoredStyles: [], baseStyle: { fontSize: 14 }, tagsStyles: {}, classesStyles: {}, enableUserAgentStyles: true, enableCSSInlineProcessing: true, customHTMLElementModels: {}, fallbackFonts: defaultFallbackFonts, systemFonts: defaultSystemFonts, }; /** * Use the ambient transient render engine. * * @returns The ambient transient render engine. * * @public */ export function useAmbientTRenderEngine() { const engine = React.useContext(TRenderEngineContext); if (typeof __DEV__ === 'boolean' && __DEV__ && engine === defaultTRenderEngine) { console.error('TRenderEngineProvider is missing in the render tree.'); } return engine; } /** * A react component to share a {@link TRenderEngine} instance across different * rendered contents via {@link RenderHTMLSource}. This can significantly enhance * performance in applications with potentially dozens or hundreds of distinct * rendered snippets such as chat apps. * * @param props - Pass engine config here. */ export default function TRenderEngineProvider({ children, ...config }: PropsWithChildren): ReactElement { config = { ...defaultTRenderEngineProviderProps, ...config, }; const engine = useTRenderEngine(config); return {children}; }