@shopify/react-html
Version:
A component to render your React app with no static HTML
61 lines (58 loc) • 2.14 kB
JavaScript
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 };