Files
nutty-tools/.common/utils/connection-status.js
T
2026-10-20 10:40:46 +11:00

77 lines
1.9 KiB
JavaScript

class ConnectionStatus {
constructor({
target = document.body,
name = "Service",
disconnectedMessage,
className = "",
showDelay = 0,
} = {}) {
this.name = name;
this.showDelay = showDelay;
this.wasConnected = false;
this.disconnectTimer = null;
// Generate a CSS class from the service name.
const serviceClass = {
"Streamer.bot": "connection-status--streamerbot",
}[name] || "";
this.element = document.createElement("div");
this.element.className = [
"connection-status",
serviceClass,
className
].filter(Boolean).join(" ");
this.element.setAttribute("role", "status");
this.element.setAttribute("aria-live", "polite");
this.element.hidden = true;
this.disconnectedMessage =
disconnectedMessage ?? `${name} disconnected`;
target.appendChild(this.element);
}
setConnected(connected) {
clearTimeout(this.disconnectTimer);
this.disconnectTimer = null;
if (connected) {
this.wasConnected = true;
this.hide();
return;
}
this.disconnectTimer = setTimeout(() => {
this.show(this.disconnectedMessage);
}, this.showDelay);
}
show(message) {
this.element.textContent = message;
this.element.hidden = false;
this.element.classList.remove("is-visible");
void this.element.offsetHeight;
this.element.classList.add("is-visible");
}
hide() {
this.element.classList.remove("is-visible");
setTimeout(() => {
if (!this.element.classList.contains("is-visible")) {
this.element.hidden = true;
}
}, 220);
}
destroy() {
clearTimeout(this.disconnectTimer);
this.element.remove();
}
}