206:d0bde0e3cc62
Anton Shestakov <av6@dwimlabs.net>, Wed, 01 Jun 2016 21:26:22 +0800
index: expand, but also deduplicate existence checks for previous and contact

next change 247:fcca53a2f523
previous change 201:9f930147cc6e

js/messages.js

Permissions: -rw-r--r--

Other formats: Feeds:
// Generated by CoffeeScript 1.10.0
(function() {
var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
hasProp = {}.hasOwnProperty;
Tram.Message = (function(superClass) {
extend(Message, superClass);
function Message() {
return Message.__super__.constructor.apply(this, arguments);
}
Message.prototype.defaults = function() {
return {
stamp: new Date()
};
};
Message.prototype.initialize = function() {
return this.on('add change:stamp', function() {
return this.set('d/mstamp', moment(this.get('stamp')));
});
};
return Message;
})(Backbone.Model);
Tram.Messages = (function(superClass) {
extend(Messages, superClass);
function Messages() {
return Messages.__super__.constructor.apply(this, arguments);
}
Messages.prototype.model = Tram.Message;
Messages.prototype.splitThreshold = 30 * 60 * 1000;
Messages.prototype.foldThreshold = 60 * 1000;
Messages.prototype.comparator = function(model) {
return model.get('stamp').valueOf();
};
Messages.prototype.initialize = function() {
return this.on('add', this.onAdd);
};
Messages.prototype.onAdd = function(model) {
var mi, next, prev;
mi = this.indexOf(model);
prev = this.models[mi - 1];
this._splitOrFold(prev, model);
next = this.models[mi + 1];
return this._splitOrFold(model, next);
};
Messages.prototype._splitOrFold = function(m1, m2) {
if (m2 == null) {
return;
}
if (m1 == null) {
m2.unset('d/split');
m2.unset('d/fold');
return;
}
if (this._splittable(m1, m2)) {
return m2.set('d/split', true);
} else {
m2.unset('d/split');
if (this._foldable(m1, m2)) {
return m2.set('d/fold', true);
} else {
return m2.unset('d/fold');
}
}
};
Messages.prototype._splittable = function(m1, m2) {
return Math.abs(m1.get('stamp').valueOf() - m2.get('stamp').valueOf()) > this.splitThreshold;
};
Messages.prototype._foldable = function(m1, m2) {
return m1.get('from') === m2.get('from') && Math.abs(m1.get('stamp').valueOf() - m2.get('stamp').valueOf()) < this.foldThreshold;
};
return Messages;
})(Backbone.Collection);
Tram.MessageView = (function(superClass) {
extend(MessageView, superClass);
function MessageView() {
return MessageView.__super__.constructor.apply(this, arguments);
}
MessageView.prototype.templateEl = $($('#message-template').html());
MessageView.prototype.initialize = function() {
this.setElement(this.templateEl.clone());
this.$avatarColumn = this.$('.avatar-column');
return this.bind();
};
MessageView.prototype.bind = function() {
return this.listenTo(this.model, 'change:contact', this.updateContact);
};
MessageView.prototype.updateContact = function() {
var av;
if ((this.model.previous('contact') == null) && (this.model.get('contact') != null)) {
av = new Tram.AvatarView({
model: contact
});
return this.$avatarColumn.prepend(av.render().el);
}
};
MessageView.prototype.getHandle = function() {
var ref;
return ((ref = this.model.get('contact')) != null ? ref.get('d/handle') : void 0) || this.model.get('from');
};
MessageView.prototype.render = function(model) {
var av, contact;
this.rivet = rivets.bind(this.el, {
model: this.model,
view: this
});
contact = this.model.get('contact');
if (contact) {
av = new Tram.AvatarView({
model: contact
});
this.$avatarColumn.prepend(av.render().el);
}
return this;
};
MessageView.prototype.remove = function() {
this.rivet.unbind();
return MessageView.__super__.remove.apply(this, arguments);
};
return MessageView;
})(Backbone.View);
Tram.LogApp = (function(superClass) {
extend(LogApp, superClass);
function LogApp() {
return LogApp.__super__.constructor.apply(this, arguments);
}
LogApp.prototype.templateEl = $($('#chat-template').html());
LogApp.prototype.initialize = function() {
this.setElement(this.templateEl.clone());
this.$log = this.$('.log');
this.rivet = rivets.bind(this.el, {
model: this.model,
view: this
});
return this.bind();
};
LogApp.prototype.bind = function() {
return this.listenTo(this.collection, 'add', this.onAdd);
};
LogApp.prototype.onAdd = function(model, collection) {
var el, mi, view;
mi = collection.indexOf(model);
view = new Tram.MessageView({
model: model
});
el = view.render().el;
if (mi === 0) {
this.$log.prepend(el);
} else {
this.$log.children().eq(mi - 1).after(el);
}
if (this.bottomed) {
return this.scroll();
}
};
LogApp.prototype.bottomed = function() {
return this.$log.scrollTop() + this.$log.height() === this.$log.get(0).scrollHeight;
};
LogApp.prototype.scroll = function() {
return this.$log.scrollTop(this.$log.get(0).scrollHeight);
};
LogApp.prototype.remove = function() {
this.rivet.unbind();
return LogApp.__super__.remove.apply(this, arguments);
};
return LogApp;
})(Backbone.View);
}).call(this);
//# sourceMappingURL=messages.js.map