diff options
Diffstat (limited to 'syweb/webclient/room')
-rw-r--r-- | syweb/webclient/room/room-controller.js | 159 | ||||
-rw-r--r-- | syweb/webclient/room/room.html | 24 |
2 files changed, 33 insertions, 150 deletions
diff --git a/syweb/webclient/room/room-controller.js b/syweb/webclient/room/room-controller.js index 83ed595966..f6a1eea70a 100644 --- a/syweb/webclient/room/room-controller.js +++ b/syweb/webclient/room/room-controller.js @@ -38,7 +38,6 @@ angular.module('RoomController', ['ngSanitize', 'matrixFilter', 'mFileInput', 'a waiting_for_joined_event: false, // true when the join request is pending. Back to false once the corresponding m.room.member event is received messages_visibility: "hidden", // In order to avoid flickering when scrolling down the message table at the page opening, delay the message table display }; - $scope.members = {}; $scope.imageURLToSend = ""; @@ -156,14 +155,16 @@ angular.module('RoomController', ['ngSanitize', 'matrixFilter', 'mFileInput', 'a }); $scope.$on(eventHandlerService.MEMBER_EVENT, function(ngEvent, event, isLive) { - if (isLive && event.room_id === $scope.room_id) { + // if there is a live event affecting us + if (isLive && event.room_id === $scope.room_id && event.state_key === $scope.state.user_id) { if ($scope.state.waiting_for_joined_event) { // The user has successfully joined the room, we can getting data for this room $scope.state.waiting_for_joined_event = false; onInit3(); } - else if (event.state_key === $scope.state.user_id && "invite" !== event.membership && "join" !== event.membership) { - if ("ban" === event.membership) { + // if someone else changed our state.. + else if (event.user_id !== $scope.state.user_id && "invite" !== event.content.membership && "join" !== event.content.membership) { + if ("ban" === event.content.membership) { $scope.state.permission_denied = "You have been banned by " + mUserDisplayNameFilter(event.user_id); } else { @@ -172,19 +173,12 @@ angular.module('RoomController', ['ngSanitize', 'matrixFilter', 'mFileInput', 'a } else { scrollToBottom(); - updateMemberList(event); } } }); - - $scope.$on(eventHandlerService.PRESENCE_EVENT, function(ngEvent, event, isLive) { - if (isLive) { - updatePresence(event); - } - }); $scope.memberCount = function() { - return Object.keys($scope.members).length; + return Object.keys($scope.room.now.members).length; }; $scope.paginateMore = function() { @@ -257,98 +251,11 @@ angular.module('RoomController', ['ngSanitize', 'matrixFilter', 'mFileInput', 'a } ); }; - - var updateMemberList = function(chunk) { - if (chunk.room_id != $scope.room_id) return; - - - // set target_user_id to keep things clear - var target_user_id = chunk.state_key; - - var isNewMember = !(target_user_id in $scope.members); - if (isNewMember) { - - // Ignore banned and kicked (leave) people - if ("ban" === chunk.membership || "leave" === chunk.membership) { - return; - } - - // FIXME: why are we copying these fields around inside chunk? - if ("presence" in chunk.content) { - chunk.presence = chunk.content.presence; - } - if ("last_active_ago" in chunk.content) { - chunk.last_active_ago = chunk.content.last_active_ago; - $scope.now = new Date().getTime(); - chunk.last_updated = $scope.now; - } - 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; - - var usr = modelService.getUser(target_user_id); - if (usr) { - updatePresence(usr.event); - } - } - else { - // selectively update membership and presence else it will nuke the picture and displayname too :/ - - // Remove banned and kicked (leave) people - if ("ban" === chunk.membership || "leave" === chunk.membership) { - delete $scope.members[target_user_id]; - return; - } - - var member = $scope.members[target_user_id]; - 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; - $scope.now = new Date().getTime(); - member.last_updated = $scope.now; - } - } - }; - var updateMemberListPresenceAge = function() { + var updatePresenceTimes = 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)) { - console.log("updatePresence: Unknown member for chunk " + JSON.stringify(chunk)); - return; - } - var member = $scope.members[chunk.content.user_id]; - - // XXX: why not just pass the chunk straight through? - 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; - $scope.now = new Date().getTime(); - member.last_updated = $scope.now; - } - - // this may also contain a new display name or avatar url, so check. - if ("displayname" in chunk.content) { - member.displayname = chunk.content.displayname; - } - - if ("avatar_url" in chunk.content) { - member.avatar_url = chunk.content.avatar_url; - } + $timeout(updatePresenceTimes, 5 * 1000); }; $scope.send = function() { @@ -486,9 +393,7 @@ angular.module('RoomController', ['ngSanitize', 'matrixFilter', 'mFileInput', 'a var onInit2 = function() { console.log("onInit2"); - // ============================= $scope.room = modelService.getRoom($scope.room_id); - // ============================= // Scroll down as soon as possible so that we point to the last message // if it already exists in memory @@ -517,14 +422,6 @@ angular.module('RoomController', ['ngSanitize', 'matrixFilter', 'mFileInput', 'a var members = $scope.room.current_room_state.members; - // Update the member list - for (var i in members) { - if (!members.hasOwnProperty(i)) continue; - - var member = members[i].event; - updateMemberList(member); - } - // Check if the user has already join the room if ($scope.state.user_id in members) { if ("join" === members[$scope.state.user_id].event.content.membership) { @@ -572,35 +469,21 @@ angular.module('RoomController', ['ngSanitize', 'matrixFilter', 'mFileInput', 'a // Make recents highlight the current room recentsService.setSelectedRoomId($scope.room_id); + + updatePresenceTimes(); - // 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); - } - - // Arm list timing update timer - updateMemberListPresenceAge(); - - // Allow pagination - $scope.state.can_paginate = true; + // Allow pagination + $scope.state.can_paginate = true; - // Do a first pagination only if it is required - // FIXME: Should be no more require when initialSync/{room_id} will be available - if ($scope.state.first_pagination) { - paginate(MESSAGES_PER_PAGINATION); - } - else { - // There are already messages, go to the last message - scrollToBottom(true); - } - }, - function(error) { - $scope.feedback = "Failed get member list: " + error.data.error; - } - ); + // Do a first pagination only if it is required + // FIXME: Should be no more require when initialSync/{room_id} will be available + if ($scope.state.first_pagination) { + paginate(MESSAGES_PER_PAGINATION); + } + else { + // There are already messages, go to the last message + scrollToBottom(true); + } }; $scope.leaveRoom = function() { diff --git a/syweb/webclient/room/room.html b/syweb/webclient/room/room.html index d282a5dbe3..62f6797d05 100644 --- a/syweb/webclient/room/room.html +++ b/syweb/webclient/room/room.html @@ -126,12 +126,12 @@ </div> <div id="usersTableWrapper" ng-hide="state.permission_denied"> - <div ng-repeat="member in members | orderMembersList" class="userAvatar"> + <div ng-repeat="member in room.now.members | orderMembersList" class="userAvatar"> <div class="userAvatarFrame" ng-class="(room.now.members[member.id].user.event.content.presence === 'online' ? 'online' : (room.now.members[member.id].user.event.content.presence === 'unavailable' ? 'unavailable' : '')) + ' ' + (member.membership == 'invite' ? 'invited' : '')"> <img class="userAvatarImage mouse-pointer" ng-click="$parent.goToUserPage(member.id)" - ng-src="{{member.avatar_url || 'img/default-profile.png'}}" - alt="{{ member.displayname || member.id.substr(0, member.id.indexOf(':')) }}" + ng-src="{{room.now.members[member.id].user.event.content.avatar_url || 'img/default-profile.png'}}" + alt="{{ room.now.members[member.id].user.event.content.displayname || member.id.substr(0, member.id.indexOf(':')) }}" title="{{ member.id }} - power: {{ room.now.members[member.id].power_level }}" width="80" height="80"/> <!-- <div class="userPowerLevel" ng-style="{'width': member.powerLevelNorm +'%'}"></div> --> @@ -139,7 +139,7 @@ <div class="userName"> <pie-chart ng-show="room.now.members[member.id].power_level_norm" data="[ (room.now.members[member.id].power_level_norm + 0), (100 - room.now.members[member.id].power_level_norm) ]"></pie-chart> {{ member.id | mUserDisplayName:room_id:true }} - <span ng-show="member.last_active_ago" style="color: #aaa">({{ member.last_active_ago + (now - member.last_updated) | duration }})</span> + <span ng-show="room.now.members[member.id].user.event.content.last_active_ago" style="color: #aaa">({{ room.now.members[member.id].user.event.content.last_active_ago + (now - room.now.members[member.id].user.last_updated) | duration }})</span> </div> </div> </div> @@ -161,21 +161,21 @@ </td> <td class="avatar"> <!-- msg.__room_member.avatar_url is just backwards compat, and can be removed in the future. --> - <img class="avatarImage" ng-src="{{ msg.__room_member.cnt.avatar_url || msg.__room_member.avatar_url || 'img/default-profile.png' }}" width="32" height="32" title="{{msg.user_id}}" + <img class="avatarImage" ng-src="{{ msg.__room_member.cnt.avatar_url || msg.__room_member.content.avatar_url || 'img/default-profile.png' }}" width="32" height="32" title="{{msg.user_id}}" ng-hide="room.events[$index - 1].user_id === msg.user_id || msg.user_id === state.user_id"/> </td> <td class="msg" ng-class="(!msg.content.membership && ('m.room.topic' !== msg.type && 'm.room.name' !== msg.type))? (msg.content.msgtype === 'm.emote' ? 'emote text' : 'text') : 'membership text'"> <div class="bubble" ng-dblclick="openJson(msg)"> <span ng-if="'join' === msg.content.membership && msg.changedKey === 'membership'"> - {{ msg.content.displayname || members[msg.state_key].displayname || msg.state_key }} joined + {{ msg.content.displayname || room.now.members[msg.state_key].user.event.content.displayname || msg.state_key }} joined </span> <span ng-if="'leave' === msg.content.membership && msg.changedKey === 'membership'"> <span ng-if="msg.user_id === msg.state_key"> <!-- FIXME: This seems like a synapse bug that the 'leave' content doesn't give the displayname... --> - {{ msg.__room_member.cnt.displayname || members[msg.state_key].displayname || msg.state_key }} left + {{ msg.__room_member.cnt.displayname || room.now.members[msg.state_key].user.event.content.displayname || msg.state_key }} left </span> <span ng-if="msg.user_id !== msg.state_key && msg.prev_content"> - {{ msg.content.displayname || members[msg.user_id].displayname || msg.user_id }} + {{ msg.content.displayname || room.now.members[msg.user_id].user.event.content.displayname || msg.user_id }} {{ {"invite": "kicked", "join": "kicked", "ban": "unbanned"}[msg.prev_content.membership] }} {{ msg.__target_room_member.content.displayname || msg.state_key }} <span ng-if="'join' === msg.prev_content.membership && msg.content.reason"> @@ -198,7 +198,7 @@ <span ng-show='msg.content.msgtype === "m.emote"' ng-class="msg.echo_msg_state" - ng-bind-html="'* ' + (members[msg.user_id].displayname || msg.user_id) + ' ' + msg.content.body | linky:'_blank'" + ng-bind-html="'* ' + (msg.__room_member.cnt.displayname || msg.user_id) + ' ' + msg.content.body | linky:'_blank'" /> <span ng-show='msg.content.msgtype === "m.text"' @@ -222,17 +222,17 @@ </div> <span ng-if="'m.room.topic' === msg.type"> - {{ members[msg.user_id].displayname || msg.user_id }} changed the topic to: {{ msg.content.topic }} + {{ msg.__room_member.cnt.displayname || msg.user_id }} changed the topic to: {{ msg.content.topic }} </span> <span ng-if="'m.room.name' === msg.type"> - {{ members[msg.user_id].displayname || msg.user_id }} changed the room name to: {{ msg.content.name }} + {{ msg.__room_member.cnt.displayname || msg.user_id }} changed the room name to: {{ msg.content.name }} </span> </div> </td> <td class="rightBlock"> - <img class="avatarImage" ng-src="{{ members[msg.user_id].avatar_url || 'img/default-profile.png' }}" width="32" height="32" + <img class="avatarImage" ng-src="{{ room.now.members[msg.user_id].user.event.content.avatar_url || 'img/default-profile.png' }}" width="32" height="32" ng-hide="room.events[$index - 1].user_id === msg.user_id || msg.user_id !== state.user_id"/> </td> </tr> |