@@ -24,7 +24,8 @@ angular.module('mm.addons.messages')
2424. controller ( 'mmaMessagesDiscussionCtrl' , function ( $scope , $stateParams , $mmApp , $mmaMessages , $mmSite , $timeout , $mmEvents , $window ,
2525 $ionicScrollDelegate , mmUserProfileState , $mmUtil , mmaMessagesPollInterval , $interval , $log , $ionicHistory , $ionicPlatform ,
2626 mmCoreEventKeyboardShow , mmCoreEventKeyboardHide , mmaMessagesDiscussionLoadedEvent , mmaMessagesDiscussionLeftEvent ,
27- $mmUser , $translate , mmaMessagesNewMessageEvent , mmaMessagesAutomSyncedEvent , $mmaMessagesSync , $q , md5 ) {
27+ $mmUser , $translate , mmaMessagesNewMessageEvent , mmaMessagesAutomSyncedEvent , $mmaMessagesSync , $q , md5 ,
28+ mmaMessagesReadChangedEvent ) {
2829
2930 $log = $log . getInstance ( 'mmaMessagesDiscussionCtrl' ) ;
3031
@@ -38,7 +39,8 @@ angular.module('mm.addons.messages')
3839 canDelete = $mmaMessages . canDeleteMessages ( ) , // Check if user can delete messages.
3940 syncObserver ,
4041 scrollKeyboardInitialized = false ,
41- pagesLoaded = 1 ;
42+ pagesLoaded = 1 ,
43+ unreadMessageFrom = false ;
4244
4345 $scope . showKeyboard = $stateParams . showKeyboard ;
4446 $scope . loaded = false ;
@@ -91,6 +93,8 @@ angular.module('mm.addons.messages')
9193 return ;
9294 }
9395
96+ hideUnreadLabel ( ) ;
97+
9498 $scope . data . showDelete = false ;
9599 $scope . newMessage = '' ; // Clear new message.
96100
@@ -280,11 +284,27 @@ angular.module('mm.addons.messages')
280284
281285 // Notify that there can be a new message.
282286 notifyNewMessage ( ) ;
287+
288+ // Mark retrieved messages as read if they are not.
289+ markMessagesAsRead ( ) ;
283290 } ) . finally ( function ( ) {
284291 fetching = false ;
285292 } ) ;
286293 }
287294
295+ // Hide unread label when sending messages.
296+ function hideUnreadLabel ( ) {
297+ if ( typeof unreadMessageFrom == 'number' ) {
298+ angular . forEach ( $scope . messages , function ( message ) {
299+ if ( message . id == unreadMessageFrom ) {
300+ message . unreadFrom = false ;
301+ }
302+ } ) ;
303+ // Label hidden.
304+ unreadMessageFrom = true ;
305+ }
306+ }
307+
288308 // Wait until fetching is false.
289309 function waitForFetch ( ) {
290310 if ( ! fetching ) {
@@ -296,6 +316,48 @@ angular.module('mm.addons.messages')
296316 } , 400 ) ;
297317 }
298318
319+ // Mark messages as read.
320+ function markMessagesAsRead ( ) {
321+ var readChanged = false ,
322+ previousMessageRead = false ,
323+ promises = [ ] ;
324+
325+ angular . forEach ( $scope . messages , function ( message ) {
326+
327+ if ( message . useridfrom != $scope . currentUserId ) {
328+ // If the message is unread, call $mmaMessages.markMessageRead.
329+ if ( message . read == 0 ) {
330+ promises . push ( $mmaMessages . markMessageRead ( message . id ) . then ( function ( ) {
331+ readChanged = true ;
332+ message . read = 1 ;
333+ } ) ) ;
334+ }
335+
336+ // Place unread from message label only once.
337+ if ( ! unreadMessageFrom ) {
338+ message . unreadFrom = message . read == 0 && previousMessageRead ;
339+ // Save where the label is placed.
340+ unreadMessageFrom = message . unreadFrom && parseInt ( message . id , 10 ) ;
341+ previousMessageRead = message . read != 0 ;
342+ }
343+ }
344+ } ) ;
345+ // Do not update the message unread from label on next refresh.
346+ if ( ! unreadMessageFrom ) {
347+ // Using true to indicate the label is not placed but should not be placed.
348+ unreadMessageFrom = true ;
349+ }
350+
351+ $q . all ( promises ) . finally ( function ( ) {
352+ if ( readChanged ) {
353+ $mmEvents . trigger ( mmaMessagesReadChangedEvent , {
354+ siteid : $mmSite . getId ( ) ,
355+ userid : userId
356+ } ) ;
357+ }
358+ } ) ;
359+ }
360+
299361 // Get a discussion. Can load several "pages".
300362 function getDiscussion ( pagesToLoad , lfReceivedUnread , lfReceivedRead , lfSentUnread , lfSentRead ) {
301363 lfReceivedUnread = lfReceivedUnread || 0 ;
0 commit comments