import { EventSlot } from "../events/EventSlot"; import { OnBlur, OnFocus, OnMouseDown, OnMouseLeave, OnMouseMove, OnMouseUp, OnTouchCancel, OnTouchEnd, OnTouchMove, OnTouchStart } from "../dom/EventListeners"; export class ActivityAnalyser { readonly onActive = new EventSlot(); readonly onPassive = new EventSlot(); private _timeOutDurationMS = 3000; private _active = false; get active(){ return this._active; } private _timeOutCallback:any = null; start() { let setActive = ()=> { this._cancelPassiveState(); if ( ! this._active ) { this._active = true; this.onActive.dispatch( null ); } this._reschedulePassiveState(); } let activeEvents = [ OnFocus, OnBlur, OnMouseMove, OnMouseDown, OnMouseUp, OnMouseLeave, OnTouchStart, OnTouchMove, OnTouchCancel, OnTouchEnd ]; activeEvents.forEach( ( onEvent )=> { onEvent.add( document.body, setActive ); } ) } private _cancelPassiveState() { if ( this._timeOutCallback ) { clearTimeout( this._timeOutCallback ); this._timeOutCallback = null; } } private _reschedulePassiveState() { this._cancelPassiveState(); this._timeOutCallback = setTimeout( ()=>{ this._setPassive(); }, this._timeOutDurationMS ); } private _setPassive() { if ( ! this._active ) { return; } this._active = false; this.onPassive.dispatch( null ); } }