From 09e73b16feea60e0056e2ae1f01ad3a8dbb200c6 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 8 Jul 2013 18:16:55 -0700 Subject: [PATCH] Show all open windows in buddy list --- .../collaboration/lib/buddy-view.coffee | 21 ++++++----- .../collaboration/lib/presence.coffee | 36 +++++++++++++------ 2 files changed, 38 insertions(+), 19 deletions(-) diff --git a/src/packages/collaboration/lib/buddy-view.coffee b/src/packages/collaboration/lib/buddy-view.coffee index cd0e41e62..974b3497e 100644 --- a/src/packages/collaboration/lib/buddy-view.coffee +++ b/src/packages/collaboration/lib/buddy-view.coffee @@ -3,19 +3,22 @@ url = require 'url' module.exports = class BuddyView extends View - @content: ({user, state}) -> + @content: ({user, windows}) -> @div => @div class: 'buddy-name', => @img class: 'avatar', outlet: 'avatar' @span user.login - if state.repository - [owner, name] = url.parse(state.repository.url).path.split('/')[-2..] - name = name.replace(/\.git$/, '') - @div class: 'repo-name', => - @span name - if state.repository.branch - @div class: 'branch-name', => - @span state.repository.branch + + for id, windowState of windows + {repository} = windowState + continue unless repository? + [owner, name] = url.parse(repository.url).path.split('/')[-2..] + name = name.replace(/\.git$/, '') + @div class: 'repo-name', => + @span name + if repository.branch + @div class: 'branch-name', => + @span repository.branch initialize: (@buddy) -> if @buddy.user.avatarUrl diff --git a/src/packages/collaboration/lib/presence.coffee b/src/packages/collaboration/lib/presence.coffee index ce2a54735..d9a12fea6 100644 --- a/src/packages/collaboration/lib/presence.coffee +++ b/src/packages/collaboration/lib/presence.coffee @@ -1,3 +1,5 @@ +guid = require 'guid' +$ = require 'jquery' keytar = require 'keytar' _ = require 'underscore' Pusher = require '../vendor/pusher.js' @@ -7,9 +9,12 @@ class Presence _.extend @prototype, require('event-emitter') people: null + personId: null + windowId: null constructor: -> @people = {} + @windowId = guid.create().toString() @connect() connect: -> @@ -25,24 +30,26 @@ class Presence channel = pusher.subscribe('presence-atom') channel.bind 'pusher:subscription_succeeded', (members) => console.log 'subscribed to presence channel' - event = id: members.me.id - event.state = {} + @personId = members.me.id + event = id: @personId + event.window = id: @windowId if git? - event.state.repository = + event.window.repository = branch: git.getShortHead() url: git.getConfigValue('remote.origin.url') - channel.trigger('client-state-changed', event) + channel.trigger('client-window-opened', event) # List self as available for debugging UI when no one else is around self = - id: members.me.id + id: @personId user: members.me.info - state: event.state + windows: {} + self.windows[@windowId] = event.window @people[self.id] = self channel.bind 'pusher:member_added', (member) => console.log 'member added', member - @people[member.id] = {user: member.info} + @people[member.id] = {user: member.info, windows: {}} @trigger 'person-added', @people[member.id] channel.bind 'pusher:member_removed', (member) => @@ -50,10 +57,19 @@ class Presence @people.delete(member.id) @trigger 'person-removed' - channel.bind 'client-state-changed', (event) => - console.log 'client state changed', event + channel.bind 'client-window-opened', (event) => + console.log 'window opened', event if person = @people[event.id] - person.state = event.state + person.windows[event.window.id] = event.window @trigger 'person-status-changed', person + channel.bind 'client-window-closed', (event) => + console.log 'window closed', event + if person = @people[event.id] + delete person.windows[event.windowId] + @trigger 'person-status-changed', person + + $(window).on 'beforeunload', => + channel.trigger 'client-window-closed', {id: @personId, @windowId} + getPeople: -> _.values(@people)