summaryrefslogtreecommitdiff
path: root/themes/tabi-lean/static/js/isso.js
diff options
context:
space:
mode:
Diffstat (limited to 'themes/tabi-lean/static/js/isso.js')
-rw-r--r--themes/tabi-lean/static/js/isso.js81
1 files changed, 81 insertions, 0 deletions
diff --git a/themes/tabi-lean/static/js/isso.js b/themes/tabi-lean/static/js/isso.js
new file mode 100644
index 0000000..4666604
--- /dev/null
+++ b/themes/tabi-lean/static/js/isso.js
@@ -0,0 +1,81 @@
+// Function to initialise Isso.
+function initIsso() {
+ // Get the div that will contain the comments.
+ const commentsDiv = document.querySelector('.comments');
+ if (commentsDiv) {
+ // Get the lazy-loading setting from the div.
+ const lazyLoading = commentsDiv.getAttribute('data-lazy-loading') === 'true';
+
+ // If lazy-loading is enabled, create an Intersection Observer and use it.
+ if (lazyLoading) {
+ const observer = new IntersectionObserver((entries) => {
+ // Loop over the entries.
+ entries.forEach((entry) => {
+ // If the element is in the viewport, initialize Isso.
+ if (entry.isIntersecting) {
+ loadIsso(commentsDiv);
+ // Once the Isso is loaded, we don't need to observe the element anymore.
+ observer.unobserve(commentsDiv);
+ }
+ });
+ });
+
+ // Start observing the comments div.
+ observer.observe(commentsDiv);
+ } else {
+ // If lazy-loading is not enabled, initialise Isso immediately.
+ loadIsso(commentsDiv);
+ }
+ }
+}
+
+// Function to load Isso.
+function loadIsso(commentsDiv) {
+ // Get the various settings from data attributes on the div.
+ const endpointUrl = commentsDiv.getAttribute('data-endpoint-url');
+ const pageId = commentsDiv.getAttribute('data-isso-id');
+ const title = commentsDiv.getAttribute('data-title');
+ const lang = commentsDiv.getAttribute('data-page-language');
+ const maxCommentsTop = commentsDiv.getAttribute('data-max-comments-top');
+ const maxCommentsNested = commentsDiv.getAttribute('data-max-comments-nested');
+ const avatar = commentsDiv.getAttribute('data-avatar');
+ const voting = commentsDiv.getAttribute('data-voting');
+ const hashes = commentsDiv.getAttribute('data-page-author-hashes');
+
+ // Create a new script tag that will load the Isso script.
+ const script = document.createElement('script');
+ script.src = endpointUrl + 'js/embed.min.js';
+ script.async = true;
+
+ // Set the various settings as data attributes on the script tag.
+ script.setAttribute('data-isso', endpointUrl);
+ script.setAttribute('data-isso-lang', lang);
+ script.setAttribute('data-isso-max-comments-top', maxCommentsTop);
+ script.setAttribute('data-isso-max-comments-nested', maxCommentsNested);
+ script.setAttribute('data-isso-avatar', avatar);
+ script.setAttribute('data-isso-vote', voting);
+ script.setAttribute('data-isso-page-author-hashes', hashes);
+ script.setAttribute('data-isso-css', 'false');
+
+ // Set the id and data-isso-id of the Isso thread.
+ const section = document.createElement('section');
+ section.id = 'isso-thread';
+ section.setAttribute('data-isso-id', pageId);
+ section.setAttribute('data-title', title);
+ commentsDiv.appendChild(section);
+
+ // Add the script tag to the div.
+ commentsDiv.appendChild(script);
+
+ // Create a link tag for the Isso CSS.
+ const link = document.createElement('link');
+ link.rel = 'stylesheet';
+ link.type = 'text/css';
+ link.href = '/isso.min.css';
+
+ // Add the CSS link tag to the head of the document.
+ document.head.appendChild(link);
+}
+
+// Initialize Isso.
+initIsso();