2024-02-21 23:17:19 +01:00
|
|
|
// news.js because new.js makes the TypeScript language server flip out.
|
|
|
|
// Likely because `new` is a keyword, but also, what the fuck.
|
|
|
|
|
2024-03-02 20:53:44 +01:00
|
|
|
import { getSettingValue } from "treehouse/settings.js";
|
|
|
|
import { Branch } from "treehouse/tree.js";
|
2024-02-21 23:17:19 +01:00
|
|
|
|
|
|
|
const seenStatesKey = "treehouse.news.seenBranches";
|
|
|
|
const seenStates = new Set(JSON.parse(localStorage.getItem(seenStatesKey)) || []);
|
|
|
|
|
|
|
|
let seenCount = seenStates.size;
|
|
|
|
let unseenCount = TREEHOUSE_NEWS_COUNT - seenCount;
|
|
|
|
|
|
|
|
function saveSeenStates() {
|
|
|
|
localStorage.setItem(seenStatesKey, JSON.stringify(Array.from(seenStates)));
|
|
|
|
}
|
|
|
|
|
|
|
|
function markAsRead(branch) {
|
|
|
|
if (!seenStates.has(branch.namedID) && seenCount > 0) {
|
|
|
|
let badge = document.createElement("span");
|
|
|
|
badge.classList.add("badge", "red", "before-content");
|
|
|
|
badge.textContent = "new";
|
|
|
|
|
|
|
|
branch.branchContent.firstChild.insertBefore(badge, branch.branchContent.firstChild.firstChild);
|
|
|
|
}
|
|
|
|
|
|
|
|
seenStates.add(branch.namedID);
|
|
|
|
}
|
|
|
|
|
|
|
|
export function initNewsPage() {
|
|
|
|
for (let [_, branch] of Branch.branchesByNamedID) {
|
|
|
|
markAsRead(branch);
|
|
|
|
}
|
|
|
|
saveSeenStates();
|
|
|
|
|
|
|
|
// If any branches are added past the initial load, add them to the seen set too.
|
|
|
|
Branch.onAdded.push(branch => {
|
|
|
|
markAsRead(branch);
|
|
|
|
saveSeenStates();
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
export function markAllAsUnread() {
|
|
|
|
localStorage.removeItem(seenStatesKey);
|
|
|
|
}
|
|
|
|
|
|
|
|
class New extends HTMLAnchorElement {
|
|
|
|
connectedCallback() {
|
|
|
|
// Do not show the badge to people who have never seen any news.
|
|
|
|
// It's just annoying in that case.
|
|
|
|
// In case you do not wish to see the badge anymore, go to the news page and uncheck the
|
|
|
|
// checkbox at the bottom.
|
|
|
|
let userSawNews = seenCount > 0;
|
|
|
|
let userWantsToSeeNews = getSettingValue("showNewPostIndicator");
|
|
|
|
if (userSawNews && userWantsToSeeNews && unseenCount > 0) {
|
|
|
|
this.newText = document.createElement("span");
|
|
|
|
this.newText.classList.add("new-text");
|
|
|
|
this.newText.textContent = this.textContent;
|
|
|
|
this.textContent = "";
|
|
|
|
this.appendChild(this.newText);
|
|
|
|
|
|
|
|
this.badge = document.createElement("span");
|
|
|
|
this.badge.classList.add("badge", "red");
|
|
|
|
this.badge.textContent = unseenCount.toString();
|
|
|
|
this.appendChild(this.badge);
|
|
|
|
this.classList.add("has-news");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
customElements.define("th-new", New, { extends: "a" });
|