UNPKG

@hakit/core

Version:

A collection of React hooks and helpers for Home Assistant to easily communicate with the Home Assistant WebSocket API.

65 lines (64 loc) 3.67 kB
function y(d, p = {}) { const { suspendWhenHidden: m = !0, hiddenDelayMs: v = 3e5, // default 5 minutes debug: e = !1, onStatusChange: l } = p, f = v; let n = null, i = null, t = !1, s = null; d.connected ? (e && console.log("[SR] Connection is already active → handleSuspendResume will manage suspension"), l?.("connected")) : (e && console.log("[SR] Connection is not active"), l?.("disconnected")); function R() { if (e && console.log("[SR] onHidden() triggered"), !m) { e && console.log("[SR] suspendWhenHidden is false → skipping suspension"); return; } if (t) { e && console.log("[SR] Already suspended → skipping duplicate suspension"); return; } t = !0; const w = new Promise((h) => { n = () => { e && console.log("[SR] pendingResolve() called → lifting suspension"), t = !1, n = null, u(), h(), l?.("connected"); }; }); e && console.log("[SR] Calling connection.suspendReconnectUntil(...)"), l?.("pending-suspension"), d.suspendReconnectUntil(w), e && console.log(`[SR] Starting hidden delay of ${f}ms before actual suspend()`), i = typeof window < "u" ? window.setTimeout(() => { i = null, document.hidden ? (e && console.log("[SR] Hidden timeout elapsed → calling suspend()"), c(), S()) : n && (e && console.log("[SR] Hidden timeout elapsed but page is visible → resolving pendingResolve()"), n()); }, f) : null, typeof window < "u" && window.addEventListener("focus", o); } function o() { e && console.log("[SR] onVisibleOrResume() fired (page became visible)"), i !== null && (clearTimeout(i), i = null, e && console.log("[SR] Cleared hiddenTimeoutId (user returned before allotted time)")), n && (e && console.log("[SR] Resolving pendingResolve() on actual resume"), n()), u(); } function r() { document.hidden ? (e && console.log("[SR] visibilitychange → HIDDEN"), R()) : (e && console.log("[SR] visibilitychange → VISIBLE"), o()); } function a() { e && console.log("[SR] resume event fired"), o(); } function g() { e && console.log("[SR] pageshow event fired"), o(); } function S() { s === null && (typeof window > "u" || (s = window.setInterval(() => { document.hidden || (e && console.log("[SR] visibility polling detected VISIBLE"), o()); }, 2e3))); } function u() { s !== null && typeof window < "u" && (clearInterval(s), s = null); } function c() { if (!d.connected) { e && console.log("[SR] Connection already suspended → skipping suspend()"); return; } l?.("suspended"), e && console.log("[SR] suspend() called → suspending connection"), typeof window < "u" && window.stop(), d.suspend(); } return document.addEventListener("visibilitychange", r, !1), document.addEventListener("freeze", c), document.addEventListener("resume", a), document.addEventListener("pageshow", g), e && console.log("[SR] handleSuspendResume() initialized; debugging is ON"), () => { e && console.log("[SR] cleanup() called → removing listeners & clearing timeouts"), document.removeEventListener("visibilitychange", r, !1), document.removeEventListener("freeze", c), document.removeEventListener("resume", a), document.removeEventListener("pageshow", g), typeof window < "u" && window.removeEventListener("focus", o), i !== null && (e && console.log("[SR] cleanup: Clearing hiddenTimeoutId"), clearTimeout(i), i = null), u(), n && (e && console.log("[SR] cleanup: Resolving pendingResolve() to let reconnection proceed"), n(), n = null, t = !1); }; } export { y as handleSuspendResume }; //# sourceMappingURL=handleSuspendResume.js.map