mirror of https://github.com/vector-im/riot-web
				
				
				
			Merge pull request #90 from matrix-org/user_activity_end
Send an event at the end of user activity too and use this to send RRs.pull/21833/head
						commit
						81329a42fd
					
				|  | @ -16,7 +16,8 @@ limitations under the License. | |||
| 
 | ||||
| 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) | ||||
|  | @ -38,6 +39,7 @@ class UserActivity { | |||
|         window.addEventListener('wheel', this._onUserActivity.bind(this), true); | ||||
|         this.lastActivityAtTs = new Date().getTime(); | ||||
|         this.lastDispatchAtTs = 0; | ||||
|         this.activityEndTimer = undefined; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|  | @ -49,6 +51,14 @@ class UserActivity { | |||
|         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) { | ||||
|         if (event.screenX && event.type == "mousemove") { | ||||
|             if (event.screenX === this.lastScreenX && | ||||
|  | @ -61,12 +71,32 @@ class UserActivity { | |||
|             this.lastScreenY = event.screenY; | ||||
|         } | ||||
| 
 | ||||
|         this.lastActivityAtTs = (new Date).getTime(); | ||||
|         if (this.lastDispatchAtTs < this.lastActivityAtTs - MIN_DISPATCH_INTERVAL) { | ||||
|         this.lastActivityAtTs = new Date().getTime(); | ||||
|         if (this.lastDispatchAtTs < this.lastActivityAtTs - MIN_DISPATCH_INTERVAL_MS) { | ||||
|             this.lastDispatchAtTs = this.lastActivityAtTs; | ||||
|             dis.dispatch({ | ||||
|                 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; | ||||
|             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(); | ||||
|                 break; | ||||
|         } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 David Baker
						David Baker