UNPKG

@shopify/react-html

Version:

A component to render your React app with no static HTML

61 lines (58 loc) 2.14 kB
import { useContext, useEffect } from 'react'; import { useServerEffect } from '@shopify/react-effect'; import { HtmlContext } from './context.mjs'; function useDomEffect(perform, inputs = []) { const manager = useContext(HtmlContext); const effect = () => perform(manager); useServerEffect(effect, manager.effect); // eslint-disable-next-line react-hooks/exhaustive-deps useEffect(effect, [manager, ...inputs]); } function useTitle(title) { useDomEffect(manager => manager.addTitle(title), [title]); } function useLink(link) { useDomEffect(manager => manager.addLink(link), [JSON.stringify(link)]); } function useInlineStyle(inlineStyle) { useDomEffect(manager => manager.addInlineStyle(inlineStyle), [JSON.stringify(inlineStyle)]); } function useMeta(meta) { useDomEffect(manager => manager.addMeta(meta), [JSON.stringify(meta)]); } function usePreconnect(source) { useDomEffect(manager => manager.addLink({ rel: 'preconnect', href: source }), [source]); } function useFavicon(source) { useDomEffect(manager => manager.addLink({ rel: 'shortcut icon', type: 'image/x-icon', href: source }), [source]); } function useLocale(locale) { useDomEffect(manager => manager.addHtmlAttributes({ lang: locale }), [locale]); } function useHtmlAttributes(htmlAttributes) { useDomEffect(manager => manager.addHtmlAttributes(htmlAttributes), [JSON.stringify(htmlAttributes)]); } function useBodyAttributes(bodyAttributes) { useDomEffect(manager => manager.addBodyAttributes(bodyAttributes), [JSON.stringify(bodyAttributes)]); } function useClientDomEffect(perform, inputs = []) { const manager = useContext(HtmlContext); useEffect(() => { perform(manager); // eslint-disable-next-line react-hooks/exhaustive-deps }, [manager, perform, ...inputs]); } function useServerDomEffect(perform) { const manager = useContext(HtmlContext); useServerEffect(() => perform(manager), manager.effect); } export { useBodyAttributes, useClientDomEffect, useDomEffect, useFavicon, useHtmlAttributes, useInlineStyle, useLink, useLocale, useMeta, usePreconnect, useServerDomEffect, useTitle };