UNPKG

react-disqus-components

Version:

react-disqus-components wrapper for official disqus web api

93 lines (90 loc) 3.39 kB
import { useEffect, createElement } from 'react'; var DISQUS_INSTANCE = 'DISQUS'; var DISQUS_CONFIG = 'disqus_config'; var DISQUS_SHORTNAME = 'disqus_shortname'; var DISQUS_THREAD = 'disqus_thread'; var DISQUS_COMMENT_ELEMENT_ID = 'dsq-embed-scr'; var DISQUS_PRELOAD_IFRAME_SELECTOR = 'iframe[id^=dsq-app]'; var DEFER_LOADING_MS = 4000; var EMPTY_DISQUS_CONFIG = { identifier: '', url: '', shortname: '', defer: DEFER_LOADING_MS }; var Comment = function (props) { var disqusConfig = Object.assign({}, EMPTY_DISQUS_CONFIG, props); var insertScript = function (src, id, parentElement) { var script = document.createElement('script'); script.async = true; script.src = src; script.id = id; parentElement.appendChild(script); return script; }; var removeScript = function (id, parentElement) { var script = document.getElementById(id); if (script) { parentElement.removeChild(script); } }; var removeDisqusThreadElement = function () { var disqusThread = document.getElementById(DISQUS_THREAD); if (disqusThread) { while (disqusThread.hasChildNodes()) { console.debug('cleaning disqus thread element'); disqusThread.firstChild && disqusThread.removeChild(disqusThread.firstChild); } } }; var removeDisqusPreloadFrameElement = function () { var disqusPreloadFrame = document.querySelectorAll(DISQUS_PRELOAD_IFRAME_SELECTOR); if (disqusPreloadFrame) { console.debug('cleaning disqus preload frame (dsq-app) element'); disqusPreloadFrame.forEach(function (value, key, parent) { value.parentElement.removeChild(value); }); } }; var getDisqusConfig = function () { return function () { this.page.identifier = disqusConfig.identifier; this.page.url = disqusConfig.url; this.page.title = props.title; }; }; var loadInstance = function () { setTimeout(function () { if (window[DISQUS_INSTANCE] && document.getElementById(DISQUS_COMMENT_ELEMENT_ID)) { window[DISQUS_INSTANCE].reset({ reload: true, config: getDisqusConfig() }); } else { removeDisqusThreadElement(); if (props.shortname) { window[DISQUS_CONFIG] = getDisqusConfig(); window[DISQUS_SHORTNAME] = disqusConfig.shortname; insertScript("https://" + disqusConfig.shortname + ".disqus.com/embed.js", DISQUS_COMMENT_ELEMENT_ID, document.body); } } }, disqusConfig.defer); }; var cleanInstance = function () { removeScript(DISQUS_COMMENT_ELEMENT_ID, document.body); if (window[DISQUS_INSTANCE]) { window[DISQUS_INSTANCE].reset(); window[DISQUS_INSTANCE] = undefined; removeDisqusThreadElement(); removeDisqusPreloadFrameElement(); } }; useEffect(function () { loadInstance(); return cleanInstance; }, [props.identifier]); return createElement("div", { id: DISQUS_THREAD }); }; export { Comment }; //# sourceMappingURL=index.esm.js.map