From f365545b15041aedbbfaf04c5902316db58690c6 Mon Sep 17 00:00:00 2001 From: lklynet Date: Mon, 12 Jan 2026 15:10:15 -0500 Subject: [PATCH] Add version to diagnostics and fix update notification bug --- package.json | 2 +- public/index.html | 4 ++ public/js/version-checker.js | 119 +++++++++++++++++++---------------- 3 files changed, 71 insertions(+), 54 deletions(-) diff --git a/package.json b/package.json index bd07311..8750cde 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hypermind", - "version": "0.12.2", + "version": "0.13.0", "description": "A decentralized P2P counter of active deployments", "main": "server.js", "scripts": { diff --git a/public/index.html b/public/index.html index 53d0fec..34b52d4 100644 --- a/public/index.html +++ b/public/index.html @@ -104,6 +104,10 @@ >{{FULL_ID}} +
+ Version + {{VERSION}} +
Heartbeats Received 0 diff --git a/public/js/version-checker.js b/public/js/version-checker.js index 9f8dec6..c8e48e0 100644 --- a/public/js/version-checker.js +++ b/public/js/version-checker.js @@ -2,78 +2,91 @@ const CACHE_KEY = "hypermind-version-check"; const CACHE_DURATION = 86400000; const getCurrentVersion = () => { - return document.body.dataset.version || "no-version"; + return document.body.dataset.version || "no-version"; +}; + +const isNewer = (latest, current) => { + if (current === "no-version") return true; + + const l = latest.split(".").map(Number); + const c = current.split(".").map(Number); + + for (let i = 0; i < 3; i++) { + if (l[i] > (c[i] || 0)) return true; + if (l[i] < (c[i] || 0)) return false; + } + return false; }; const checkForNewVersion = async () => { - try { - const cached = localStorage.getItem(CACHE_KEY); - if (cached) { - try { - const parsedCache = JSON.parse(cached); - const now = Date.now(); + try { + const cached = localStorage.getItem(CACHE_KEY); + if (cached) { + try { + const parsedCache = JSON.parse(cached); + const now = Date.now(); - if (now - parsedCache.timestamp < CACHE_DURATION) { - if (parsedCache.data) { - showVersionNotification(parsedCache.data); - } - return; - } - } catch (e) { - localStorage.removeItem(CACHE_KEY); - } + if (now - parsedCache.timestamp < CACHE_DURATION) { + if (parsedCache.data) { + showVersionNotification(parsedCache.data); + } + return; } - - const response = await fetch("/api/github/latest-release"); - if (!response.ok) return; - - const release = await response.json(); - - const cacheData = { - data: release, - timestamp: Date.now(), - }; - localStorage.setItem(CACHE_KEY, JSON.stringify(cacheData)); - - showVersionNotification(release); - } catch (error) { - console.error("Error checking for new version:", error); + } catch (e) { + localStorage.removeItem(CACHE_KEY); + } } + + const response = await fetch("/api/github/latest-release"); + if (!response.ok) return; + + const release = await response.json(); + + const cacheData = { + data: release, + timestamp: Date.now(), + }; + localStorage.setItem(CACHE_KEY, JSON.stringify(cacheData)); + + showVersionNotification(release); + } catch (error) { + console.error("Error checking for new version:", error); + } }; const showVersionNotification = (release) => { - if (!release || !release.tag_name) return; + if (!release || !release.tag_name) return; - const latestVersion = release.tag_name.replace(/^v/, ""); - const currentVersion = getCurrentVersion(); + const latestVersion = release.tag_name.replace(/^v/, ""); + const currentVersion = getCurrentVersion(); - if (latestVersion === currentVersion) return; + if (!isNewer(latestVersion, currentVersion)) return; - const dismissedKey = `hypermind-version-dismissed-${release.tag_name}`; - if (localStorage.getItem(dismissedKey) === "true") return; + const dismissedKey = `hypermind-version-dismissed-${release.tag_name}`; + if (localStorage.getItem(dismissedKey) === "true") return; - const banner = document.getElementById("version-notification"); - if (!banner) return; + const banner = document.getElementById("version-notification"); + if (!banner) return; - const versionText = banner.querySelector(".version-text"); - const updateLink = banner.querySelector(".update-link"); - const dismissBtn = banner.querySelector(".dismiss-btn"); + const versionText = banner.querySelector(".version-text"); + const updateLink = banner.querySelector(".update-link"); + const dismissBtn = banner.querySelector(".dismiss-btn"); - versionText.textContent = `New version ${release.tag_name} available!`; - updateLink.href = release.html_url; + versionText.textContent = `New version ${release.tag_name} available!`; + updateLink.href = release.html_url; - dismissBtn.onclick = () => { - banner.classList.remove("active"); - localStorage.setItem(dismissedKey, "true"); - }; + dismissBtn.onclick = () => { + banner.classList.remove("active"); + localStorage.setItem(dismissedKey, "true"); + }; - setTimeout(() => { - banner.classList.add("active"); - }, 1000); + setTimeout(() => { + banner.classList.add("active"); + }, 1000); }; if (document.readyState === "loading") { - document.addEventListener("DOMContentLoaded", checkForNewVersion); + document.addEventListener("DOMContentLoaded", checkForNewVersion); } else { - checkForNewVersion(); + checkForNewVersion(); }