UNPKG

@shopify/react-html

Version:

A component to render your react app with no static HTML.

151 lines (150 loc) 5.67 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); var react_1 = tslib_1.__importDefault(require("react")); var react_hydrate_1 = require("@shopify/react-hydrate"); var hooks_1 = require("../hooks"); var utilities_1 = require("../utilities"); function HtmlUpdater() { var queuedUpdate = react_1.default.useRef(null); hooks_1.useClientDomEffect(function (manager) { return manager.subscribe(function (state) { if (queuedUpdate.current) { cancelAnimationFrame(queuedUpdate.current); } queuedUpdate.current = requestAnimationFrame(function () { updateOnClient(state); }); }); }); return react_1.default.createElement(react_hydrate_1.HydrationTracker, null); } exports.HtmlUpdater = HtmlUpdater; function updateOnClient(state) { var e_1, _a, e_2, _b, e_3, _c, e_4, _d; var title = state.title, metas = state.metas, links = state.links; var titleElement = document.querySelector('title'); if (title == null) { if (titleElement) { titleElement.remove(); } } else { if (titleElement == null) { titleElement = document.createElement('title'); document.head.appendChild(titleElement); } titleElement.setAttribute(utilities_1.MANAGED_ATTRIBUTE, 'true'); titleElement.textContent = title; } var fragment = document.createDocumentFragment(); var oldMetas = Array.from(document.head.querySelectorAll("meta[" + utilities_1.MANAGED_ATTRIBUTE + "]")); var _loop_1 = function (meta) { var e_5, _a; var element = document.createElement('meta'); element.setAttribute(utilities_1.MANAGED_ATTRIBUTE, 'true'); try { for (var _b = tslib_1.__values(Object.entries(meta)), _c = _b.next(); !_c.done; _c = _b.next()) { var _d = tslib_1.__read(_c.value, 2), attribute = _d[0], value = _d[1]; element.setAttribute(attribute, value); } } catch (e_5_1) { e_5 = { error: e_5_1 }; } finally { try { if (_c && !_c.done && (_a = _b.return)) _a.call(_b); } finally { if (e_5) throw e_5.error; } } var matchingOldMetaIndex = oldMetas.findIndex(function (oldMeta) { return oldMeta.isEqualNode(element); }); if (matchingOldMetaIndex >= 0) { oldMetas.splice(matchingOldMetaIndex, 1); } else { fragment.appendChild(element); } }; try { for (var metas_1 = tslib_1.__values(metas), metas_1_1 = metas_1.next(); !metas_1_1.done; metas_1_1 = metas_1.next()) { var meta = metas_1_1.value; _loop_1(meta); } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (metas_1_1 && !metas_1_1.done && (_a = metas_1.return)) _a.call(metas_1); } finally { if (e_1) throw e_1.error; } } var oldLinks = Array.from(document.head.querySelectorAll("link[" + utilities_1.MANAGED_ATTRIBUTE + "]")); var _loop_2 = function (link) { var e_6, _a; var element = document.createElement('link'); element.setAttribute(utilities_1.MANAGED_ATTRIBUTE, 'true'); try { for (var _b = tslib_1.__values(Object.entries(link)), _c = _b.next(); !_c.done; _c = _b.next()) { var _d = tslib_1.__read(_c.value, 2), attribute = _d[0], value = _d[1]; element.setAttribute(attribute, value); } } catch (e_6_1) { e_6 = { error: e_6_1 }; } finally { try { if (_c && !_c.done && (_a = _b.return)) _a.call(_b); } finally { if (e_6) throw e_6.error; } } var matchingOldLinkIndex = oldLinks.findIndex(function (oldLink) { return oldLink.isEqualNode(element); }); if (matchingOldLinkIndex >= 0) { oldLinks.splice(matchingOldLinkIndex, 1); } else { fragment.appendChild(element); } }; try { for (var links_1 = tslib_1.__values(links), links_1_1 = links_1.next(); !links_1_1.done; links_1_1 = links_1.next()) { var link = links_1_1.value; _loop_2(link); } } catch (e_2_1) { e_2 = { error: e_2_1 }; } finally { try { if (links_1_1 && !links_1_1.done && (_b = links_1.return)) _b.call(links_1); } finally { if (e_2) throw e_2.error; } } try { for (var oldLinks_1 = tslib_1.__values(oldLinks), oldLinks_1_1 = oldLinks_1.next(); !oldLinks_1_1.done; oldLinks_1_1 = oldLinks_1.next()) { var link = oldLinks_1_1.value; link.remove(); } } catch (e_3_1) { e_3 = { error: e_3_1 }; } finally { try { if (oldLinks_1_1 && !oldLinks_1_1.done && (_c = oldLinks_1.return)) _c.call(oldLinks_1); } finally { if (e_3) throw e_3.error; } } try { for (var oldMetas_1 = tslib_1.__values(oldMetas), oldMetas_1_1 = oldMetas_1.next(); !oldMetas_1_1.done; oldMetas_1_1 = oldMetas_1.next()) { var meta = oldMetas_1_1.value; meta.remove(); } } catch (e_4_1) { e_4 = { error: e_4_1 }; } finally { try { if (oldMetas_1_1 && !oldMetas_1_1.done && (_d = oldMetas_1.return)) _d.call(oldMetas_1); } finally { if (e_4) throw e_4.error; } } document.head.appendChild(fragment); }