mirror of
https://github.com/nuttylmao/nutty.gg.git
synced 2026-11-04 08:30:58 -05:00
77 lines
1.9 KiB
JavaScript
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();
|
|
}
|
|
}
|