release: bump version to 0.28.0

This commit is contained in:
linkong
2026-04-20 14:10:27 +08:00
parent 51ae5e6ec9
commit 4c21973197
12 changed files with 512 additions and 230 deletions

View File

@@ -1,5 +1,5 @@
import { showStatusMessage } from "./ui.js";
import { createHUDPanel } from "./hud-panels.js";
import { getActiveTVTab, openTVPanelTab, isTVPanelVisible, setTVPanelVisible } from "./tv.js";
const EARTH_NEWS_API = "/api/v1/news/earth-feed";
const FOCUS_UPDATE_INTERVAL_MS = 4000;
@@ -13,15 +13,11 @@ let payload = null;
let lastFocus = null;
let lastFetchAt = 0;
let lastRegionSwitchAt = 0;
let newsPanel = null;
function getElements() {
return {
panel: document.getElementById("news-panel"),
toggleBtn: document.getElementById("toggle-news"),
refreshBtn: document.getElementById("news-refresh"),
openBtn: document.getElementById("news-open-external"),
collapseBtn: document.getElementById("news-collapse"),
status: document.getElementById("news-board-status"),
focusLabel: document.getElementById("news-focus-label"),
focusCoords: document.getElementById("news-focus-coords"),
@@ -55,28 +51,14 @@ function formatRelativeTime(raw) {
export function updateNewsToggleUI(visible) {
const { toggleBtn } = getElements();
if (!toggleBtn) return;
toggleBtn.classList.toggle("active", visible);
const active = visible && getActiveTVTab() === "news";
toggleBtn.classList.toggle("active", active);
const tooltip = toggleBtn.querySelector(".earth-toolbar-tooltip");
if (tooltip) {
tooltip.textContent = visible ? "关闭态势新闻" : "打开态势新闻";
tooltip.textContent = active ? "关闭态势新闻" : "打开态势新闻";
}
}
function syncSettingsToggle(visible) {
const input = document.querySelector('[data-settings-panel="news-panel"]');
if (input instanceof HTMLInputElement) {
input.checked = visible;
}
}
export function setNewsPanelVisible(visible) {
const { panel } = getElements();
if (!panel) return;
newsPanel?.setVisible(visible);
updateNewsToggleUI(visible);
syncSettingsToggle(visible);
}
function renderEmptyState(message) {
const { board, empty, status, openBtn } = getElements();
if (board) board.innerHTML = "";
@@ -264,10 +246,6 @@ function openCurrentSourceHomepage() {
}
}
function setCollapsed(collapsed) {
newsPanel?.setCollapsed(collapsed);
}
export function updateNewsViewFocus(coords) {
if (!initialized) return;
if (!coords || typeof coords.lat !== "number" || typeof coords.lon !== "number") return;
@@ -301,34 +279,44 @@ export function initNewsPanel() {
if (initialized) return;
initialized = true;
const { panel, toggleBtn, refreshBtn, openBtn, collapseBtn } = getElements();
const { toggleBtn, refreshBtn, openBtn } = getElements();
if (panel && collapseBtn) {
newsPanel = createHUDPanel({
panel,
header: ".hud-panel__header",
body: "#news-panel-body",
collapseBtn,
preferredDirection: "down",
expandLabel: "展开新闻面板",
collapseLabel: "折叠新闻面板",
});
}
updateNewsToggleUI(true);
syncSettingsToggle(true);
updateNewsToggleUI(isTVPanelVisible());
renderEmptyState("正在准备全球态势新闻聚合源...");
toggleBtn?.addEventListener("click", async () => {
const nextVisible = !(newsPanel?.isVisible() ?? false);
setNewsPanelVisible(nextVisible);
if (nextVisible) {
try {
await ensureNewsPanelReady();
} catch {
// surface already handled
}
const openNewsTab = async () => {
openTVPanelTab("news");
updateNewsToggleUI(true);
try {
await ensureNewsPanelReady();
} catch {
// surface already handled
}
};
toggleBtn?.addEventListener("click", async () => {
const visible = isTVPanelVisible();
const active = visible && getActiveTVTab() === "news";
if (!visible) {
await openNewsTab();
return;
}
if (!active) {
await openNewsTab();
return;
}
setTVPanelVisible(false);
updateNewsToggleUI(false);
});
window.addEventListener("earth:tv-tab-change", () => {
updateNewsToggleUI(isTVPanelVisible());
});
window.addEventListener("earth:tv-visibility-change", (event) => {
updateNewsToggleUI(Boolean(event.detail?.visible));
});
refreshBtn?.addEventListener("click", async () => {
@@ -341,10 +329,6 @@ export function initNewsPanel() {
});
openBtn?.addEventListener("click", openCurrentSourceHomepage);
collapseBtn?.addEventListener("click", (event) => {
event.stopPropagation();
setCollapsed(!newsPanel?.isCollapsed());
});
refreshNews(undefined, undefined, { silent: true }).catch(() => {});
}