Gitter migration: Point people to app.gitter.im (rollout pt. 1)
[gitter.git] / public / js / views / behaviors / unread-items.js
bloba8f072b394a6633b5358fd8dd9faab87a9b507a5
1 'use strict';
3 var context = require('gitter-web-client-context');
4 var Marionette = require('backbone.marionette');
5 var behaviourLookup = require('./lookup');
7 var transitionQueue = [];
8 var highwaterMark = 0;
10 function queueTransition(el) {
11   transitionQueue.push(el);
12   if (transitionQueue.length === 1) {
13     setTimeout(dequeueTransition, 500);
14   }
17 function dequeueTransition() {
18   var el = transitionQueue.shift();
19   if (!el) return;
21   if (highwaterMark < transitionQueue.length) {
22     highwaterMark = transitionQueue.length;
23   }
25   var classList = el.classList;
26   classList.remove('unread');
28   if (transitionQueue.length) {
29     var time = highwaterMark > 10 ? 60 : 70;
30     setTimeout(dequeueTransition, time);
31   } else {
32     highwaterMark = 0;
33   }
36 var Behavior = Marionette.Behavior.extend({
37   modelEvents: {
38     'change:unread': 'unreadChanged'
39   },
41   onRender: function() {
42     if (!context.isLoggedIn()) return;
44     var model = this.view.model;
45     if (!model) return;
47     var unread = model.get('unread');
48     if (unread) {
49       this.el.classList.add('unread');
50     }
51   },
53   unreadChanged: function(model, value, options) {
54     if (value) {
55       // Changing to unread
56       this.el.classList.add('unread');
57       return;
58     }
60     var previous = model.previous('unread');
61     if (!previous) return; // On send, unread is undefined. Ignore changes from undefined to false
63     if (options && options.fast) {
64       this.el.classList.add('fast'); // Remove the transition
65       this.el.classList.remove('unread');
66     } else {
67       queueTransition(this.el);
68     }
69   }
70 });
72 behaviourLookup.register('UnreadItems', Behavior);
73 module.exports = Behavior;