react-disqus-components
Version:
react-disqus-components wrapper for official disqus web api
93 lines (90 loc) • 3.39 kB
JavaScript
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