UNPKG

react-metatags-hook

Version:
49 lines (48 loc) 1.76 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.updateDom = void 0; const state_1 = require("../state"); const getHeadElement = (tagName, query) => { const queryAttributes = query.reduce((acc, { key, value }) => acc + `[${key}${value ? '="' + value + '"' : ''}]`, ''); return document.head.querySelector(tagName + queryAttributes); }; const createHeadElement = (tagName) => { const newTag = document.createElement(tagName); document.head.appendChild(newTag); return newTag; }; const setTitle = (title) => { document.title = title; }; const setLang = (lang) => { document.documentElement.lang = lang; }; const setHeadElement = ({ tag, query, attributes }) => { const element = getHeadElement(tag, query) || createHeadElement(tag); attributes && Object.keys(attributes).forEach((name) => { element.setAttribute(name, attributes[name] || ''); }); }; const removeHeadElement = ({ tag, query }) => { const element = getHeadElement(tag, query); element && document.head.removeChild(element); }; // Public let domChangeTimeout; let lastMetas = { tags: {} }; const updateDom = (metas, debounceTime) => { if (typeof window !== 'undefined') { window.clearTimeout(domChangeTimeout); domChangeTimeout = setTimeout(() => { const removedTags = (0, state_1.getRemovedTags)(metas, lastMetas); const tags = (0, state_1.getTagsList)(metas); lastMetas = metas; metas.title && setTitle(metas.title); metas.lang && setLang(metas.lang); tags.forEach(setHeadElement); removedTags.forEach(removeHeadElement); }, debounceTime); } }; exports.updateDom = updateDom;