idle-detect
Version:
A TypeScript library for inactivity timer, which utilises `IdleDetector` API where possible or a fallback to `window.setTimeout` approach
91 lines (90 loc) • 4.27 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.IdleDetectIsomorph = exports.ScreenIdleState = exports.UserIdleState = exports.isIdleDetectorSupported = void 0;
const IdleDetect_1 = require("./IdleDetect");
const isIdleDetectorSupported = () => 'IdleDetector' in window;
exports.isIdleDetectorSupported = isIdleDetectorSupported;
var UserIdleState;
(function (UserIdleState) {
UserIdleState["active"] = "active";
UserIdleState["idle"] = "idle";
})(UserIdleState = exports.UserIdleState || (exports.UserIdleState = {}));
var ScreenIdleState;
(function (ScreenIdleState) {
ScreenIdleState["locked"] = "locked";
ScreenIdleState["unlocked"] = "unlocked";
})(ScreenIdleState = exports.ScreenIdleState || (exports.ScreenIdleState = {}));
class IdleDetectIsomorph extends IdleDetect_1.IdleDetect {
/**
* @param idleSeconds Number of seconds for idle detection, 15 minutes by default
* @param onIdle Event handler when user is idle for specified time
* @param enableLogs
* @param eventTypes
*/
constructor(idleSeconds = IdleDetect_1.defaultIdleTime, onIdle = IdleDetect_1.defaultNoop, enableLogs = false, eventTypes = IdleDetect_1.defaultEventTypes) {
super(idleSeconds, onIdle, enableLogs, eventTypes);
// Native API
this.controller = null;
this.detector = null;
this.cleanupAndStop = () => {
super.cleanupAndStop();
// Need to check if it's fine with next start()
// this.controller.abort()
this.detector = null;
this.log('IdleDetector: Inactive');
};
this.handleIdleChange = () => {
var _a, _b;
const userState = (_a = this.detector) === null || _a === void 0 ? void 0 : _a.userState;
const screenState = (_b = this.detector) === null || _b === void 0 ? void 0 : _b.screenState;
this.log(`IdleDetector: User is ${userState}, screen is ${screenState}`);
if (userState === UserIdleState.idle || screenState === ScreenIdleState.locked) {
this.handleIdle();
}
};
this.startIdleDetector = () => __awaiter(this, void 0, void 0, function* () {
this.log('IdleDetect: startIdleDetector()');
if (!this.detector) {
this.detector = new window.IdleDetector();
this.detector.addEventListener('change', this.handleIdleChange);
}
yield this.detector.start({
threshold: this.idleTime,
signal: this.controller.signal,
});
this.log('IdleDetector: Active');
});
this.start = () => __awaiter(this, void 0, void 0, function* () {
if ((0, exports.isIdleDetectorSupported)()) {
let permission = '';
try {
permission = yield window.IdleDetector.requestPermission();
}
catch (e) { }
if (permission === 'granted') {
this.startIdleDetector();
// Do not start the Timeout fallback
return;
}
else {
this.error('IdleDetector: Permission denied');
}
}
// Start the Timeout fallback
this.startTimeout();
});
if ((0, exports.isIdleDetectorSupported)()) {
this.controller = new AbortController();
}
}
}
exports.IdleDetectIsomorph = IdleDetectIsomorph;