import { AppendLoadingSymbol } from "@/seqta/ui/Loading"; import stringToHTML from "./stringToHTML"; import { delay } from "./delay"; import { settingsState } from "./listeners/SettingsState"; import browser from "webextension-polyfill"; import LogoLightOutline from "@/resources/icons/betterseqta-light-outline.png"; import { animate, stagger } from "motion"; export async function SendNewsPage() { console.info("[BetterSEQTA+] Started Loading News Page"); document.title = "News ― SEQTA Learn"; await delay(100); const element = document.querySelector("[data-key=news]"); element!.classList.add("active"); // Remove all current elements in the main div to add new elements const main = document.getElementById("main"); main!.innerHTML = ""; const html = stringToHTML(/* html */ `

Latest Headlines in ${settingsState.newsSource ? settingsState.newsSource.charAt(0).toUpperCase() + settingsState.newsSource.slice(1) : "Australia"}

`); main!.append(html.firstChild!); const titlediv = document.getElementById("title")!.firstChild; (titlediv! as HTMLElement).innerText = "News"; AppendLoadingSymbol("newsloading", "#news-container"); const response = (await browser.runtime.sendMessage({ type: "sendNews", source: settingsState.newsSource, })) as any; const newscontainer = document.querySelector("#news-container"); document.getElementById("newsloading")?.remove(); // Create a document fragment to batch DOM operations const fragment = document.createDocumentFragment(); // Map over articles to create elements response.news.articles.forEach((article: any) => { const newsarticle = document.createElement("a"); newsarticle.classList.add("NewsArticle"); newsarticle.href = article.url; newsarticle.target = "_blank"; const articleimage = document.createElement("div"); articleimage.classList.add("articleimage"); if (article.urlToImage == "null" || article.urlToImage == null) { articleimage.style.cssText = ` background-image: url(${browser.runtime.getURL(LogoLightOutline)}); width: 20%; margin: 0 7.5%; `; } else { articleimage.style.backgroundImage = `url(${article.urlToImage})`; } const articletext = document.createElement("div"); articletext.classList.add("ArticleText"); const title = document.createElement("a"); title.innerText = article.title; title.href = article.url; title.target = "_blank"; const description = document.createElement("p"); article.description = article.description.length > 400 ? article.description.substring(0, 400) + "..." : article.description; description.innerHTML = article.description; articletext.append(title, description); newsarticle.append(articleimage, articletext); fragment.append(newsarticle); }); // Single DOM update to append all articles newscontainer?.append(fragment); if (!settingsState.animations) return; const articles = Array.from(document.querySelectorAll(".NewsArticle")); animate( articles.slice(0, 20), { opacity: [0, 1], y: [10, 0], scale: [0.99, 1] }, { delay: stagger(0.1), type: "spring", stiffness: 341, damping: 20, mass: 1, }, ); }