diff --git a/CHANGES.rst b/CHANGES.rst index 22a30f8d5..2df18b3d2 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -12,6 +12,11 @@ Changelog [jcbrand] - Fixed alignment of chat messages in Firefox. [jcbrand] +- More intelligent fetching of vCards. + [jcbrand] +- Fixed a race condition bug. Make sure that the roster is populated before + sending initial presence. + [jcbrand] 0.3 (2013-05-21) ---------------- diff --git a/converse.js b/converse.js index 74b909802..691f37f57 100644 --- a/converse.js +++ b/converse.js @@ -217,7 +217,7 @@ 'fullname' : this.get('fullname'), 'url': this.get('url'), 'image_type': this.get('image_type'), - 'image_src': this.get('image_src') + 'image': this.get('image') }); } }, @@ -420,10 +420,7 @@ keyPressed: function (ev) { var $textarea = $(ev.target), - message, - notify, - composing; - + message, notify, composing; if(ev.keyCode == 13) { ev.preventDefault(); message = $textarea.val(); @@ -436,7 +433,6 @@ } } this.$el.data('composing', false); - } else if (!this.model.get('chatroom')) { // composing data is only for single user chat composing = this.$el.data('composing'); @@ -470,7 +466,10 @@ } } if (_.has(item.changed, 'status')) { this.showStatusMessage(item.get('status')); + } if (_.has(item.changed, 'image')) { + this.renderAvatar(); } + // TODO check for changed fullname as well }, showStatusMessage: function (msg) { @@ -485,12 +484,34 @@ } }, + updateVCard: function () { + var jid = this.model.get('jid'), + rosteritem = converse.roster.get(jid); + if ((rosteritem)&&(!rosteritem.get('vcard_updated'))) { + converse.getVCard( + jid, + $.proxy(function (jid, fullname, image, image_type, url) { + this.model.save({ + 'fullname' : fullname, + 'url': url, + 'image_type': image_type, + 'image': image, + 'vcard_updated': converse.toISOString(new Date()) + }); + }, this), + $.proxy(function (stanza) { + console.log("ChatBoxView.initialize: An error occured while fetching vcard"); + }, this) + ); + } + }, + initialize: function (){ this.model.messages.on('add', this.showMessage, this); this.model.on('show', this.show, this); this.model.on('destroy', this.hide, this); this.model.on('change', this.onChange, this); - + this.updateVCard(); this.$el.appendTo(converse.chatboxesview.$el); this.render().show().model.messages.fetch({add: true}); if (this.model.get('status')) { @@ -514,21 +535,26 @@ 'placeholder="Personal message"/>'+ ''), + renderAvatar: function () { + if (!this.model.get('image')) { + return; + } + var img_src = 'data:'+this.model.get('image_type')+';base64,'+this.model.get('image'), + canvas = $(''), + ctx = canvas.get(0).getContext('2d'), + img = new Image(); // Create new Image object + img.onload = function() { + var ratio = img.width/img.height; + ctx.drawImage(img, 0,0, 35*ratio, 35); + }; + img.src = img_src; + this.$el.find('.chat-title').before(canvas); + }, + render: function () { this.$el.attr('id', this.model.get('box_id')) - .html(this.template(this.model.toJSON())); - if (this.model.get('image')) { - var img_src = 'data:'+this.model.get('image_type')+';base64,'+this.model.get('image'), - canvas = $(''), - ctx = canvas.get(0).getContext('2d'), - img = new Image(); // Create new Image object - img.onload = function() { - var ratio = img.width/img.height; - ctx.drawImage(img, 0,0, 35*ratio, 35); - }; - img.src = img_src; - this.$el.find('.chat-title').before(canvas); - } + .html(this.template(this.model.toJSON())); + this.renderAvatar(); return this; }, @@ -584,7 +610,7 @@ template: _.template( '