chore: prep 0.1.2 release, tidy repo
This commit is contained in:
100
pikit-web/assets/status-controller.js
Normal file
100
pikit-web/assets/status-controller.js
Normal file
@@ -0,0 +1,100 @@
|
||||
// Status polling and UI flag helpers
|
||||
import { placeholderStatus, renderStats } from "./status.js";
|
||||
import { renderServices } from "./services.js";
|
||||
|
||||
export function createStatusController({
|
||||
heroStats,
|
||||
servicesGrid,
|
||||
updatesFlagTop,
|
||||
updatesNoteTop,
|
||||
tempFlagTop,
|
||||
readyOverlay,
|
||||
logUi,
|
||||
showToast = () => {},
|
||||
onReadyWait = null,
|
||||
getStatus,
|
||||
isUpdatesDirty,
|
||||
releaseUIGetter = () => null,
|
||||
setUpdatesUI = null,
|
||||
updatesFlagEl = null,
|
||||
}) {
|
||||
let lastStatusData = null;
|
||||
|
||||
function setTempFlag(tempC) {
|
||||
if (!tempFlagTop) return;
|
||||
const t = typeof tempC === "number" ? tempC : null;
|
||||
let label = "Temp: n/a";
|
||||
tempFlagTop.classList.remove("chip-on", "chip-warm", "chip-off");
|
||||
if (t !== null) {
|
||||
if (t < 55) {
|
||||
label = "Temp: OK";
|
||||
tempFlagTop.classList.add("chip-on");
|
||||
} else if (t < 70) {
|
||||
label = "Temp: Warm";
|
||||
tempFlagTop.classList.add("chip-warm");
|
||||
} else {
|
||||
label = "Temp: Hot";
|
||||
tempFlagTop.classList.add("chip-off");
|
||||
}
|
||||
}
|
||||
tempFlagTop.textContent = label;
|
||||
}
|
||||
|
||||
function updatesFlagEl(enabled) {
|
||||
if (!updatesFlagTop) return;
|
||||
const labelOn = "System updates: On";
|
||||
const labelOff = "System updates: Off";
|
||||
updatesFlagTop.textContent =
|
||||
enabled === true ? labelOn : enabled === false ? labelOff : "System updates";
|
||||
updatesFlagTop.className = "status-chip quiet chip-system";
|
||||
if (enabled === false) updatesFlagTop.classList.add("chip-off");
|
||||
}
|
||||
|
||||
async function loadStatus() {
|
||||
try {
|
||||
const data = await getStatus();
|
||||
lastStatusData = data;
|
||||
renderStats(heroStats, data);
|
||||
renderServices(servicesGrid, data.services, { openAddService: window.__pikitOpenAddService });
|
||||
const updatesEnabled = data?.auto_updates?.enabled ?? data.auto_updates_enabled;
|
||||
if (updatesEnabled !== undefined && !isUpdatesDirty()) {
|
||||
setUpdatesUI?.(updatesEnabled);
|
||||
}
|
||||
updatesFlagEl?.(updatesEnabled === undefined ? null : updatesEnabled === true);
|
||||
|
||||
const cfg = data.updates_config || {};
|
||||
const rebootReq = data.reboot_required;
|
||||
setTempFlag(data.cpu_temp_c);
|
||||
if (updatesNoteTop) {
|
||||
updatesNoteTop.textContent = "";
|
||||
updatesNoteTop.classList.remove("note-warn");
|
||||
if (rebootReq) {
|
||||
if (cfg.auto_reboot) {
|
||||
updatesNoteTop.textContent = `Reboot scheduled at ${cfg.reboot_time || "02:00"}.`;
|
||||
} else {
|
||||
updatesNoteTop.textContent = "Reboot required. Please reboot when you can.";
|
||||
updatesNoteTop.classList.add("note-warn");
|
||||
}
|
||||
}
|
||||
}
|
||||
if (readyOverlay) {
|
||||
if (data.ready) {
|
||||
readyOverlay.classList.add("hidden");
|
||||
} else {
|
||||
readyOverlay.classList.remove("hidden");
|
||||
onReadyWait?.();
|
||||
}
|
||||
}
|
||||
releaseUIGetter()?.refreshStatus();
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
logUi?.(`Status refresh failed: ${e?.message || e}`, "error");
|
||||
if (!lastStatusData) {
|
||||
renderStats(heroStats, placeholderStatus);
|
||||
}
|
||||
setTimeout(loadStatus, 2000);
|
||||
}
|
||||
}
|
||||
|
||||
return { loadStatus, setTempFlag, updatesFlagEl };
|
||||
}
|
||||
Reference in New Issue
Block a user