SYWEB-57: Highlight rooms which have had their bingers go off in blue.

Priority is the same as xchat so selected > blue > red.
pull/14/head
Kegan Dougal 2014-11-12 15:31:06 +00:00
parent 99c445a6d6
commit 960b28c90a
5 changed files with 50 additions and 7 deletions

View File

@ -816,6 +816,10 @@ textarea, input {
background-color: #fee; background-color: #fee;
} }
.recentsRoomBing {
background-color: #eef;
}
.recentsRoomName { .recentsRoomName {
font-size: 16px; font-size: 16px;
padding-top: 7px; padding-top: 7px;

View File

@ -95,14 +95,22 @@ function(matrixService, $rootScope, $q, $timeout, $filter, mPresence, notificati
modelService.createRoomIdToAliasMapping(event.room_id, event.content.aliases[0]); modelService.createRoomIdToAliasMapping(event.room_id, event.content.aliases[0]);
}; };
var containsBingWord = function(event) {
if (!event.content || !event.content.body) {
return false;
}
return notificationService.containsBingWord(
matrixService.config().user_id,
matrixService.config().display_name,
matrixService.config().bingWords,
event.content.body
);
};
var displayNotification = function(event) { var displayNotification = function(event) {
if (window.Notification && event.user_id != matrixService.config().user_id) { if (window.Notification && event.user_id != matrixService.config().user_id) {
var shouldBing = notificationService.containsBingWord( var shouldBing = containsBingWord(event);
matrixService.config().user_id,
matrixService.config().display_name,
matrixService.config().bingWords,
event.content.body
);
// Ideally we would notify only when the window is hidden (i.e. document.hidden = true). // Ideally we would notify only when the window is hidden (i.e. document.hidden = true).
// //
@ -529,6 +537,10 @@ function(matrixService, $rootScope, $q, $timeout, $filter, mPresence, notificati
resetRoomMessages(room_id); resetRoomMessages(room_id);
}, },
eventContainsBingWord: function(event) {
return containsBingWord(event);
},
/** /**
* Return the last message event of a room * Return the last message event of a room
* @param {String} room_id the room id * @param {String} room_id the room id

View File

@ -38,9 +38,22 @@ angular.module('recentsService', [])
// room_id: <number> // room_id: <number>
}; };
var BROADCAST_UNREAD_BING_MESSAGES = "recentsService:BROADCAST_UNREAD_BING_MESSAGES(room_id, event)";
var unreadBingMessages = {
// room_id: bingEvent
};
// listen for new unread messages // listen for new unread messages
$rootScope.$on(eventHandlerService.MSG_EVENT, function(ngEvent, event, isLive) { $rootScope.$on(eventHandlerService.MSG_EVENT, function(ngEvent, event, isLive) {
if (isLive && event.room_id !== selectedRoomId) { if (isLive && event.room_id !== selectedRoomId) {
if (eventHandlerService.eventContainsBingWord(event)) {
if (!unreadBingMessages[event.room_id]) {
unreadBingMessages[event.room_id] = {};
}
unreadBingMessages[event.room_id] = event;
$rootScope.$broadcast(BROADCAST_UNREAD_BING_MESSAGES, event.room_id, event);
}
if (!unreadMessages[event.room_id]) { if (!unreadMessages[event.room_id]) {
unreadMessages[event.room_id] = 0; unreadMessages[event.room_id] = 0;
} }
@ -66,11 +79,19 @@ angular.module('recentsService', [])
return unreadMessages; return unreadMessages;
}, },
getUnreadBingMessages: function() {
return unreadBingMessages;
},
markAsRead: function(room_id) { markAsRead: function(room_id) {
if (unreadMessages[room_id]) { if (unreadMessages[room_id]) {
unreadMessages[room_id] = 0; unreadMessages[room_id] = 0;
} }
if (unreadBingMessages[room_id]) {
unreadBingMessages[room_id] = undefined;
}
$rootScope.$broadcast(BROADCAST_UNREAD_MESSAGES, room_id, 0); $rootScope.$broadcast(BROADCAST_UNREAD_MESSAGES, room_id, 0);
$rootScope.$broadcast(BROADCAST_UNREAD_BING_MESSAGES, room_id, undefined);
} }
}; };

View File

@ -38,6 +38,12 @@ angular.module('RecentsController', ['matrixService', 'matrixFilter'])
$scope.unreadMessages = recentsService.getUnreadMessages(); $scope.unreadMessages = recentsService.getUnreadMessages();
}); });
// track the list of unread BING messages: the html will use this
$scope.unreadBings = recentsService.getUnreadBingMessages();
$scope.$on(recentsService.BROADCAST_UNREAD_BING_MESSAGES, function(ngEvent, room_id, event) {
$scope.unreadBings = recentsService.getUnreadBingMessages();
});
$scope.selectRoom = function(room) { $scope.selectRoom = function(room) {
recentsService.markAsRead(room.room_id); recentsService.markAsRead(room.room_id);
$rootScope.goToPage('room/' + (room.room_alias ? room.room_alias : room.room_id) ); $rootScope.goToPage('room/' + (room.room_alias ? room.room_alias : room.room_id) );

View File

@ -3,7 +3,7 @@
<tbody ng-repeat="(index, room) in rooms | orderRecents" <tbody ng-repeat="(index, room) in rooms | orderRecents"
ng-click="selectRoom(room)" ng-click="selectRoom(room)"
class="recentsRoom" class="recentsRoom"
ng-class="{'recentsRoomSelected': (room.room_id === recentsSelectedRoomID), 'recentsRoomUnread': (unreadMessages[room.room_id])}"> ng-class="{'recentsRoomSelected': (room.room_id === recentsSelectedRoomID), 'recentsRoomBing': (unreadBings[room.room_id]), 'recentsRoomUnread': (unreadMessages[room.room_id])}">
<tr> <tr>
<td ng-class="room.current_room_state.state('m.room.join_rules').content.join_rule == 'public' ? 'recentsRoomName recentsPublicRoom' : 'recentsRoomName'"> <td ng-class="room.current_room_state.state('m.room.join_rules').content.join_rule == 'public' ? 'recentsRoomName recentsPublicRoom' : 'recentsRoomName'">
{{ room.room_id | mRoomName }} {{ room.room_id | mRoomName }}