summaryrefslogtreecommitdiff
path: root/layouts/_partials/scripts/action-menu-js.html
blob: 66673b71354a0b17cdd172635a862cfa555f355a (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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
{{ $pageId := . }}
<script defer>
// 初始化所有功能
function initializeFeatures() {
  const pageId = "{{ $pageId }}";
  console.log(pageId)
  if (!pageId) return;

  // 评论展开/收起功能
  initializeComments();
  // 点赞功能
  initializeLikes(pageId);
  // 评论数量获取
  initializeCommentCount();
}

// 评论展开/收起功能初始化
function initializeComments() {
  const commentsToggle = document.getElementById('comments-toggle');
  const commentsSection = document.getElementById('comments-section');

  if (commentsToggle && commentsSection) {
    commentsToggle.addEventListener('click', function() {
      const isHidden = commentsSection.style.display === 'none';
      commentsSection.style.display = isHidden ? 'block' : 'none';
      this.style.background = isHidden ? 'rgba(0, 0, 0, 0.1)' : 'transparent';
    });
  }
}

// 评论数量功能初始化
function initializeCommentCount() {
  const commentCountEl = document.getElementById('comment-count');
  const giscusIframe = document.querySelector('iframe.giscus-frame');
  if (!commentCountEl || !giscusIframe) return;

  commentCountEl.textContent = '0';

  giscusIframe.addEventListener('load', () => {
    window.addEventListener('message', function(event) {
      if (event.origin !== 'https://giscus.app') return;

      const giscusData = event.data;
      if (giscusData.giscus?.discussion) {
        const discussion = giscusData.giscus.discussion;
        const totalComments = (discussion.totalCommentCount || 0) + (discussion.totalReplyCount || 0);
        commentCountEl.textContent = totalComments.toString();
      }
    });
  });
}

// 点赞功能初始化
function initializeLikes(pageId) {
  const elements = {
    count: document.getElementById("like-count-" + pageId),
    btn: document.getElementById("like-btn-" + pageId),
    container: document.getElementById("like-container-" + pageId),
    icon: document.getElementById("like-icon-" + pageId)
  };

  if (!elements.count || !elements.btn || !elements.container) return;

  function updateTooltip() {
    elements.btn.setAttribute('title',
      elements.container.classList.contains('liked')
        ? elements.btn.getAttribute('data-liked-title')
        : '为这篇文章献上心脏'
    );
  }

  function setLikedState() {
    elements.icon?.classList.add('liked-heart');
    elements.icon?.classList.add('animate-heart-beat');
    elements.count?.classList.add('liked-count');
    elements.btn.disabled = true;
    elements.container.classList.add('liked');
    updateTooltip();
  }

  async function fetchLikes() {
    try {
      const response = await fetch("https://like.guhub.cn/like/" + pageId);
      const data = await response.json();
      elements.count.innerText = data.likes ?? 0;
      if (localStorage.getItem("liked_" + pageId)) {
        setLikedState();
      }
    } catch(e) {
      console.log(e);
      elements.count.innerText = "❌";
    }
  }

  window.sendLike = async function(pageId) {
    if (localStorage.getItem("liked_" + pageId)) return;

    if (window.location.hostname !== 'localhost' && typeof umami !== 'undefined') {
      umami.track('👍 Hit Like Button');
    }

    try {
      const response = await fetch("https://like.guhub.cn/like/" + pageId, { method: "POST" });
      const data = await response.json();
      localStorage.setItem("liked_" + pageId, "1");
      elements.count.innerText = data.likes ?? 1;
      setLikedState();
    } catch(e) {
      console.log(e);
      alert("点赞失败,请稍后再试");
    }
  };

  fetchLikes();
}

// 在 DOM 加载完成后初始化所有功能
document.addEventListener('DOMContentLoaded', () => {
  if ('requestIdleCallback' in window) {
    requestIdleCallback(initializeFeatures);
  } else {
    setTimeout(initializeFeatures, 300);
  }
});
</script>