UNPKG

react-intlayer

Version:

Easily internationalize i18n your React applications with type-safe multilingual content management.

85 lines (82 loc) 2.75 kB
'use client'; import { compileMarkdown } from "./processor.mjs"; import { createContext, useContext } from "react"; import { jsx } from "react/jsx-runtime"; //#region src/markdown/MarkdownProvider.tsx const MarkdownContext = createContext(void 0); /** * Returns the raw `MarkdownProvider` context value — the active * `renderMarkdown` function plus any provider-level component overrides. * Returns `undefined` when called outside a `<MarkdownProvider>`. * Prefer `useMarkdownRenderer` for most use cases; use this hook only when * you need direct access to the context object itself. */ const useMarkdownContext = () => useContext(MarkdownContext); const mergeOptions = (baseOptions, options = {}, components = {}, wrapper) => { return { ...baseOptions, ...options, forceBlock: options.forceBlock ?? baseOptions.forceBlock, forceInline: options.forceInline ?? baseOptions.forceInline, preserveFrontmatter: options.preserveFrontmatter ?? baseOptions.preserveFrontmatter, tagfilter: options.tagfilter ?? baseOptions.tagfilter, wrapper: wrapper || baseOptions.wrapper, forceWrapper: !!(wrapper || baseOptions.wrapper), components: { ...baseOptions.components, ...components } }; }; /** * Provider for the MarkdownRenderer component. * * It will provide the `renderMarkdown` function to the context, which can be used to render markdown. * * ```tsx * const content = useIntlayer('app'); * * return ( * <div> * {content.markdown} // Will be rendered with the components and options provided to the MarkdownProvider * </div> * ); * ``` * * @example * ```tsx * <MarkdownProvider components={{ h1: CustomHeading }}> * <MarkdownRenderer> * {markdownContent} * </MarkdownRenderer> * </MarkdownProvider> * ``` */ const MarkdownProvider = ({ children, components, wrapper, forceBlock, forceInline, preserveFrontmatter, tagfilter, renderMarkdown: customRenderFn }) => { const baseOptions = { components, forceBlock, forceInline, wrapper, forceWrapper: !!wrapper, preserveFrontmatter, tagfilter }; const defaultRenderMarkdown = (markdown, options, components, wrapper) => { return compileMarkdown(markdown, mergeOptions(baseOptions, options, components, wrapper)); }; const customRenderMarkdownWrapper = (markdown, options, components, wrapper) => /* @__PURE__ */ jsx(MarkdownContext.Provider, { value: void 0, children: customRenderFn?.(markdown, options, components, wrapper) }); return /* @__PURE__ */ jsx(MarkdownContext.Provider, { value: { components, renderMarkdown: customRenderFn ? customRenderMarkdownWrapper : defaultRenderMarkdown }, children }); }; //#endregion export { MarkdownProvider, useMarkdownContext }; //# sourceMappingURL=MarkdownProvider.mjs.map