import { html, LitElement } from "lit"; import { resolveMarkdown } from "lit-markdown"; import { customElement, property, query } from "lit/decorators.js"; import version from "resources/version.txt?raw"; import { translateText } from "../client/Utils"; import "./components/baseComponents/Modal"; import { BaseModal } from "./components/BaseModal"; import changelog from "/changelog.md?url"; import megaphone from "/images/Megaphone.svg?url"; @customElement("news-modal") export class NewsModal extends BaseModal { @property({ type: String }) markdown = "Loading..."; private initialized: boolean = false; render() { const content = html`
${translateText("news.title")}
${resolveMarkdown(this.markdown, { includeImages: true, includeCodeBlockClassNames: true, })}
`; if (this.inline) { return content; } return html` ${content} `; } protected onOpen(): void { if (!this.initialized) { this.initialized = true; fetch(changelog) .then((response) => (response.ok ? response.text() : "Failed to load")) .then((markdown) => markdown // Convert bold header lines (e.g. "**Title**") into real Markdown headers // Exclude lines starting with - or * to avoid converting bullet points .replace(/^([^\-*\s].*?) \*\*(.+?)\*\*$/gm, "## $1 $2") .replace( /(? `[#${prNumber}](https://github.com/openfrontio/OpenFrontIO/pull/${prNumber})`, ) .replace( /(? `[${comparison}](https://github.com/openfrontio/OpenFrontIO/compare/${comparison})`, ), ) .then((markdown) => (this.markdown = markdown)); } } } @customElement("news-button") export class NewsButton extends LitElement { @query("news-modal") private newsModal!: NewsModal; connectedCallback() { super.connectedCallback(); this.checkForNewVersion(); } private checkForNewVersion() { const lastSeenVersion = localStorage.getItem("last-seen-version"); if (lastSeenVersion !== null && lastSeenVersion !== version) { setTimeout(() => { this.open(); }, 500); } } public open() { localStorage.setItem("last-seen-version", version); this.newsModal.open(); } render() { return html` `; } }