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, }, ) }