import { _get, _post, toggleLoader, toDateString } from "../modules/common.js"; import { Marked, Renderer } from "@ts-stack/markdown"; interface updateDTO { new: boolean; update: Update; } export class Updater implements updater { private _update: Update; private _date: number; updateAvailable = false; checkForUpdates = (run?: (req: XMLHttpRequest) => void) => _get("/config/update", null, (req: XMLHttpRequest) => { if (req.readyState == 4) { if (req.status != 200) { window.notifications.customError("errorCheckUpdate", window.lang.notif("errorCheckUpdate")); return } let resp = req.response as updateDTO; if (resp.new) { this.update = resp.update; if (run) { run(req); } // } else { // window.notifications.customPositive("noUpdatesAvailable", "", window.lang.notif("noUpdatesAvailable")); } } }); get date(): number { return this._date; } set date(unix: number) { this._date = unix; document.getElementById("update-date").textContent = toDateString(new Date(this._date * 1000)); } get description(): string { return this._update.description; } set description(description: string) { this._update.description = description; const el = document.getElementById("update-description") as HTMLParagraphElement; el.textContent = description; if (this.version == "git") { el.classList.add("monospace"); } else { el.classList.remove("monospace"); } } get changelog(): string { return this._update.changelog; } set changelog(changelog: string) { this._update.changelog = changelog; document.getElementById("update-changelog").innerHTML = Marked.parse(changelog); } get version(): string { return this._update.version; } set version(version: string) { this._update.version = version; document.getElementById("update-version").textContent = version; } get commit(): string { return this._update.commit; } set commit(commit: string) { this._update.commit = commit; document.getElementById("update-commit").textContent = commit.slice(0, 7); } get link(): string { return this._update.link; } set link(link: string) { this._update.link = link; (document.getElementById("update-version") as HTMLAnchorElement).href = link; } get download_link(): string { return this._update.download_link; } set download_link(link: string) { this._update.download_link = link; } get can_update(): boolean { return this._update.can_update; } set can_update(can: boolean) { this._update.can_update = can; const download = document.getElementById("update-download") as HTMLSpanElement; const update = document.getElementById("update-update") as HTMLSpanElement; if (can) { download.classList.add("unfocused"); update.classList.remove("unfocused"); } else { download.onclick = () => window.open(this._update.download_link || this._update.link); download.classList.remove("unfocused"); update.classList.add("unfocused"); } } get update(): Update { return this._update; } set update(update: Update) { this._update = update; this.version = update.version; this.commit = update.commit; this.date = update.date; this.description = update.description; this.changelog = update.changelog; this.link = update.link; this.download_link = update.download_link; this.can_update = update.can_update; } constructor() { const update = document.getElementById("update-update") as HTMLSpanElement; update.onclick = () => { toggleLoader(update); _post("/config/update", null, (req: XMLHttpRequest) => { if (req.readyState == 4) { toggleLoader(update); if (req.status != 200) { window.notifications.customError("applyUpdateError", window.lang.notif("errorApplyUpdate")); } else { window.notifications.customSuccess("applyUpdate", window.lang.notif("updateApplied")); } window.modals.updateInfo.close(); } }); }; this.checkForUpdates(() => { this.updateAvailable = true; window.notifications.customPositive("updateAvailable", "", window.lang.notif("updateAvailable")); }); } }