bloat/static/fluoride.js

309 lines
7.9 KiB
JavaScript
Raw Normal View History

2020-01-26 09:21:26 +00:00
// @license magnet:?xt=urn:btih:90dc5c0be029de84e523b9b3922520e79e0e6f08&dn=cc0.txt CC0
2020-01-08 18:16:06 +00:00
var reverseActions = {
"like": "unlike",
"unlike": "like",
"retweet": "unretweet",
"unretweet": "retweet"
};
2020-11-09 12:10:29 +00:00
var statusCache = {};
var csrfToken = "";
var antiDopamineMode = false;
function checkCSRFToken() {
2020-06-21 17:18:12 +00:00
var tag = document.querySelector("meta[name='csrf_token']");
2020-01-25 10:07:06 +00:00
if (tag)
csrfToken = tag.getAttribute("content");
}
function checkAntiDopamineMode() {
var tag = document.querySelector("meta[name='antidopamine_mode']");
if (tag)
antiDopamineMode = tag.getAttribute("content") === "true";
2020-01-25 10:07:06 +00:00
}
function http(method, url, body, type, success, error) {
2020-01-08 18:16:06 +00:00
var req = new XMLHttpRequest();
req.onload = function() {
if (this.status === 200 && typeof success === "function") {
success(this.responseText, this.responseType);
} else if (typeof error === "function") {
error(this.responseText);
}
};
req.onerror = function() {
if (typeof error === "function") {
2020-11-09 12:10:29 +00:00
error(this);
2020-01-08 18:16:06 +00:00
}
};
req.open(method, url);
2020-11-09 12:10:29 +00:00
if (type)
req.setRequestHeader("Content-Type", type);
2020-01-25 10:07:06 +00:00
req.send(body);
2020-01-08 18:16:06 +00:00
}
function updateActionForm(id, f, action) {
2020-06-21 17:18:12 +00:00
f.querySelector("[type='submit']").value = action;
2020-01-08 18:16:06 +00:00
f.action = "/" + action + "/" + id;
f.dataset.action = action;
}
function handleLikeForm(id, f) {
f.onsubmit = function(event) {
event.preventDefault();
var action = f.dataset.action;
2020-06-21 17:18:12 +00:00
var forms = document.
querySelectorAll(".status-"+id+" .status-like");
2020-02-01 15:06:06 +00:00
for (var i = 0; i < forms.length; i++) {
updateActionForm(id, forms[i], reverseActions[action]);
}
2020-01-08 18:16:06 +00:00
var body = "csrf_token=" + encodeURIComponent(csrfToken);
2020-01-25 10:07:06 +00:00
var contentType = "application/x-www-form-urlencoded";
2020-06-21 17:18:12 +00:00
http("POST", "/fluoride/" + action + "/" + id,
body, contentType, function(res, type) {
if (antiDopamineMode)
return;
2020-01-08 18:16:06 +00:00
var data = JSON.parse(res);
var count = data.data;
2020-06-21 17:18:12 +00:00
if (count === 0)
2020-01-08 18:16:06 +00:00
count = "";
2020-06-21 17:18:12 +00:00
var counts = document.
querySelectorAll(".status-"+id+" .status-like-count");
2020-02-01 15:06:06 +00:00
for (var i = 0; i < counts.length; i++) {
2020-01-30 13:56:29 +00:00
if (count > 0) {
2020-02-01 15:06:06 +00:00
counts[i].innerHTML = "(" + count + ")";
2020-01-30 13:56:29 +00:00
} else {
2020-02-01 15:06:06 +00:00
counts[i].innerHTML = "";
2020-01-30 13:56:29 +00:00
}
2020-02-01 15:06:06 +00:00
}
2020-01-08 18:16:06 +00:00
}, function(err) {
2020-02-01 15:06:06 +00:00
for (var i = 0; i < forms.length; i++) {
updateActionForm(id, forms[i], action);
}
2020-01-08 18:16:06 +00:00
});
}
}
function handleRetweetForm(id, f) {
f.onsubmit = function(event) {
event.preventDefault();
var action = f.dataset.action;
2020-06-21 17:18:12 +00:00
var forms = document.
querySelectorAll(".status-"+id+" .status-retweet");
2020-02-01 15:06:06 +00:00
for (var i = 0; i < forms.length; i++) {
updateActionForm(id, forms[i], reverseActions[action]);
}
2020-01-08 18:16:06 +00:00
var body = "csrf_token=" + encodeURIComponent(csrfToken);
2020-01-25 10:07:06 +00:00
var contentType = "application/x-www-form-urlencoded";
2020-06-21 17:18:12 +00:00
http("POST", "/fluoride/" + action + "/" + id,
body, contentType, function(res, type) {
if (antiDopamineMode)
return;
2020-01-08 18:16:06 +00:00
var data = JSON.parse(res);
var count = data.data;
2020-06-21 17:18:12 +00:00
if (count === 0)
2020-01-08 18:16:06 +00:00
count = "";
2020-06-21 17:18:12 +00:00
var counts = document.
querySelectorAll(".status-"+id+" .status-retweet-count");
2020-02-01 15:06:06 +00:00
for (var i = 0; i < counts.length; i++) {
2020-01-30 13:56:29 +00:00
if (count > 0) {
2020-02-01 15:06:06 +00:00
counts[i].innerHTML = "(" + count + ")";
2020-01-30 13:56:29 +00:00
} else {
2020-02-01 15:06:06 +00:00
counts[i].innerHTML = "";
2020-01-30 13:56:29 +00:00
}
2020-02-01 15:06:06 +00:00
}
2020-01-08 18:16:06 +00:00
}, function(err) {
2020-02-01 15:06:06 +00:00
for (var i = 0; i < forms.length; i++) {
updateActionForm(id, forms[i], action);
}
2020-01-08 18:16:06 +00:00
});
}
}
function isInView(el) {
var ract = el.getBoundingClientRect();
2020-06-21 17:18:12 +00:00
if (ract.top > 0 && ract.bottom < window.innerHeight)
return true;
return false;
}
2020-11-09 12:10:29 +00:00
function replyToLinkLocal(a) {
if (!a)
return;
var id = a.getAttribute("href");
2020-06-21 17:18:12 +00:00
if (!id || id[0] != "#")
return;
a.onmouseenter = function(event) {
2020-06-21 17:18:12 +00:00
var id = event.target.getAttribute("href");
var status = document.querySelector(id);
2020-06-21 17:18:12 +00:00
if (!status)
return;
if (isInView(status)) {
status.classList.add("highlight");
} else {
var copy = status.cloneNode(true);
copy.id = "reply-to-popup";
var ract = event.target.getBoundingClientRect();
if (ract.top > window.innerHeight / 2) {
copy.style.bottom = (window.innerHeight -
2020-06-21 17:18:12 +00:00
window.scrollY - ract.top) + "px";
}
event.target.parentElement.appendChild(copy);
}
}
a.onmouseleave = function(event) {
var popup = document.getElementById("reply-to-popup");
if (popup) {
event.target.parentElement.removeChild(popup);
} else {
2020-06-21 17:18:12 +00:00
var id = event.target.getAttribute("href");
document.querySelector(id)
.classList.remove("highlight");
}
}
}
2020-11-09 12:10:29 +00:00
var inMouseEnter = false;
function replyToLinkRemote(a) {
a.onmouseenter = function(event) {
inMouseEnter = true;
var id = event.target.getAttribute("href");
var arr = id.replace("/thread", "").split("#");
if (arr.length < 2)
return
id = arr[1].replace("status-", "");
if (statusCache[id]) {
var copy = document.createElement("div");
copy.innerHTML = statusCache[id];
copy = copy.firstElementChild;
copy.id = "reply-to-popup";
var ract = event.target.getBoundingClientRect();
if (ract.top > window.innerHeight / 2) {
copy.style.bottom = (window.innerHeight -
window.scrollY - ract.top) + "px";
}
event.target.parentElement.appendChild(copy);
} else {
http("GET", "/fluoride/status/"+id, null, null, function(res, type) {
statusCache[id] = res;
if (!inMouseEnter)
return;
var copy = document.createElement("div");
copy.innerHTML = res;
copy = copy.firstElementChild;
copy.id = "reply-to-popup";
var ract = event.target.getBoundingClientRect();
if (ract.top > window.innerHeight / 2) {
copy.style.bottom = (window.innerHeight -
window.scrollY - ract.top) + "px";
}
event.target.parentElement.appendChild(copy);
}, function(err) {
console.log("error:", err);
})
}
}
a.onmouseleave = function(event) {
inMouseEnter = false;
var popup = document.getElementById("reply-to-popup");
if (popup) {
popup.parentElement.removeChild(popup);
}
}
}
function handleReplyToLink(a) {
if (!a)
return;
var id = a.getAttribute("href");
if (!id)
return;
if (id[0] === "#") {
replyToLinkLocal(a);
} else if (id.indexOf("/thread/") === 0) {
replyToLinkRemote(a);
}
}
function handleReplyLink(a) {
a.onmouseenter = function(event) {
2020-06-21 17:18:12 +00:00
var id = event.target.getAttribute("href");
var status = document.querySelector(id);
2020-06-21 17:18:12 +00:00
if (!status)
return;
if (isInView(status)) {
status.classList.add("highlight");
} else {
var copy = status.cloneNode(true);
copy.id = "reply-popup";
var ract = event.target.getBoundingClientRect();
if (ract.left > window.innerWidth / 2) {
copy.style.right = (window.innerWidth -
2020-06-21 17:18:12 +00:00
ract.right - 12) + "px";
}
event.target.parentElement.appendChild(copy);
}
}
a.onmouseleave = function(event) {
var popup = document.getElementById("reply-popup");
if (popup) {
2020-06-21 17:18:12 +00:00
event.target.parentElement.removeChild(popup);
} else {
2020-06-21 17:18:12 +00:00
var id = event.target.getAttribute("href");
document.querySelector(id).classList.remove("highlight");
}
}
}
function handleStatusLink(a) {
if (a.classList.contains("mention"))
2020-11-14 17:58:34 +00:00
a.removeAttribute("target");
else
a.target = "_blank";
}
2020-01-08 18:16:06 +00:00
document.addEventListener("DOMContentLoaded", function() {
checkCSRFToken();
checkAntiDopamineMode();
2020-01-08 18:16:06 +00:00
var statuses = document.querySelectorAll(".status-container");
2020-02-01 15:06:06 +00:00
for (var i = 0; i < statuses.length; i++) {
2020-06-21 17:18:12 +00:00
var s = statuses[i];
2020-01-08 18:16:06 +00:00
var id = s.dataset.id;
var likeForm = s.querySelector(".status-like");
handleLikeForm(id, likeForm);
var retweetForm = s.querySelector(".status-retweet");
handleRetweetForm(id, retweetForm);
var replyToLink = s.querySelector(".status-reply-to-link");
handleReplyToLink(replyToLink);
var replyLinks = s.querySelectorAll(".status-reply-link");
2020-02-01 15:06:06 +00:00
for (var j = 0; j < replyLinks.length; j++) {
handleReplyLink(replyLinks[j]);
}
var links = s.querySelectorAll(".status-content a");
for (var j = 0; j < links.length; j++) {
handleStatusLink(links[j]);
}
2020-02-01 15:06:06 +00:00
}
2020-11-14 17:58:34 +00:00
var links = document.querySelectorAll(".user-profile-decription a");
for (var j = 0; j < links.length; j++) {
links[j].target = "_blank";
}
2020-01-08 18:16:06 +00:00
});
2020-01-26 09:21:26 +00:00
// @license-end