Merge branch 'develop' into matthew/roomsettings2

pull/21833/head
Matthew Hodgson 2016-01-14 16:50:12 +00:00
commit 06ecf78e5f
2 changed files with 39 additions and 3 deletions

View File

@ -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
);
} }
} }
} }

View File

@ -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;
} }