Anton Shestakov <av6@dwimlabs.net>, Thu, 14 Apr 2016 02:05:24 +0800
index: remove offline contacts only when they change to being offline
Since new contacts are currently added while they still have the default
presence of 'unavailable', add event sees them as offline and throws them away
immediately, before their presence could change to something else.
coffee/contacts.coffee
Permissions: -rw-r--r--
class Tram.Contact extends Backbone.Model @on('add change:avatar', @optimizeAvatar) @on 'add change:fullname change:nickname change:bjid', -> @set('d/handle', @get('fullname') or @get('nickname') or @get('bjid')) @on 'add change:type change:presence change:callstate', -> if @get('type') is 'self' then return @unset('d/actions') if @get('presence') is 'subscribe' then return @set('d/actions', ['authorize', 'unauthorize']) if @get('presence') isnt 'unavailable' actions.push('wait', 'hang-up') actions.push('accept', 'decline') @set('d/actions', actions) if not (avatar?.mime and avatar?.data) return @unset('avatar/url') data = "data:#{ avatar.mime };base64,#{ avatar.data }" if data.length < @optimizeThreshold return @set('avatar/url', data) img.addEventListener 'load', => if img.width < @optimizeSide and img.height < @optimizeSide return @set('avatar/url', data) ratio = Math.min(@optimizeSide / img.width, @optimizeSide / img.height) canvas = document.createElement('canvas') canvas.height = Math.round(img.height * ratio) canvas.width = Math.round(img.width * ratio) ctx = canvas.getContext('2d') ctx.drawImage(img, 0, 0, canvas.width, canvas.height) if avatar.mime is 'image/jpeg' optimized = canvas.toDataURL(mime) if img.src.length < optimized.length @set('avatar/url', optimized) class Tram.Contacts extends Backbone.Collection if model.get('presence') is 'unavailable' else if model.get('presence') is 'subscribe' else if model.get('type') is 'self' @on('change:presence change:type', @sort) class Tram.AvatarView extends Backbone.View template: $('#avatar-template').html() colors: Tram.colors.avatar ci = hash % @colors.length "color: white; background: #{ @colors[ci] };" @rivet = rivets.bind(@el, model: @model, view: this) class Tram.ContactView extends Backbone.View template: $('#contact-template').html() 'click [data-chat]': -> @model.trigger('action/chat') 'click [data-authorize]': -> @model.trigger('action/authorize') 'click [data-unauthorize]': -> @model.trigger('action/unauthorize') 'click [data-call]': (event) -> @model.trigger('action/call', event.currentTarget.getAttribute('data-call')) 'click [data-accept]': (event) -> @model.trigger('action/accept', event.currentTarget.getAttribute('data-accept')) 'click [data-decline]': -> @model.trigger('action/decline') 'click [data-hang-up]': -> @model.trigger('action/hangup') 'click [data-remove]': -> @model.trigger('action/remove') @$el.attr('data-jid', @model.get('jid')) @$avatarColumn = @$('.avatar-column') @listenTo(@model, 'remove', @remove) "background: #{ @colors[show] || @colors['default'] };" @rivet = rivets.bind(@el, model: @model, view: this) av = new Tram.AvatarView(model: @model) @$avatarColumn.prepend(av.render().el) class Tram.ContactsApp extends Backbone.View @listenTo(@collection, 'add', @onAdd) @listenTo(@collection, 'sort', @onSort) onAdd: (model, collection) -> mi = collection.indexOf(model) model.view = new Tram.ContactView(model: model) el = model.view.render().el @$el.children().eq(mi - 1).after(el) onSort: (collection, options) -> collection.each (model) => @$el.append(model.view.el)