UNPKG

@shopify/react-html

Version:

A component to render your React app with no static HTML

76 lines (71 loc) 2.54 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var React = require('react'); var reactEffect = require('@shopify/react-effect'); var context = require('./context.js'); function useDomEffect(perform, inputs = []) { const manager = React.useContext(context.HtmlContext); const effect = () => perform(manager); reactEffect.useServerEffect(effect, manager.effect); // eslint-disable-next-line react-hooks/exhaustive-deps React.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 = React.useContext(context.HtmlContext); React.useEffect(() => { perform(manager); // eslint-disable-next-line react-hooks/exhaustive-deps }, [manager, perform, ...inputs]); } function useServerDomEffect(perform) { const manager = React.useContext(context.HtmlContext); reactEffect.useServerEffect(() => perform(manager), manager.effect); } exports.useBodyAttributes = useBodyAttributes; exports.useClientDomEffect = useClientDomEffect; exports.useDomEffect = useDomEffect; exports.useFavicon = useFavicon; exports.useHtmlAttributes = useHtmlAttributes; exports.useInlineStyle = useInlineStyle; exports.useLink = useLink; exports.useLocale = useLocale; exports.useMeta = useMeta; exports.usePreconnect = usePreconnect; exports.useServerDomEffect = useServerDomEffect; exports.useTitle = useTitle;