diff --git a/pikit-web/assets/main.js b/pikit-web/assets/main.js index 1e1869d..f46be71 100644 --- a/pikit-web/assets/main.js +++ b/pikit-web/assets/main.js @@ -5,7 +5,7 @@ import { placeholderStatus, renderStats } from "./status.js"; import { initServiceControls, renderServices } from "./services.js"; import { initSettings } from "./settings.js"; import { initUpdateSettings, isUpdatesDirty } from "./update-settings.js"; -import { initReleaseUI } from "./releases.js?v=20251213f"; +import { initReleaseUI } from "./releases.js?v=20251213g"; const servicesGrid = document.getElementById("servicesGrid"); const heroStats = document.getElementById("heroStats"); diff --git a/pikit-web/assets/releases.js b/pikit-web/assets/releases.js index 3125602..5d3985f 100644 --- a/pikit-web/assets/releases.js +++ b/pikit-web/assets/releases.js @@ -45,6 +45,7 @@ export function initReleaseUI({ showToast, showBusy, hideBusy, confirmAction }) let releaseLogLines = []; let releaseLastFetched = 0; let lastReleaseLogKey = ""; + let lastReleaseToastKey = null; let changelogCache = { version: null, text: "" }; let lastChangelogUrl = null; let releaseChannel = "dev"; @@ -159,9 +160,9 @@ export function initReleaseUI({ showToast, showBusy, hideBusy, confirmAction }) logRelease(`Status: ${status}${progress ? " • " + progress : ""}${message ? " • " + message : ""}`); lastReleaseLogKey = key; } - releaseLastFetched = now; - if (status === "update_available" && message && message.startsWith("http")) { - lastChangelogUrl = message; + 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`; } @@ -200,11 +201,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"}`); } } @@ -242,6 +252,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 +285,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…"); diff --git a/pikit-web/index.html b/pikit-web/index.html index d89e4e7..1775070 100644 --- a/pikit-web/index.html +++ b/pikit-web/index.html @@ -726,7 +726,7 @@ - +