Migrate unread messages logic to recentsService.

This commit is contained in:
Kegan Dougal 2014-11-12 15:11:34 +00:00
parent 96cd467cfa
commit 99c445a6d6
2 changed files with 36 additions and 21 deletions

View File

@ -27,15 +27,31 @@ This is preferable to polluting the $rootScope with recents specific info, and
makes the dependency on this shared state *explicit*. makes the dependency on this shared state *explicit*.
*/ */
angular.module('recentsService', []) angular.module('recentsService', [])
.factory('recentsService', ['$rootScope', function($rootScope) { .factory('recentsService', ['$rootScope', 'eventHandlerService', function($rootScope, eventHandlerService) {
// notify listeners when variables in the service are updated. We need to do // notify listeners when variables in the service are updated. We need to do
// this since we do not tie them to any scope. // this since we do not tie them to any scope.
var BROADCAST_SELECTED_ROOM_ID = "recentsService:BROADCAST_SELECTED_ROOM_ID"; var BROADCAST_SELECTED_ROOM_ID = "recentsService:BROADCAST_SELECTED_ROOM_ID(room_id)";
var selectedRoomId = undefined; var selectedRoomId = undefined;
var BROADCAST_UNREAD_MESSAGES = "recentsService:BROADCAST_UNREAD_MESSAGES(room_id, unreadCount)";
var unreadMessages = {
// room_id: <number>
};
// listen for new unread messages
$rootScope.$on(eventHandlerService.MSG_EVENT, function(ngEvent, event, isLive) {
if (isLive && event.room_id !== selectedRoomId) {
if (!unreadMessages[event.room_id]) {
unreadMessages[event.room_id] = 0;
}
unreadMessages[event.room_id] += 1;
$rootScope.$broadcast(BROADCAST_UNREAD_MESSAGES, event.room_id, unreadMessages[event.room_id]);
}
});
return { return {
BROADCAST_SELECTED_ROOM_ID: BROADCAST_SELECTED_ROOM_ID, BROADCAST_SELECTED_ROOM_ID: BROADCAST_SELECTED_ROOM_ID,
BROADCAST_UNREAD_MESSAGES: BROADCAST_UNREAD_MESSAGES,
getSelectedRoomId: function() { getSelectedRoomId: function() {
return selectedRoomId; return selectedRoomId;
@ -44,6 +60,17 @@ angular.module('recentsService', [])
setSelectedRoomId: function(room_id) { setSelectedRoomId: function(room_id) {
selectedRoomId = room_id; selectedRoomId = room_id;
$rootScope.$broadcast(BROADCAST_SELECTED_ROOM_ID, room_id); $rootScope.$broadcast(BROADCAST_SELECTED_ROOM_ID, room_id);
},
getUnreadMessages: function() {
return unreadMessages;
},
markAsRead: function(room_id) {
if (unreadMessages[room_id]) {
unreadMessages[room_id] = 0;
}
$rootScope.$broadcast(BROADCAST_UNREAD_MESSAGES, room_id, 0);
} }
}; };

View File

@ -26,34 +26,22 @@ angular.module('RecentsController', ['matrixService', 'matrixFilter'])
// retrieve all rooms and expose them // retrieve all rooms and expose them
$scope.rooms = modelService.getRooms(); $scope.rooms = modelService.getRooms();
if (!$rootScope.unreadMessages) { // track the selected room ID: the html will use this
$rootScope.unreadMessages = {
// room_id: <number>
};
}
$scope.recentsSelectedRoomID = recentsService.getSelectedRoomId(); $scope.recentsSelectedRoomID = recentsService.getSelectedRoomId();
$scope.$on(recentsService.BROADCAST_SELECTED_ROOM_ID, function(ngEvent, room_id) { $scope.$on(recentsService.BROADCAST_SELECTED_ROOM_ID, function(ngEvent, room_id) {
$scope.recentsSelectedRoomID = room_id; $scope.recentsSelectedRoomID = room_id;
}); });
// track the list of unread messages: the html will use this
$scope.unreadMessages = recentsService.getUnreadMessages();
$scope.$on(recentsService.BROADCAST_UNREAD_MESSAGES, function(ngEvent, room_id, unreadCount) {
$scope.unreadMessages = recentsService.getUnreadMessages();
});
$scope.selectRoom = function(room) { $scope.selectRoom = function(room) {
if ($rootScope.unreadMessages[room.room_id]) { recentsService.markAsRead(room.room_id);
$rootScope.unreadMessages[room.room_id] = 0;
}
$rootScope.goToPage('room/' + (room.room_alias ? room.room_alias : room.room_id) ); $rootScope.goToPage('room/' + (room.room_alias ? room.room_alias : room.room_id) );
}; };
$scope.$on(eventHandlerService.MSG_EVENT, function(ngEvent, event, isLive) {
if (isLive && event.room_id !== $scope.recentsSelectedRoomID) {
if (!$rootScope.unreadMessages[event.room_id]) {
$rootScope.unreadMessages[event.room_id] = 0;
}
$rootScope.unreadMessages[event.room_id] += 1;
console.log("sel="+$scope.recentsSelectedRoomID+" unread:"+JSON.stringify($rootScope.unreadMessages, undefined, 2));
}
});
}]); }]);