Files
hugo-mastodon-comments/static/comments/getcomments.js

104 lines
4.8 KiB
JavaScript

/*
SPDX-License-Identifier: AGPL-3.0-or-later
SPDX-FileCopyrightText: 2019 Max Mehl <mail@mehl.mx>
SPDX-FileCopyrightText: 2019 Björn Schießle
*/
// Debug logging helper
var debugEnabled = false;
function debugLog(message, data) {
if (debugEnabled) {
if (data !== undefined) {
console.log('[Mastodon Comments] ' + message, data);
} else {
console.log('[Mastodon Comments] ' + message);
}
}
}
$(document).ready(function() {
// check if we show a blog post or not. Regex is defined in site-wide config
var patt = new RegExp(BlogRegex);
var isArticle = patt.test(RelPermalink);
if (isArticle === false) {
console.log("Not a blog post, no need to search for comments");
return;
}
debugLog('Searching for comments for: ' + RelPermalink);
// Check if a direct Mastodon toot URL is provided
var ajaxData = { search: RelPermalink };
if (MastodonTootUrl && MastodonTootUrl !== "") {
// Pass the full URL to PHP so it can extract instance and ID
ajaxData.toot_url = MastodonTootUrl;
debugLog('Using predefined Mastodon toot URL: ' + MastodonTootUrl);
}
$.ajax({
url: "/comments/getcomments.php",
type: "get",
data: ajaxData,
success: function(data) {
// Enable debug logging if backend has debug enabled
if (data.debug === true) {
debugEnabled = true;
debugLog('Debug mode enabled');
}
debugLog('Received data from backend', data);
var stats = data.stats;
var root = data.stats.root;
debugLog('Stats - Favs: ' + stats.favs + ', Reblogs: ' + stats.reblogs + ', Replies: ' + stats.replies);
debugLog('Root toot ID: ' + root);
$("#like-count-container").append('<div id="mastodon-like-count"><a href="' + stats.url + '"><span title="Likes"><i class="fa fa-star"></i>' + stats.favs + '</span></a></div></div>');
$("#reblog-count-container").append('<div id="mastodon-reblog-count"><a href="' + stats.url + '"><span title="Reblogs"><i class="fa fa-retweet"></i>' + stats.reblogs + '</span></a></div></div>');
$("#reply-count-container").append('<div id="mastodon-reply-count"><a href="' + stats.url + '"><span title="Comments"><i class="fa fa-comments"></i>' + stats.replies + '</span></a></div></div>');
var comments = data.comments;
var commentCount = Object.keys(comments).length;
debugLog('Processing ' + commentCount + ' comments');
$.each(comments, function(key, value) {
debugLog('Adding comment: ' + key, value);
var timestamp = Date.parse(value.date);
var date = new Date(timestamp);
var comment = "<div class='comment' id='" + key + "'>";
comment += "<img class='avatar' src='" + value.author.avatar + "' />";
comment += "<div class='author'><a class='displayName' href='" + value.author.url + "'>" + value.author.display_name + "</a> wrote at ";
comment += "<a class='date' href='" + value.url + "'>" + date.toDateString() + ', ' + date.toLocaleTimeString() + "</a></div>";
comment += "<div class='toot'>" + value.toot + "</div>";
comment += "</div>";
var parentComment = document.getElementById(value.reply_to);
if (value.reply_to === root || parentComment === null) {
$("#comments").append(comment);
debugLog(' → Added as top-level comment');
} else {
var selector = '#'+value.reply_to;
$(selector).append(comment);
debugLog(' → Added as reply to: ' + value.reply_to);
}
});
if (parseInt(root) > 0) {
$("#reference").append("<a href='" + MastodonUser + "/statuses/" + root + "'>Join the discussion on Mastodon!</a>");
debugLog('Added Mastodon discussion link for root: ' + root);
} else {
$("#comments").empty();
$("#statistics").empty();
$("#reference").append("Comments are handled by my <a href='" + MastodonUser + "'>Mastodon account</a>. Sadly this article wasn't published at Mastodon. Feel free to <a href='" + CommentsContact + "'>send me a mail</a> if you want to share your thoughts regarding this topic.");
debugLog('No Mastodon toot found for this article');
}
},
error: function(xhr, status, error) {
console.error('[Mastodon Comments] AJAX Error:', status, error);
console.error('[Mastodon Comments] Response:', xhr.responseText);
}
});
});