151:0178573216e3
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.

next change 191:d2453b933c21
previous change 142:d702edce24b7

coffee/calls.coffee

Permissions: -rw-r--r--

Other formats: Feeds:
class Tram.Call extends Backbone.Model
idAttribute: 'jid'
initialize: ->
@on('change:local/stream', @updateLocalStreamURL)
@on('change:remote/stream', @updateRemoteStreamURL)
updateStreamURL: (sattr, uattr) ->
if @has(uattr)
URL.revokeObjectURL(@get(uattr))
stream = @get(sattr)
if stream
@set(uattr, URL.createObjectURL(stream))
else
@unset(uattr)
updateLocalStreamURL: ->
@updateStreamURL('local/stream', 'local/stream/url')
updateRemoteStreamURL: ->
@updateStreamURL('remote/stream', 'remote/stream/url')
class Tram.Calls extends Backbone.Collection
model: Tram.Call
class Tram.CallView extends Backbone.View
tagName: 'div'
className: 'video-block'
template: $('#video-block-template').html()
events:
'click [data-mute-cam]': -> @model.set('local/video/muted', true)
'click [data-unmute-cam]': -> @model.set('local/video/muted', false)
'click [data-mute-mic]': -> @model.set('local/audio/muted', true)
'click [data-unmute-mic]': -> @model.set('local/audio/muted', false)
'click [data-mute-audio]': -> @model.set('remote/audio/muted', true)
'click [data-unmute-audio]': -> @model.set('remote/audio/muted', false)
initialize: ->
@$el.html(@template)
@$local = @$('video.local')
@$remote = @$('video.remote')
@bind()
bind: ->
@listenTo(@model, 'change:local/stream/url', @updateLocal)
@listenTo(@model, 'change:remote/stream/url', @updateRemote)
@listenTo(@model, 'change:local/video/muted', @muteCam)
@listenTo(@model, 'change:local/audio/muted', @muteMic)
@listenTo(@model, 'change:remote/audio/muted', @muteAudio)
@listenTo(@model, 'remove', @remove)
updateLocal: ->
if @model.has('local/stream/url')
@updateVideo(@$local, @model.get('local/stream/url'))
else
@removeVideo(@$local)
updateRemote: ->
if @model.has('remote/stream/url')
@updateVideo(@$remote, @model.get('remote/stream/url'))
else
@removeVideo(@$remote)
updateVideo: ($video, url) ->
$video.each ->
@src = url
@play()
removeVideo: ($video) ->
$video.each ->
@pause()
@removeAttribute('src')
enableTracks: (tracks, state) ->
if tracks?
for track in tracks
track.enabled = state
muteCam: ->
muted = @model.get('local/video/muted')
@enableTracks(@model.get('local/stream')?.getVideoTracks?(), not muted)
muteMic: ->
muted = @model.get('local/audio/muted')
@enableTracks(@model.get('local/stream')?.getAudioTracks?(), not muted)
muteAudio: ->
muted = @model.get('remote/audio/muted')
@enableTracks(@model.get('remote/stream')?.getAudioTracks?(), not muted)
render: ->
@rivet = rivets.bind(@el, model: @model, view: this)
@
remove: ->
@rivet.unbind()
super
class Tram.CallsApp extends Backbone.View
initialize: ->
@listenTo(@collection, 'add', @onAdd)
onAdd: (model) ->
model.view = new Tram.CallView(model: model)
@$el.append model.view.render().el