Upload via GUI (23 Dateien)

This commit is contained in:
2026-11-04 07:55:00 +00:00
parent 44d3b7308d
commit 8b64172140
7 changed files with 465 additions and 283 deletions
+35
View File
@@ -134,6 +134,41 @@ export async function openWeb(path) {
return chrome.tabs.create({ url: u.href });
}
/** Vergleicht zwei Versionsnummern ("2.0.0" gegen "2.1"): negativ, null oder positiv. Nicht-Zahlen zählen als 0. */
export function compareVersions(a, b) {
const pa = String(a).split(/[.+-]/).map((x) => parseInt(x, 10) || 0);
const pb = String(b).split(/[.+-]/).map((x) => parseInt(x, 10) || 0);
for (let i = 0; i < Math.max(pa.length, pb.length, 3); i++) {
const d = (pa[i] || 0) - (pb[i] || 0);
if (d !== 0) return d;
}
return 0;
}
const UPDATE_CHECK_EVERY_MS = 6 * 3600 * 1000;
/**
* Fragt den Server, ob es eine neuere Version dieser Erweiterung gibt (die Plugin-Webseite liefert sie über DeskHub). Das Ergebnis steht
* in storage.local unter "update": { version, notes, size, checkedAt } oder null, wenn die Erweiterung aktuell ist. Höchstens alle 6 Stunden,
* außer mit force. Netzwerkfehler ändern nichts.
*/
export async function checkForExtensionUpdate({ force = false } = {}) {
const session = await getSession();
if (!session) return null;
const { update, updateCheckedAt = 0 } = await chrome.storage.local.get(['update', 'updateCheckedAt']);
if (!force && Date.now() - updateCheckedAt < UPDATE_CHECK_EVERY_MS) return update || null;
try {
const { data } = await apiCall('app_update.php', { query: { platform: 'chrome' } });
const current = chrome.runtime.getManifest().version;
const newer = data?.available && data.version && compareVersions(data.version, current) > 0;
const info = newer ? { version: String(data.version), notes: String(data.notes || ''), size: Number(data.size) || 0, checkedAt: Date.now() } : null;
await chrome.storage.local.set({ update: info, updateCheckedAt: Date.now() });
return info;
} catch {
return update || null; // Fehler: beim nächsten Mal erneut
}
}
/** Maskiert Text und macht Zeilenumbrüche zu <br>: Der Server nimmt Ticket-Nachrichten als HTML an und bereinigt sie zusätzlich. */
export function plainToHtml(text) {
return String(text ?? '').replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\r\n|\r|\n/g, '<br>');