I’m using “@ng-idle/core”: “~11.1.0” and Angular 13 application.
I have two idle instances, one for auto logout and another one for screensaver.
If my screensaver is “Active” and if timeout happens on the first instance(i,e. autologout) and if I try to interrupt the screen then screensaver is not going off and its blocking the UI.(One thing is clear that interrupt subscription stops working in this scenario).
How to resolve this issue?.
Sample code for reference:
import {Component, NgZone, OnInit} from '@angular/core';
import {DEFAULT_INTERRUPTSOURCES, Idle, LocalStorage, LocalStorageExpiry} from '@ng-idle/core';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss']
})
export class AppComponent implements OnInit{
title = 'my-idle-app';
private readonly screenSaver!: HTMLElement;
private readonly screenSaverText!: Text;
idleTime1: number = 1;
private screenSaverIdle = new Idle(new LocalStorageExpiry(new LocalStorage()), this.ngZone);
constructor(readonly ngZone: NgZone, private idle1: Idle) {
this.screenSaver = document.createElement('div');
this.screenSaver.id = 'screensaver';
this.screenSaver.className = 'screen-saver';
this.screenSaverText = document.createTextNode('---%');
const movingTxt = document.createElement('span');
movingTxt.appendChild(this.screenSaverText);
this.screenSaver.appendChild(movingTxt);
this.removeScreenSaver();
this.screenSaverIdle.setIdleName('screenSaverIdleService');
this.screenSaverIdle.setInterrupts(DEFAULT_INTERRUPTSOURCES);
this.screenSaverIdle.setTimeout(false);
this.screenSaverIdle.setIdle(10);
this.screenSaverIdle.watch();
this.screenSaverIdle.onIdleStart.subscribe(() => {
document.body.appendChild(this.screenSaver);
});
this.screenSaverIdle.onIdleEnd.subscribe(() => {
console.log('IDLE END ::');
this.removeScreenSaver();
});
}
ngOnInit() {
this.idle1.setIdleName('AutoLogoutIdleService');
this.idle1.setInterrupts(DEFAULT_INTERRUPTSOURCES);
this.idle1.setIdle(this.idleTime1);
this.idle1.setTimeout(10);
this.idle1.onIdleStart.subscribe(() => {
console.log("IDLE 1 STARTS")
});
this.idle1.onIdleEnd.subscribe({
next: () => {
console.log("IDLE 1 END");
},
complete: () => {
console.log("idle 1 completed");
}
});
this.idle1.onTimeout.subscribe(()=> {
console.log("User session timed Out",);
});
this.idle1.watch();
}
private removeScreenSaver() {
const ex = document.getElementById('screensaver');
if (ex) {
document.body.removeChild(ex);
}
}
}
I analyzed the source code of the ng-idle library and it seems like, since timeout value is “false” for screensaver ideal instance it should not cancel the interrupt subscription.
So, my question will be regarding the instances of the services being created. Is it causing any problem here?.