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:
parent
b116da85a9
commit
bbe3c2ea71
1 changed files with 45 additions and 106 deletions
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue