From 1d56d1e27f02e19a49e66fbe3cdaa650dc2b7695 Mon Sep 17 00:00:00 2001 From: Zaine Arch Date: Sun, 22 Feb 2026 22:15:43 +0000 Subject: [PATCH] testing --- app.js | 4 - app.js~ | 329 +++++++++++++++++++++++++++++++++++++++----------------- 2 files changed, 232 insertions(+), 101 deletions(-) diff --git a/app.js b/app.js index 11ea8a7..d31ac2e 100644 --- a/app.js +++ b/app.js @@ -206,10 +206,6 @@ function setDailyMessage() { } setDailyMessage(); -/* ========================================= - COUNTDOWN -========================================= */ - /* ========================================= COUNTDOWN (LIVE - UPDATES EVERY SECOND) ========================================= */ diff --git a/app.js~ b/app.js~ index 1d3239b..11ea8a7 100644 --- a/app.js~ +++ b/app.js~ @@ -1,118 +1,253 @@ -const statusEl = document.getElementById("status"); const healthEl = document.getElementById("health"); +const globalStatus = document.getElementById("globalStatus"); +const lastUpdated = document.getElementById("lastUpdated"); + +const serverDot = document.getElementById("serverDot"); +const webDot = document.getElementById("webDot"); +const roamDot = document.getElementById("roamDot"); + const buildBtn = document.getElementById("buildBtn"); const buildResultEl = document.getElementById("buildResult"); - -async function fetchStatus() { - try { - const res = await fetch("/api/status"); - const text = await res.text(); - statusEl.textContent = text; - statusEl.className = "badge ok"; - } catch { - statusEl.textContent = "ERROR"; - statusEl.className = "badge error"; - } -} - -async function fetchHealth() { - try { - const res = await fetch("/api/health"); - const text = await res.text(); - healthEl.textContent = text; - healthEl.className = "badge ok"; - } catch { - healthEl.textContent = "ERROR"; - healthEl.className = "badge error"; - } -} - -async function runBuild() { - buildBtn.disabled = true; - buildResultEl.textContent = "Running build..."; - buildResultEl.className = "muted"; - - try { - const res = await fetch("/api/build", { - method: "POST" - }); - - if (!res.ok) { - throw new Error("Build failed"); - } - - const text = await res.text(); - buildResultEl.textContent = text || "Build started successfully"; - } catch (err) { - buildResultEl.textContent = "Build failed"; - } finally { - buildBtn.disabled = false; - } -} const logOutput = document.getElementById("logOutput"); -function streamLogs() { - const eventSource = new EventSource("/api/build/logs"); - - eventSource.onmessage = function(event) { - logOutput.textContent += event.data + "\n"; - logOutput.scrollTop = logOutput.scrollHeight; - }; - - eventSource.onerror = function() { - eventSource.close(); - }; -} - -streamLogs(); -// Initial load -fetchStatus(); -fetchHealth(); - -// Button handler -buildBtn.addEventListener("click", runBuild); - const orgRoamBtn = document.getElementById("orgRoamBtn"); const orgRoamResult = document.getElementById("orgRoamResult"); const orgRoamLogs = document.getElementById("orgRoamLogs"); -let orgRoamEventSource = null; +let webEventSource = null; +let roamEventSource = null; -async function runOrgRoamBuild() { - - orgRoamBtn.disabled = true; - orgRoamLogs.textContent = ""; // 🔥 clear logs each run - orgRoamResult.textContent = "Running make..."; +/* ========================================= + HEALTH +========================================= */ +async function fetchHealth() { try { - const res = await fetch("/api/orgroam/build", { method: "POST" }); + const res = await fetch("/api/health"); + const text = await res.text(); - if (!res.ok) { - throw new Error("Build failed"); - } + healthEl.textContent = "Online"; + healthEl.className = "badge ok"; - orgRoamResult.textContent = "Build started"; + serverDot.className = "dot green"; + globalStatus.className = "global-ok"; + globalStatus.textContent = "🟢 All Systems Running Normally"; - if (orgRoamEventSource) { - orgRoamEventSource.close(); - } + lastUpdated.textContent = + "Last checked: " + new Date().toLocaleTimeString(); - orgRoamEventSource = new EventSource("/api/orgroam/logs"); + } catch { + healthEl.textContent = "Offline"; + healthEl.className = "badge error"; - orgRoamEventSource.onmessage = function(event) { - orgRoamLogs.textContent += event.data + "\n"; - orgRoamLogs.scrollTop = orgRoamLogs.scrollHeight; - }; - - orgRoamEventSource.onerror = function() { - orgRoamEventSource.close(); - }; - - } catch (err) { - orgRoamResult.textContent = "Build failed"; - } finally { - orgRoamBtn.disabled = false; + serverDot.className = "dot red"; + globalStatus.className = "global-error"; + globalStatus.textContent = "⚠ Attention Required"; } } +// Auto refresh every 10s +setInterval(fetchHealth, 10000); + +/* ========================================= + LOG TOGGLE +========================================= */ + +document.querySelectorAll(".toggleLogs").forEach(btn => { + btn.addEventListener("click", () => { + const target = document.getElementById(btn.dataset.target); + target.classList.toggle("hidden"); + + btn.textContent = + target.classList.contains("hidden") + ? "Show technical details" + : "Hide technical details"; + }); +}); + +/* ========================================= + STREAM HELPERS +========================================= */ + +function startLogStream(url, outputEl, setter) { + const source = new EventSource(url); + + source.onmessage = (event) => { + outputEl.textContent += event.data + "\n"; + outputEl.scrollTop = outputEl.scrollHeight; + }; + + source.onerror = () => { + source.close(); + }; + + setter(source); +} + +function closeStream(source) { + if (source) source.close(); +} + +/* ========================================= + WEBSITE BUILD +========================================= */ + +async function runWebBuild() { + if (!confirm("This will update the website. Continue?")) return; + + buildBtn.disabled = true; + buildResultEl.textContent = "🔄 Updating website..."; + webDot.className = "dot yellow"; + logOutput.textContent = ""; + + try { + const res = await fetch("/api/build-web", { method: "POST" }); + if (!res.ok) throw new Error(); + + closeStream(webEventSource); + + startLogStream("/api/build-web/logs", logOutput, src => webEventSource = src); + + pollWebStatus(); + + } catch { + buildResultEl.textContent = "❌ Could not start update"; + buildBtn.disabled = false; + webDot.className = "dot red"; + } +} + +async function pollWebStatus() { + const interval = setInterval(async () => { + const res = await fetch("/api/build-web/status"); + const status = await res.json(); + + if (!status.running) { + clearInterval(interval); + closeStream(webEventSource); + buildBtn.disabled = false; + + if (status.lastExitCode === 0) { + buildResultEl.textContent = "✅ Website updated successfully"; + webDot.className = "dot green"; + } else { + buildResultEl.textContent = + "⚠ Update finished with issue (code " + status.lastExitCode + ")"; + webDot.className = "dot red"; + } + } + }, 2000); +} + +/* ========================================= + ORG ROAM BUILD +========================================= */ + +async function runOrgRoamBuild() { + if (!confirm("Refresh the knowledge base?")) return; + + orgRoamBtn.disabled = true; + orgRoamResult.textContent = "🔄 Refreshing notes..."; + roamDot.className = "dot yellow"; + orgRoamLogs.textContent = ""; + + try { + const res = await fetch("/api/build-roam", { method: "POST" }); + if (!res.ok) throw new Error(); + + closeStream(roamEventSource); + + startLogStream("/api/build-roam/logs", orgRoamLogs, src => roamEventSource = src); + + pollRoamStatus(); + + } catch { + orgRoamResult.textContent = "❌ Could not start refresh"; + orgRoamBtn.disabled = false; + roamDot.className = "dot red"; + } +} + +async function pollRoamStatus() { + const interval = setInterval(async () => { + const res = await fetch("/api/build-roam/status"); + const status = await res.json(); + + if (!status.running) { + clearInterval(interval); + closeStream(roamEventSource); + orgRoamBtn.disabled = false; + + if (status.lastExitCode === 0) { + orgRoamResult.textContent = "✅ Notes refreshed successfully"; + roamDot.className = "dot green"; + } else { + orgRoamResult.textContent = + "⚠ Refresh finished with issue (code " + status.lastExitCode + ")"; + roamDot.className = "dot red"; + } + } + }, 2000); +} + +/* ========================================= + DAILY MESSAGE +========================================= */ + +const messages = [ + "You are my favourite person.", +]; + +function setDailyMessage() { + const today = new Date().toDateString(); + const index = today.split("").reduce((acc, char) => acc + char.charCodeAt(0), 0) % messages.length; + + document.getElementById("dailyMessage").textContent = messages[index]; +} + +setDailyMessage(); +/* ========================================= + COUNTDOWN +========================================= */ + +/* ========================================= + COUNTDOWN (LIVE - UPDATES EVERY SECOND) +========================================= */ + +function startCountdown() { + const targetDate = new Date("2026-08-03T00:00:00"); // change this + const label = "Nikah"; + + const countdownEl = document.getElementById("countdownText"); + + function updateCountdown() { + const now = new Date(); + const diff = targetDate - now; + + if (diff <= 0) { + countdownEl.textContent = `${label} is happening now! 🎉`; + clearInterval(interval); + return; + } + + const days = Math.floor(diff / (1000 * 60 * 60 * 24)); + const hours = Math.floor((diff / (1000 * 60 * 60)) % 24); + const minutes = Math.floor((diff / (1000 * 60)) % 60); + const seconds = Math.floor((diff / 1000) % 60); + + countdownEl.textContent = + `${label} in ${days}d ${hours}h ${minutes}m ${seconds}s`; + } + + updateCountdown(); + const interval = setInterval(updateCountdown, 1000); +} + +startCountdown(); +/* ========================================= + INIT +========================================= */ + +fetchHealth(); +buildBtn.addEventListener("click", runWebBuild); orgRoamBtn.addEventListener("click", runOrgRoamBuild);