1
0
Fork 0
mirror of https://github.com/miniflux/v2.git synced 2025-08-11 17:51:01 +00:00

refactor(js): simplify some functions using modern JavaScript

This commit is contained in:
Frédéric Guillot 2025-08-02 13:59:58 -07:00
parent b116da85a9
commit bbe3c2ea71

View file

@ -451,30 +451,23 @@ function showKeyboardShortcuts() {
*/
function markPageAsRead() {
const items = getVisibleEntries();
const entryIDs = [];
if (items.length === 0) return;
items.forEach((element) => {
const entryIDs = items.map((element) => {
element.classList.add("item-status-read");
entryIDs.push(parseInt(element.dataset.id, 10));
return parseInt(element.dataset.id, 10);
});
if (entryIDs.length > 0) {
updateEntriesStatus(entryIDs, "read", () => {
// Make sure the Ajax request reach the server before we reload the page.
updateEntriesStatus(entryIDs, "read", () => {
const element = document.querySelector(":is(a, button)[data-action=markPageAsRead]");
const showOnlyUnread = element?.dataset.showOnlyUnread || false;
const element = document.querySelector(":is(a, button)[data-action=markPageAsRead]");
let showOnlyUnread = false;
if (element) {
showOnlyUnread = element.dataset.showOnlyUnread || false;
}
if (showOnlyUnread) {
window.location.href = window.location.href;
} else {
goToPage("next", true);
}
});
}
if (showOnlyUnread) {
window.location.reload();
} else {
goToPage("next", true);
}
});
}
/**
@ -600,9 +593,9 @@ function updateEntriesStatus(entryIDs, status, callback) {
}
if (status === "read") {
decrementUnreadCounter(count);
updateUnreadCounterValue(-count);
} else {
incrementUnreadCounter(count);
updateUnreadCounterValue(count);
}
});
});
@ -672,9 +665,7 @@ function handleBookmark(element) {
*/
function toggleBookmark(parentElement, toasting) {
const buttonElement = parentElement.querySelector(":is(a, button)[data-toggle-bookmark]");
if (!buttonElement) {
return;
}
if (!buttonElement) return;
buttonElement.textContent = "";
insertIconLabelElement(buttonElement, buttonElement.dataset.labelLoading);
@ -683,20 +674,14 @@ function toggleBookmark(parentElement, toasting) {
request.withCallback(() => {
const currentStarStatus = buttonElement.dataset.value;
const newStarStatus = currentStarStatus === "star" ? "unstar" : "star";
const isStarred = currentStarStatus === "star";
let iconElement, label;
if (currentStarStatus === "star") {
iconElement = document.querySelector("template#icon-star");
label = buttonElement.dataset.labelStar;
if (toasting) {
showToast(buttonElement.dataset.toastUnstar, iconElement);
}
} else {
iconElement = document.querySelector("template#icon-unstar");
label = buttonElement.dataset.labelUnstar;
if (toasting) {
showToast(buttonElement.dataset.toastStar, iconElement);
}
const iconElement = document.querySelector(isStarred ? "template#icon-star" : "template#icon-unstar");
const label = isStarred ? buttonElement.dataset.labelStar : buttonElement.dataset.labelUnstar;
if (toasting) {
const toastKey = isStarred ? "toastUnstar" : "toastStar";
showToast(buttonElement.dataset[toastKey], iconElement);
}
buttonElement.replaceChildren(iconElement.content.cloneNode(true));
@ -712,14 +697,10 @@ function toggleBookmark(parentElement, toasting) {
* @returns {void}
*/
function handleFetchOriginalContent() {
if (isListView()) {
return;
}
if (isListView()) return;
const buttonElement = document.querySelector(":is(a, button)[data-fetch-content-entry]");
if (!buttonElement) {
return;
}
if (!buttonElement) return;
const previousElement = buttonElement.cloneNode(true);
@ -732,7 +713,7 @@ function handleFetchOriginalContent() {
buttonElement.appendChild(previousElement);
response.json().then((data) => {
if (data.hasOwnProperty("content") && data.hasOwnProperty("reading_time")) {
if (data.content && data.reading_time) {
document.querySelector(".entry-content").innerHTML = ttpolicy.createHTML(data.content);
const entryReadingtimeElement = document.querySelector(".entry-reading-time");
if (entryReadingtimeElement) {
@ -752,7 +733,7 @@ function handleFetchOriginalContent() {
*/
function openOriginalLink(openLinkInCurrentTab) {
const entryLink = document.querySelector(".entry h1 a");
if (entryLink !== null) {
if (entryLink) {
if (openLinkInCurrentTab) {
window.location.href = entryLink.getAttribute("href");
} else {
@ -762,7 +743,7 @@ function openOriginalLink(openLinkInCurrentTab) {
}
const currentItemOriginalLink = document.querySelector(".current-item :is(a, button)[data-original-link]");
if (currentItemOriginalLink !== null) {
if (currentItemOriginalLink) {
openNewTab(currentItemOriginalLink.getAttribute("href"));
const currentItem = document.querySelector(".current-item");
@ -781,19 +762,13 @@ function openOriginalLink(openLinkInCurrentTab) {
* @returns {void}
*/
function openCommentLink(openLinkInCurrentTab) {
if (!isListView()) {
const entryLink = document.querySelector(":is(a, button)[data-comments-link]");
if (entryLink !== null) {
if (openLinkInCurrentTab) {
window.location.href = entryLink.getAttribute("href");
} else {
openNewTab(entryLink.getAttribute("href"));
}
}
} else {
const currentItemCommentsLink = document.querySelector(".current-item :is(a, button)[data-comments-link]");
if (currentItemCommentsLink !== null) {
openNewTab(currentItemCommentsLink.getAttribute("href"));
const entryLink = document.querySelector(isListView() ? ".current-item :is(a, button)[data-comments-link]" : ":is(a, button)[data-comments-link]");
if (entryLink) {
if (openLinkInCurrentTab) {
window.location.href = entryLink.getAttribute("href");
} else {
openNewTab(entryLink.getAttribute("href"));
}
}
}
@ -806,7 +781,7 @@ function openCommentLink(openLinkInCurrentTab) {
*/
function openSelectedItem() {
const currentItemLink = document.querySelector(".current-item .item-title a");
if (currentItemLink !== null) {
if (currentItemLink) {
window.location.href = currentItemLink.getAttribute("href");
}
}
@ -815,17 +790,11 @@ function openSelectedItem() {
* Unsubscribe from the feed of the currently selected item.
*/
function unsubscribeFromFeed() {
const unsubscribeLinks = document.querySelectorAll("[data-action=remove-feed]");
if (unsubscribeLinks.length === 1) {
const unsubscribeLink = unsubscribeLinks[0];
const unsubscribeLink = document.querySelector("[data-action=remove-feed]");
if (unsubscribeLink) {
const request = new RequestBuilder(unsubscribeLink.dataset.url);
request.withCallback(() => {
if (unsubscribeLink.dataset.redirectUrl) {
window.location.href = unsubscribeLink.dataset.redirectUrl;
} else {
window.location.reload();
}
window.location.href = unsubscribeLink.dataset.redirectUrl || window.location.href;
});
request.execute();
}
@ -836,54 +805,26 @@ function unsubscribeFromFeed() {
*/
function scrollToCurrentItem() {
const currentItem = document.querySelector(".current-item");
if (currentItem !== null) {
if (currentItem) {
scrollPageTo(currentItem, true);
}
}
/**
* Decrement the unread counter by a specified amount.
*
* @param {number} n - The amount to decrement the counter by.
*/
function decrementUnreadCounter(n) {
updateUnreadCounterValue((current) => {
return current - n;
});
}
/**
* Increment the unread counter by a specified amount.
*
* @param {number} n - The amount to increment the counter by.
*/
function incrementUnreadCounter(n) {
updateUnreadCounterValue((current) => {
return current + n;
});
}
/**
* Update the unread counter value.
*
* @param {function} callback - The function to call with the old value.
* @param {number} delta - The amount to change the counter by.
*/
function updateUnreadCounterValue(callback) {
function updateUnreadCounterValue(delta) {
document.querySelectorAll("span.unread-counter").forEach((element) => {
const oldValue = parseInt(element.textContent, 10);
element.textContent = callback(oldValue);
element.textContent = oldValue + delta;
});
if (window.location.href.endsWith('/unread')) {
const oldValue = parseInt(document.title.split('(')[1], 10);
const newValue = callback(oldValue);
document.title = document.title.replace(
/(.*?)\(\d+\)(.*?)/,
function (match, prefix, suffix, offset, string) {
return prefix + '(' + newValue + ')' + suffix;
}
);
const newValue = oldValue + delta;
document.title = document.title.replace(/(.*?)\(\d+\)(.*?)/, `$1(${newValue})$2`);
}
}
@ -970,9 +911,7 @@ function showToast(toastMessage, iconElement) {
const toastElementWrapper = document.getElementById("toast-wrapper");
toastElementWrapper.classList.remove('toast-animate');
setTimeout(() => {
toastElementWrapper.classList.add('toast-animate');
}, 100);
setTimeout(() => toastElementWrapper.classList.add('toast-animate'), 100);
}
/**