summaryrefslogtreecommitdiff
path: root/static/giscus-loader.js
blob: b67185939c610fe52ab76fc6f4023e0b3027830e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
(() => {
  if (window.__wsapGiscusInitialized) return;
  window.__wsapGiscusInitialized = true;

  const initContainer = (root) => {
    if (!(root instanceof HTMLElement) || root.dataset.giscusInit === "1")
      return;
    root.dataset.giscusInit = "1";

    const toggle = root.querySelector(".comments-toggle");
    const trigger = root.querySelector(".giscus-trigger");
    const slot = root.querySelector(".giscus-slot");

    if (
      !(toggle instanceof HTMLButtonElement) ||
      !(slot instanceof HTMLElement)
    ) {
      return;
    }

    let isLoading = false;
    let hasLoaded = false;
    let observer = null;

    const loadComments = () => {
      if (isLoading || hasLoaded) return;

      isLoading = true;
      toggle.disabled = true;
      toggle.textContent = "Loading comments...";

      const script = document.createElement("script");
      script.src = "https://giscus.app/client.js";
      script.setAttribute("data-repo", "wenekar/giscus");
      script.setAttribute("data-repo-id", "R_kgDOREZgEQ");
      script.setAttribute("data-category", "Announcements");
      script.setAttribute("data-category-id", "DIC_kwDOREZgEc4C1nRY");
      script.setAttribute("data-mapping", "pathname");
      script.setAttribute("data-strict", "0");
      script.setAttribute("data-reactions-enabled", "1");
      script.setAttribute("data-emit-metadata", "0");
      script.setAttribute("data-input-position", "top");
      script.setAttribute("data-theme", "preferred_color_scheme");
      script.setAttribute("data-lang", "en");
      script.setAttribute("data-loading", "lazy");
      script.crossOrigin = "anonymous";
      script.async = true;

      script.addEventListener("load", () => {
        isLoading = false;
        hasLoaded = true;
        toggle.remove();
      });

      script.addEventListener("error", () => {
        isLoading = false;
        hasLoaded = false;
        toggle.disabled = false;
        toggle.textContent = "Show comments";
        script.remove();
      });

      slot.appendChild(script);
      if (observer) observer.disconnect();
    };

    toggle.addEventListener("click", loadComments);

    if ("IntersectionObserver" in window && trigger instanceof HTMLElement) {
      observer = new IntersectionObserver(
        (entries) => {
          if (entries.some((entry) => entry.isIntersecting)) loadComments();
        },
        { rootMargin: "300px 0px" },
      );
      observer.observe(trigger);
    }
  };

  const initAll = () => {
    document.querySelectorAll("[data-giscus-root]").forEach(initContainer);
  };

  if (document.readyState === "loading") {
    document.addEventListener("DOMContentLoaded", initAll, { once: true });
    return;
  }

  initAll();
})();