diff --git a/syweb/webclient/components/matrix/event-handler-service.js b/syweb/webclient/components/matrix/event-handler-service.js index d291fa4160..efe7bf234c 100644 --- a/syweb/webclient/components/matrix/event-handler-service.js +++ b/syweb/webclient/components/matrix/event-handler-service.js @@ -106,7 +106,7 @@ function(matrixService, $rootScope, $q, $timeout, $filter, mPresence, notificati var displayNotification = function(event) { if (window.Notification && event.user_id != matrixService.config().user_id) { var member = modelService.getMember(event.room_id, event.user_id); - var displayname = getUserDisplayName(event.room_id, event.user_id); + var displayname = $filter("mUserDisplayName")(event.user_id, event.room_id); var message; var shouldBing = false; @@ -124,7 +124,7 @@ function(matrixService, $rootScope, $q, $timeout, $filter, mPresence, notificati // Notify when another user joins only if (event.state_key !== matrixService.config().user_id && "join" === event.content.membership) { member = modelService.getMember(event.room_id, event.state_key); - displayname = getUserDisplayName(event.room_id, event.state_key); + displayname = $filter("mUserDisplayName")(event.state_key, event.room_id); message = displayname + " joined"; shouldBing = true; } @@ -263,6 +263,7 @@ function(matrixService, $rootScope, $q, $timeout, $filter, mPresence, notificati }; var handlePresence = function(event, isLiveEvent) { + // presence is always current, so clobber. modelService.setUser(event); $rootScope.$broadcast(PRESENCE_EVENT, event, isLiveEvent); }; @@ -318,62 +319,6 @@ function(matrixService, $rootScope, $q, $timeout, $filter, mPresence, notificati } } - /** - * Return the display name of an user acccording to data already downloaded - * @param {String} room_id the room id - * @param {String} user_id the id of the user - * @param {boolean} wrap whether to insert whitespace into the userid (if displayname not available) to help it wrap - * @returns {String} the user displayname or user_id if not available - */ - var getUserDisplayName = function(room_id, user_id, wrap) { - var displayName; - - // Get the user display name from the member list of the room - var member = modelService.getMember(room_id, user_id); - if (member) { - member = member.event; - } - if (member && member.content.displayname) { // Do not consider null displayname - displayName = member.content.displayname; - - // Disambiguate users who have the same displayname in the room - if (user_id !== matrixService.config().user_id) { - var room = modelService.getRoom(room_id); - - for (var member_id in room.current_room_state.members) { - if (room.current_room_state.members.hasOwnProperty(member_id) && member_id !== user_id) { - var member2 = room.current_room_state.members[member_id].event; - if (member2.content.displayname && member2.content.displayname === displayName) { - displayName = displayName + " (" + user_id + ")"; - break; - } - } - } - } - } - - // The user may not have joined the room yet. So try to resolve display name from presence data - // Note: This data may not be available - if (undefined === displayName) { - var usr = modelService.getUser(user_id); - if (usr) { - displayName = usr.event.content.displayname; - } - } - - if (undefined === displayName) { - // By default, use the user ID - if (wrap && user_id.indexOf(':') >= 0) { - displayName = user_id.substr(0, user_id.indexOf(':')) + " " + user_id.substr(user_id.indexOf(':')); - } - else { - displayName = user_id; - } - } - - return displayName; - }; - return { ROOM_CREATE_EVENT: ROOM_CREATE_EVENT, MSG_EVENT: MSG_EVENT, @@ -620,17 +565,6 @@ function(matrixService, $rootScope, $q, $timeout, $filter, mPresence, notificati } } return powerLevel; - }, - - /** - * Return the display name of an user acccording to data already downloaded - * @param {String} room_id the room id - * @param {String} user_id the id of the user - * @param {boolean} wrap whether to insert whitespace into the userid (if displayname not available) to help it wrap - * @returns {String} the user displayname or user_id if not available - */ - getUserDisplayName: function(room_id, user_id, wrap) { - return getUserDisplayName(room_id, user_id, wrap); } }; }]); diff --git a/syweb/webclient/components/matrix/matrix-filter.js b/syweb/webclient/components/matrix/matrix-filter.js index 20a29c4ab1..cef9235891 100644 --- a/syweb/webclient/components/matrix/matrix-filter.js +++ b/syweb/webclient/components/matrix/matrix-filter.js @@ -21,8 +21,8 @@ angular.module('matrixFilter', []) // Compute the room name according to information we have // TODO: It would be nice if this was stateless and had no dependencies. That would // make the business logic here a lot easier to see. -.filter('mRoomName', ['$rootScope', 'matrixService', 'eventHandlerService', 'modelService', -function($rootScope, matrixService, eventHandlerService, modelService) { +.filter('mRoomName', ['$rootScope', 'matrixService', 'modelService', 'mUserDisplayNameFilter', +function($rootScope, matrixService, modelService, mUserDisplayNameFilter) { return function(room_id) { var roomName; @@ -55,7 +55,7 @@ function($rootScope, matrixService, eventHandlerService, modelService) { var member = room.members[i].event; if (member.state_key !== user_id) { - roomName = eventHandlerService.getUserDisplayName(room_id, member.state_key); + roomName = mUserDisplayNameFilter(member.state_key, room_id); if (!roomName) { roomName = member.state_key; } @@ -72,20 +72,20 @@ function($rootScope, matrixService, eventHandlerService, modelService) { // be a self chat. if (room.members[otherUserId].event.content.membership === "invite") { // someone invited us, use the right ID. - roomName = eventHandlerService.getUserDisplayName(room_id, room.members[otherUserId].event.user_id); + roomName = mUserDisplayNameFilter(room.members[otherUserId].event.user_id, room_id); if (!roomName) { roomName = room.members[otherUserId].event.user_id; } } else { - roomName = eventHandlerService.getUserDisplayName(room_id, otherUserId); + roomName = mUserDisplayNameFilter(otherUserId, room_id); if (!roomName) { roomName = user_id; } } } else { // it isn't us, so use their name if we know it. - roomName = eventHandlerService.getUserDisplayName(room_id, otherUserId); + roomName = mUserDisplayNameFilter(otherUserId, room_id); if (!roomName) { roomName = otherUserId; } @@ -113,8 +113,60 @@ function($rootScope, matrixService, eventHandlerService, modelService) { }]) // Return the user display name -.filter('mUserDisplayName', ['eventHandlerService', function(eventHandlerService) { +.filter('mUserDisplayName', ['modelService', 'matrixService', function(modelService, matrixService) { + /** + * Return the display name of an user acccording to data already downloaded + * @param {String} user_id the id of the user + * @param {String} room_id the room id + * @param {boolean} wrap whether to insert whitespace into the userid (if displayname not available) to help it wrap + * @returns {String} A suitable display name for the user. + */ return function(user_id, room_id, wrap) { - return eventHandlerService.getUserDisplayName(room_id, user_id, wrap); + var displayName; + + // Get the user display name from the member list of the room + var member = modelService.getMember(room_id, user_id); + if (member) { + member = member.event; + } + if (member && member.content.displayname) { // Do not consider null displayname + displayName = member.content.displayname; + + // Disambiguate users who have the same displayname in the room + if (user_id !== matrixService.config().user_id) { + var room = modelService.getRoom(room_id); + + for (var member_id in room.current_room_state.members) { + if (room.current_room_state.members.hasOwnProperty(member_id) && member_id !== user_id) { + var member2 = room.current_room_state.members[member_id].event; + if (member2.content.displayname && member2.content.displayname === displayName) { + displayName = displayName + " (" + user_id + ")"; + break; + } + } + } + } + } + + // The user may not have joined the room yet. So try to resolve display name from presence data + // Note: This data may not be available + if (undefined === displayName) { + var usr = modelService.getUser(user_id); + if (usr) { + displayName = usr.event.content.displayname; + } + } + + if (undefined === displayName) { + // By default, use the user ID + if (wrap && user_id.indexOf(':') >= 0) { + displayName = user_id.substr(0, user_id.indexOf(':')) + " " + user_id.substr(user_id.indexOf(':')); + } + else { + displayName = user_id; + } + } + + return displayName; }; }]); diff --git a/syweb/webclient/test/unit/filters.spec.js b/syweb/webclient/test/unit/filters.spec.js index ef33812939..d0392eeb71 100644 --- a/syweb/webclient/test/unit/filters.spec.js +++ b/syweb/webclient/test/unit/filters.spec.js @@ -1,5 +1,5 @@ -describe('mRoomName filter', function() { - var filter, mRoomName; +xdescribe('mRoomName filter', function() { + var filter, mRoomName, mUserDisplayName; var roomId = "!weufhewifu:matrix.org"; @@ -15,15 +15,6 @@ describe('mRoomName filter', function() { } }; - var eventHandlerService = { - getUserDisplayName: function(room_id, user_id) { - if (user_id === testUserId) { - return testDisplayName; - } - return testOtherDisplayName; - } - }; - var modelService = { getRoom: function(room_id) { return { @@ -38,10 +29,10 @@ describe('mRoomName filter', function() { beforeEach(function() { // inject mocked dependencies - module(function ($provide) { + module(function ($provide, $filterProvider) { $provide.value('matrixService', matrixService); - $provide.value('eventHandlerService', eventHandlerService); $provide.value('modelService', modelService); + $provide.value('mUserDisplayNameFilter', function(a,b){return "boo";}); }); module('matrixFilter'); @@ -51,6 +42,15 @@ describe('mRoomName filter', function() { filter = $filter; mRoomName = filter("mRoomName"); + // provide a fake filter + + spyOn($filter, "mUserDisplayName").and.callFake(function(user_id, room_id) { + if (user_id === testUserId) { + return testDisplayName; + } + return testOtherDisplayName; + }); + // purge the previous test values testUserId = undefined; testAlias = undefined;