I have question regarding JSNI execution in Smart GWT application.
I want to implement user activity monitoring functionality. When user is inactive for n minutes, page will fire notification modal and call user to come back. Something like wake up notification on 9gag.
After notification is fired I will implement some additional functionalities (i.e. count how many times user went inactive..)
PROBLEM: JSNI function which works normally (I tested it on plain HTML and JavaScript page) is executed only once. After first inactivity notification modal is shoved to user, function is not executing anymore.
public static native void wakeUp()/*-{
console.log("#### Wake Up - started");
var timeout;
resetTimer();
document.onmousemove = resetTimer;
document.onclick = resetTimer;
function resetTimer() {
clearTimeout(timeout);
timeout = setTimeout(function() {
console.log("#### Wake Up - inactive for 1 minute...");
//display custom modal
@com.pb.client.MGMWeb::displayWakeUpNotification()();
}, 1 * 10 * 1000);//inactivity duration
}
}-*/;
Solution was in adding event listeners to $doc instead of using document.
Working example:
public static native void wakeUp()/*-{
console.log("#### WakeUp - Start");
var timeout;
resetTimer();
$doc.addEventListener('onclick', resetTimer, false);
$doc.addEventListener('onmouseover', resetTimer, false);
$doc.addEventListener('mousedown', resetTimer, false);
$doc.addEventListener('keypress', resetTimer, false);
$doc.addEventListener('mousemove', resetTimer, false);
$doc.addEventListener("DOMMouseScroll", resetTimer, false);
$doc.addEventListener("MSPointerMove", resetTimer, false);
$doc.addEventListener("touchmove", resetTimer, false);
function notifiyUser() {
@com.pb.client.MGMWeb::displayWakeUpNotification()();
console.log("#### Wake Up - inactive for 1 minute..");
}
function resetTimer() {
clearTimeout(timeout);
timeout = setTimeout(notifiyUser, 1 * 60 * 1000);
}
}-*/;