@aidenlx/player
Version:
Headless web components that make integrating media on the a web a breeze.
64 lines (63 loc) • 1.78 kB
JavaScript
import "../../chunks/chunk.LNH2V2XS.js";
import { debounce, DisposalBin, listen, vdsEvent } from "@vidstack/foundation";
class MediaIdleController {
constructor(_host, _mediaStore) {
this._host = _host;
this._mediaStore = _mediaStore;
this._idle = false;
this._mediaPaused = false;
this._idlingPaused = false;
this._disposal = new DisposalBin();
this.delay = 2e3;
_host.addController(this);
}
get paused() {
return this._idlingPaused || this._mediaPaused;
}
set paused(paused) {
this._idlingPaused = paused;
this._handleIdleChange();
}
hostConnected() {
this._disposal.add(this._mediaStore.paused.subscribe(($paused) => {
this._mediaPaused = $paused;
this._handleIdleChange();
}));
const startIdleTimerEvents = ["pointerdown", "pointermove", "focus", "keydown"];
startIdleTimerEvents.forEach((eventType) => {
const off = listen(this._host, eventType, debounce(this._handleIdleChange.bind(this), 250, true));
this._disposal.add(off);
});
}
hostDisconnected() {
this._disposal.empty();
this._stopIdleTimer();
}
_handleIdleChange() {
if (this.paused) {
this._stopIdleTimer();
} else {
this._startIdleTimer();
}
}
_startIdleTimer() {
this._stopIdleTimer();
this._idleTimeout = window.setTimeout(() => {
this._dispatchIdleChange(!this.paused);
}, this.delay);
}
_stopIdleTimer() {
window.clearTimeout(this._idleTimeout);
this._idleTimeout = void 0;
this._dispatchIdleChange(false);
}
_dispatchIdleChange(isIdle) {
if (this._idle !== isIdle) {
this._host.dispatchEvent(vdsEvent("vds-idle-change", { detail: isIdle }));
this._idle = isIdle;
}
}
}
export {
MediaIdleController
};