diff options
Diffstat (limited to 'webclient/room/room-controller.js')
-rw-r--r-- | webclient/room/room-controller.js | 149 |
1 files changed, 72 insertions, 77 deletions
diff --git a/webclient/room/room-controller.js b/webclient/room/room-controller.js index ca0d0bae75..1f90472c67 100644 --- a/webclient/room/room-controller.js +++ b/webclient/room/room-controller.js @@ -75,18 +75,15 @@ angular.module('RoomController', ['ngSanitize', 'mFileInput']) }); $scope.$on(eventHandlerService.MEMBER_EVENT, function(ngEvent, event, isLive) { - updateMemberList(event); + if (isLive) { + updateMemberList(event); + } }); $scope.$on(eventHandlerService.PRESENCE_EVENT, function(ngEvent, event, isLive) { - updatePresence(event); - }); - - $rootScope.$on(matrixPhoneService.INCOMING_CALL_EVENT, function(ngEvent, call) { - console.trace("incoming call"); - call.onError = $scope.onCallError; - call.onHangup = $scope.onCallHangup; - $scope.currentCall = call; + if (isLive) { + updatePresence(event); + } }); $scope.memberCount = function() { @@ -100,15 +97,6 @@ angular.module('RoomController', ['ngSanitize', 'mFileInput']) } }; - $scope.answerCall = function() { - $scope.currentCall.answer(); - }; - - $scope.hangupCall = function() { - $scope.currentCall.hangup(); - $scope.currentCall = undefined; - }; - var paginate = function(numItems) { // console.log("paginate " + numItems); if ($scope.state.paginating || !$scope.room_id) { @@ -175,65 +163,49 @@ angular.module('RoomController', ['ngSanitize', 'mFileInput']) // set target_user_id to keep things clear var target_user_id = chunk.state_key; + + var now = new Date().getTime(); var isNewMember = !(target_user_id in $scope.members); if (isNewMember) { // FIXME: why are we copying these fields around inside chunk? - if ("state" in chunk.content) { - chunk.presenceState = chunk.content.state; // why is this renamed? + if ("presence" in chunk.content) { + chunk.presence = chunk.content.presence; } - if ("mtime_age" in chunk.content) { - chunk.mtime_age = chunk.content.mtime_age; + if ("last_active_ago" in chunk.content) { + chunk.last_active_ago = chunk.content.last_active_ago; } - // Once the HS reliably returns the displaynames & avatar_urls for both - // local and remote users, we should use this rather than the evalAsync block - // below if ("displayname" in chunk.content) { chunk.displayname = chunk.content.displayname; } if ("avatar_url" in chunk.content) { chunk.avatar_url = chunk.content.avatar_url; } - $scope.members[target_user_id] = chunk; - -/* - // Stale code for explicitly hammering the homeserver for every displayname & avatar_url - - // get their display name and profile picture and set it to their - // member entry in $scope.members. We HAVE to use $timeout with 0 delay - // to make this function run AFTER the current digest cycle, else the - // response may update a STALE VERSION of the member list (manifesting - // as no member names appearing, or appearing sporadically). - $scope.$evalAsync(function() { - matrixService.getDisplayName(chunk.target_user_id).then( - function(response) { - var member = $scope.members[chunk.target_user_id]; - if (member !== undefined) { - member.displayname = response.data.displayname; - } - } - ); - matrixService.getProfilePictureUrl(chunk.target_user_id).then( - function(response) { - var member = $scope.members[chunk.target_user_id]; - if (member !== undefined) { - member.avatar_url = response.data.avatar_url; - } - } - ); - }); -*/ + chunk.last_updated = now; + $scope.members[target_user_id] = chunk; if (target_user_id in $rootScope.presence) { updatePresence($rootScope.presence[target_user_id]); } } else { - // selectively update membership else it will nuke the picture and displayname too :/ + // selectively update membership and presence else it will nuke the picture and displayname too :/ var member = $scope.members[target_user_id]; - member.content.membership = chunk.content.membership; + member.membership = chunk.content.membership; + if ("presence" in chunk.content) { + member.presence = chunk.content.presence; + } + if ("last_active_ago" in chunk.content) { + member.last_active_ago = chunk.content.last_active_ago; + } } }; + + var updateMemberListPresenceAge = function() { + $scope.now = new Date().getTime(); + // TODO: don't bother polling every 5s if we know none of our counters are younger than 1 minute + $timeout(updateMemberListPresenceAge, 5 * 1000); + }; var updatePresence = function(chunk) { if (!(chunk.content.user_id in $scope.members)) { @@ -243,13 +215,12 @@ angular.module('RoomController', ['ngSanitize', 'mFileInput']) var member = $scope.members[chunk.content.user_id]; // XXX: why not just pass the chunk straight through? - if ("state" in chunk.content) { - member.presenceState = chunk.content.state; + if ("presence" in chunk.content) { + member.presence = chunk.content.presence; } - if ("mtime_age" in chunk.content) { - // FIXME: should probably keep updating mtime_age in realtime like FB does - member.mtime_age = chunk.content.mtime_age; + if ("last_active_ago" in chunk.content) { + member.last_active_ago = chunk.content.last_active_ago; } // this may also contain a new display name or avatar url, so check. @@ -262,6 +233,13 @@ angular.module('RoomController', ['ngSanitize', 'mFileInput']) } }; + var updateUserPowerLevel = function(user_id) { + var member = $scope.members[user_id]; + if (member) { + member.powerLevel = matrixService.getUserPowerLevel($scope.room_id, user_id); + } + } + $scope.send = function() { if ($scope.textInput === "") { return; @@ -275,6 +253,10 @@ angular.module('RoomController', ['ngSanitize', 'mFileInput']) if ($scope.textInput.indexOf("/me") === 0) { promise = matrixService.sendEmoteMessage($scope.room_id, $scope.textInput.substr(4)); } + else if ($scope.textInput.indexOf("/nick ") === 0) { + // Change user display name + promise = matrixService.setDisplayName($scope.textInput.substr(6)); + } else { promise = matrixService.sendTextMessage($scope.room_id, $scope.textInput); } @@ -349,6 +331,11 @@ angular.module('RoomController', ['ngSanitize', 'mFileInput']) // Make sure the initialSync has been before going further eventHandlerService.waitForInitialSyncCompletion().then( function() { + + // Some data has been retrieved from the iniialSync request + // So, the relative time starts here + $scope.now = new Date().getTime(); + var needsToJoin = true; // The room members is available in the data fetched by initialSync @@ -395,7 +382,26 @@ angular.module('RoomController', ['ngSanitize', 'mFileInput']) // Make recents highlight the current room $scope.recentsSelectedRoomID = $scope.room_id; - + + // Get the up-to-date the current member list + matrixService.getMemberList($scope.room_id).then( + function(response) { + for (var i = 0; i < response.data.chunk.length; i++) { + var chunk = response.data.chunk[i]; + updateMemberList(chunk); + + // Add his power level + updateUserPowerLevel(chunk.user_id); + } + + // Arm list timing update timer + updateMemberListPresenceAge(); + }, + function(error) { + $scope.feedback = "Failed get member list: " + error.data.error; + } + ); + paginate(MESSAGES_PER_PAGINATION); }; @@ -404,18 +410,13 @@ angular.module('RoomController', ['ngSanitize', 'mFileInput']) matrixService.invite($scope.room_id, user_id).then( function() { console.log("Invited."); - $scope.feedback = "Request for invitation succeeds"; + $scope.feedback = "Invite sent successfully"; }, function(reason) { $scope.feedback = "Failure: " + reason; }); }; - // Open the user profile page - $scope.goToUserPage = function(user_id) { - $location.url("/user/" + user_id); - }; - $scope.leaveRoom = function() { matrixService.leave($scope.room_id).then( @@ -476,16 +477,10 @@ angular.module('RoomController', ['ngSanitize', 'mFileInput']) $scope.startVoiceCall = function() { var call = new MatrixCall($scope.room_id); - call.onError = $scope.onCallError; - call.onHangup = $scope.onCallHangup; + call.onError = $rootScope.onCallError; + call.onHangup = $rootScope.onCallHangup; call.placeCall(); - $scope.currentCall = call; + $rootScope.currentCall = call; } - $scope.onCallError = function(errStr) { - $scope.feedback = errStr; - } - - $scope.onCallHangup = function() { - } }]); |