mirror of https://github.com/vector-im/riot-web
Merge branch 'develop' into matthew/roomsettings2
commit
06ecf78e5f
|
@ -16,7 +16,8 @@ limitations under the License.
|
||||||
|
|
||||||
var dis = require("./dispatcher");
|
var dis = require("./dispatcher");
|
||||||
|
|
||||||
var MIN_DISPATCH_INTERVAL = 1 * 1000;
|
var MIN_DISPATCH_INTERVAL_MS = 500;
|
||||||
|
var CURRENTLY_ACTIVE_THRESHOLD_MS = 500;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class watches for user activity (moving the mouse or pressing a key)
|
* This class watches for user activity (moving the mouse or pressing a key)
|
||||||
|
@ -38,6 +39,7 @@ class UserActivity {
|
||||||
window.addEventListener('wheel', this._onUserActivity.bind(this), true);
|
window.addEventListener('wheel', this._onUserActivity.bind(this), true);
|
||||||
this.lastActivityAtTs = new Date().getTime();
|
this.lastActivityAtTs = new Date().getTime();
|
||||||
this.lastDispatchAtTs = 0;
|
this.lastDispatchAtTs = 0;
|
||||||
|
this.activityEndTimer = undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -49,6 +51,14 @@ class UserActivity {
|
||||||
window.removeEventListener('wheel', this._onUserActivity.bind(this), true);
|
window.removeEventListener('wheel', this._onUserActivity.bind(this), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return true if there has been user activity very recently
|
||||||
|
* (ie. within a few seconds)
|
||||||
|
*/
|
||||||
|
userCurrentlyActive() {
|
||||||
|
return this.lastActivityAtTs > new Date().getTime() - CURRENTLY_ACTIVE_THRESHOLD_MS;
|
||||||
|
}
|
||||||
|
|
||||||
_onUserActivity(event) {
|
_onUserActivity(event) {
|
||||||
if (event.screenX && event.type == "mousemove") {
|
if (event.screenX && event.type == "mousemove") {
|
||||||
if (event.screenX === this.lastScreenX &&
|
if (event.screenX === this.lastScreenX &&
|
||||||
|
@ -61,12 +71,32 @@ class UserActivity {
|
||||||
this.lastScreenY = event.screenY;
|
this.lastScreenY = event.screenY;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.lastActivityAtTs = (new Date).getTime();
|
this.lastActivityAtTs = new Date().getTime();
|
||||||
if (this.lastDispatchAtTs < this.lastActivityAtTs - MIN_DISPATCH_INTERVAL) {
|
if (this.lastDispatchAtTs < this.lastActivityAtTs - MIN_DISPATCH_INTERVAL_MS) {
|
||||||
this.lastDispatchAtTs = this.lastActivityAtTs;
|
this.lastDispatchAtTs = this.lastActivityAtTs;
|
||||||
dis.dispatch({
|
dis.dispatch({
|
||||||
action: 'user_activity'
|
action: 'user_activity'
|
||||||
});
|
});
|
||||||
|
if (!this.activityEndTimer) {
|
||||||
|
this.activityEndTimer = setTimeout(
|
||||||
|
this._onActivityEndTimer.bind(this), MIN_DISPATCH_INTERVAL_MS
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_onActivityEndTimer() {
|
||||||
|
var now = new Date().getTime();
|
||||||
|
var targetTime = this.lastActivityAtTs + MIN_DISPATCH_INTERVAL_MS;
|
||||||
|
if (now >= targetTime) {
|
||||||
|
dis.dispatch({
|
||||||
|
action: 'user_activity_end'
|
||||||
|
});
|
||||||
|
this.activityEndTimer = undefined;
|
||||||
|
} else {
|
||||||
|
this.activityEndTimer = setTimeout(
|
||||||
|
this._onActivityEndTimer.bind(this), targetTime - now
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -220,6 +220,12 @@ module.exports = React.createClass({
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case 'user_activity':
|
case 'user_activity':
|
||||||
|
case 'user_activity_end':
|
||||||
|
// we could treat user_activity_end differently and not
|
||||||
|
// send receipts for messages that have arrived between
|
||||||
|
// the actual user activity and the time they stopped
|
||||||
|
// being active, but let's see if this is actually
|
||||||
|
// necessary.
|
||||||
this.sendReadReceipt();
|
this.sendReadReceipt();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue