Gitter migration: Point people to app.gitter.im (rollout pt. 1)
[gitter.git] / public / js / utils / conditional-debouncer.js
blob9c6e75ac0c270af3a5764b9a37841f3a54ab286e
1 'use strict';
3 var debug = require('debug-proxy')('app:conditional-debounce');
5 /**
6  * This is a special type of debounce function in which the
7  * all the conditions have to be met before the debounce function
8  * will fire. If any of the conditions become unmet, the timer
9  * will be cancelled.
10  *
11  * It is used in `reload-on-update` to ensure that the user is
12  * eyeballs off, online, etc before reloading the browser.
13  *
14  * Remember: Even when all the conditions are met, they need to remain met
15  * until the timeout has expired.
16  */
17 function ConditionalDebouncer(conditions, timeout, fn) {
18   this.conditions = conditions;
19   this.timeout = timeout;
20   this.timer = null;
21   this.fn = fn;
22   this.checkConditions();
25 ConditionalDebouncer.prototype.set = function(field, value) {
26   this.conditions[field] = value;
27   debug('set: %s=%s', field, value);
28   this.checkConditions();
31 ConditionalDebouncer.prototype.checkConditions = function() {
32   debug('check conditions: %j', this.conditions);
34   var conditions = this.conditions;
35   var launchSequenceGo = Object.keys(conditions).every(function(key) {
36     return conditions[key];
37   });
39   if (launchSequenceGo) {
40     if (!this.timer) {
41       debug('All signals go. Commencing countdown sequence.');
42       this.timer = setTimeout(this.fire.bind(this), this.timeout);
43     }
44     // Otherwise we've already set it
45   } else {
46     if (this.timer) {
47       debug('Some signals no go. Cancelling timeout function');
49       clearTimeout(this.timer);
50       this.timer = null;
51     }
52   }
55 ConditionalDebouncer.prototype.fire = function() {
56   this.timer = null;
57   debug('Debounced timeout, firing debounced function');
58   this.fn();
61 ConditionalDebouncer.prototype.cancel = function() {
62   clearTimeout(this.timer);
63   this.timer = null;
66 module.exports = ConditionalDebouncer;