|
|
|
|
@@ -45,15 +45,19 @@ export function initReleaseUI({ showToast, showBusy, hideBusy, confirmAction })
|
|
|
|
|
let releaseLogLines = [];
|
|
|
|
|
let releaseLastFetched = 0;
|
|
|
|
|
let lastReleaseLogKey = "";
|
|
|
|
|
let lastReleaseToastKey = null;
|
|
|
|
|
let lastLogMessage = null;
|
|
|
|
|
let changelogCache = { version: null, text: "" };
|
|
|
|
|
let lastChangelogUrl = null;
|
|
|
|
|
let releaseChannel = "dev";
|
|
|
|
|
|
|
|
|
|
function logRelease(msg) {
|
|
|
|
|
if (!msg) return;
|
|
|
|
|
const plain = msg.trim();
|
|
|
|
|
if (plain === lastLogMessage) return;
|
|
|
|
|
lastLogMessage = plain;
|
|
|
|
|
const ts = new Date().toLocaleTimeString();
|
|
|
|
|
const line = `${ts} ${msg}`;
|
|
|
|
|
if (releaseLogLines[0] === line) return;
|
|
|
|
|
releaseLogLines.unshift(line);
|
|
|
|
|
releaseLogLines = releaseLogLines.slice(0, 120);
|
|
|
|
|
if (releaseLog) {
|
|
|
|
|
@@ -84,12 +88,8 @@ export function initReleaseUI({ showToast, showBusy, hideBusy, confirmAction })
|
|
|
|
|
const msg = shorten(message, 80) || "";
|
|
|
|
|
releaseFlagTop.title = msg || "Pi-Kit release status";
|
|
|
|
|
if (releaseStatusMsg) {
|
|
|
|
|
releaseStatusMsg.textContent =
|
|
|
|
|
status === "update_available"
|
|
|
|
|
? msg || "Update available"
|
|
|
|
|
: status === "up_to_date"
|
|
|
|
|
? msg || "Up to date"
|
|
|
|
|
: msg || status;
|
|
|
|
|
releaseStatusMsg.textContent = status === "update_available" ? msg || "Update available" : "";
|
|
|
|
|
releaseStatusMsg.classList.remove("error");
|
|
|
|
|
}
|
|
|
|
|
if (releaseLogStatus) {
|
|
|
|
|
releaseLogStatus.textContent =
|
|
|
|
|
@@ -154,14 +154,14 @@ export function initReleaseUI({ showToast, showBusy, hideBusy, confirmAction })
|
|
|
|
|
releaseChannel = channel || "dev";
|
|
|
|
|
if (releaseChannelToggle) releaseChannelToggle.checked = releaseChannel === "dev";
|
|
|
|
|
window.__lastReleaseState = data;
|
|
|
|
|
const key = [status, progress, message].join("|");
|
|
|
|
|
if (key !== lastReleaseLogKey) {
|
|
|
|
|
logRelease(`Status: ${status}${progress ? " • " + progress : ""}${message ? " • " + message : ""}`);
|
|
|
|
|
lastReleaseLogKey = key;
|
|
|
|
|
}
|
|
|
|
|
releaseLastFetched = now;
|
|
|
|
|
if (status === "update_available" && message && message.startsWith("http")) {
|
|
|
|
|
lastChangelogUrl = message;
|
|
|
|
|
const key = [status, progress, message].join("|");
|
|
|
|
|
if (key !== lastReleaseLogKey) {
|
|
|
|
|
logRelease(`Status: ${status}${progress ? " • " + progress : ""}${message ? " • " + message : ""}`);
|
|
|
|
|
lastReleaseLogKey = key;
|
|
|
|
|
}
|
|
|
|
|
releaseLastFetched = now;
|
|
|
|
|
if (status === "update_available" && message && message.startsWith("http")) {
|
|
|
|
|
lastChangelogUrl = message;
|
|
|
|
|
} else if (latest_version) {
|
|
|
|
|
lastChangelogUrl = `https://git.44r0n.cc/44r0n7/pi-kit/releases/download/v${latest_version}/CHANGELOG-${latest_version}.txt`;
|
|
|
|
|
}
|
|
|
|
|
@@ -177,10 +177,9 @@ export function initReleaseUI({ showToast, showBusy, hideBusy, confirmAction })
|
|
|
|
|
} catch (e) {
|
|
|
|
|
console.error("Failed to load release status", e);
|
|
|
|
|
setReleaseChip({ status: "error", message: "Failed to load" });
|
|
|
|
|
if (releaseStatusMsg) {
|
|
|
|
|
releaseStatusMsg.textContent = "Failed to load release status";
|
|
|
|
|
releaseStatusMsg.classList.add("error");
|
|
|
|
|
}
|
|
|
|
|
// surface via toast/log only; avoid inline red flashes
|
|
|
|
|
showToast("Failed to load release status", "error");
|
|
|
|
|
logRelease("Error: failed to load release status");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -200,11 +199,20 @@ export function initReleaseUI({ showToast, showBusy, hideBusy, confirmAction })
|
|
|
|
|
releaseBusyActive = false;
|
|
|
|
|
hideBusy();
|
|
|
|
|
if (releaseProgress) releaseProgress.textContent = "";
|
|
|
|
|
if (state.status === "up_to_date") {
|
|
|
|
|
showToast(state.message || "Update complete", "success");
|
|
|
|
|
// Only toast once per apply/rollback cycle
|
|
|
|
|
if (state.status === "up_to_date" && releaseBusyActive === false) {
|
|
|
|
|
const key = `ok-${state.current_version || ""}-${state.latest_version || ""}`;
|
|
|
|
|
if (lastReleaseToastKey !== key) {
|
|
|
|
|
lastReleaseToastKey = key;
|
|
|
|
|
showToast(state.message || "Update complete", "success");
|
|
|
|
|
}
|
|
|
|
|
logRelease("Update complete");
|
|
|
|
|
} else if (state.status === "error") {
|
|
|
|
|
showToast(state.message || "Update failed", "error");
|
|
|
|
|
const key = `err-${state.message || ""}`;
|
|
|
|
|
if (lastReleaseToastKey !== key) {
|
|
|
|
|
lastReleaseToastKey = key;
|
|
|
|
|
showToast(state.message || "Update failed", "error");
|
|
|
|
|
}
|
|
|
|
|
logRelease(`Error: ${state.message || "Update failed"}`);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@@ -218,8 +226,11 @@ export function initReleaseUI({ showToast, showBusy, hideBusy, confirmAction })
|
|
|
|
|
loadReleaseStatus(true);
|
|
|
|
|
});
|
|
|
|
|
releaseClose?.addEventListener("click", () => releaseModal?.classList.add("hidden"));
|
|
|
|
|
// Do not allow dismiss by clicking backdrop (consistency with other modals)
|
|
|
|
|
releaseModal?.addEventListener("click", (e) => {
|
|
|
|
|
if (e.target === releaseModal) releaseModal.classList.add("hidden");
|
|
|
|
|
if (e.target === releaseModal) {
|
|
|
|
|
e.stopPropagation();
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
releaseCheckBtn?.addEventListener("click", async () => {
|
|
|
|
|
@@ -242,6 +253,7 @@ export function initReleaseUI({ showToast, showBusy, hideBusy, confirmAction })
|
|
|
|
|
|
|
|
|
|
releaseApplyBtn?.addEventListener("click", async () => {
|
|
|
|
|
try {
|
|
|
|
|
lastReleaseToastKey = null;
|
|
|
|
|
const state = window.__lastReleaseState || {};
|
|
|
|
|
const { current_version, latest_version } = state;
|
|
|
|
|
const sameVersion =
|
|
|
|
|
@@ -274,6 +286,7 @@ export function initReleaseUI({ showToast, showBusy, hideBusy, confirmAction })
|
|
|
|
|
|
|
|
|
|
releaseRollbackBtn?.addEventListener("click", async () => {
|
|
|
|
|
try {
|
|
|
|
|
lastReleaseToastKey = null;
|
|
|
|
|
releaseBusyActive = true;
|
|
|
|
|
showBusy("Rolling back…", "Restoring previous backup.");
|
|
|
|
|
logRelease("Starting rollback…");
|
|
|
|
|
|