From 4a2e4172b7e8409c066d606f4cf4dd9095f520af Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Tue, 29 Mar 2016 16:23:51 +0200 Subject: [PATCH] MOBILE-1502 messages: Update recent discussions when starting new disc --- upgrade.txt | 3 +- www/addons/messages/controllers/discussion.js | 6 +- .../messages/controllers/discussions.js | 71 ++++++++++--------- www/addons/messages/services/messages.js | 4 +- 4 files changed, 47 insertions(+), 37 deletions(-) diff --git a/upgrade.txt b/upgrade.txt index b7b8ea3058b..36ff624f4ff 100644 --- a/upgrade.txt +++ b/upgrade.txt @@ -1,9 +1,10 @@ This files describes API changes in the Moodle Mobile app, information provided here is intended especially for developers. -=== 2.10 === +=== 3.0 === * The function $mmaModBook#getChapterContent now requires to receive the result of $mmaModBook#getContentsMap instead of module.contents. + * The events obtained using $mmaMessages#getDiscussionEventName are deprecated. Now you should just use the event mmaMessagesNewMessageEvent and you will receive the site ID and user ID as parameters. === 2.9 === diff --git a/www/addons/messages/controllers/discussion.js b/www/addons/messages/controllers/discussion.js index 3f73f258094..afb070c0b75 100644 --- a/www/addons/messages/controllers/discussion.js +++ b/www/addons/messages/controllers/discussion.js @@ -24,7 +24,7 @@ angular.module('mm.addons.messages') .controller('mmaMessagesDiscussionCtrl', function($scope, $stateParams, $mmApp, $mmaMessages, $mmSite, $timeout, $mmEvents, $window, $ionicScrollDelegate, mmUserProfileState, $mmUtil, mmaMessagesPollInterval, $interval, $log, $ionicHistory, $ionicPlatform, mmCoreEventKeyboardShow, mmCoreEventKeyboardHide, mmaMessagesDiscussionLoadedEvent, mmaMessagesDiscussionLeftEvent, - $mmUser, $translate) { + $mmUser, $translate, mmaMessagesNewMessageEvent) { $log = $log.getInstance('mmaMessagesDiscussionCtrl'); @@ -224,7 +224,9 @@ angular.module('mm.addons.messages') var last = $scope.messages[$scope.messages.length - 1]; if (last && last.smallmessage !== lastMessage) { lastMessage = last.smallmessage; - $mmEvents.trigger($mmaMessages.getDiscussionEventName(userId), { + $mmEvents.trigger(mmaMessagesNewMessageEvent, { + siteid: $mmSite.getId(), + userid: userId, message: lastMessage, timecreated: last.timecreated }); diff --git a/www/addons/messages/controllers/discussions.js b/www/addons/messages/controllers/discussions.js index 00176a88f35..7f6f4f1a98e 100644 --- a/www/addons/messages/controllers/discussions.js +++ b/www/addons/messages/controllers/discussions.js @@ -21,45 +21,24 @@ angular.module('mm.addons.messages') * @ngdoc controller * @name mmaMessagesDiscussionsCtrl */ -.controller('mmaMessagesDiscussionsCtrl', function($q, $state, $scope, $mmUtil, $mmaMessages, $rootScope, $mmEvents, - mmCoreSplitViewLoad) { - var observers = []; +.controller('mmaMessagesDiscussionsCtrl', function($scope, $mmUtil, $mmaMessages, $rootScope, $mmEvents, $mmSite, + mmCoreSplitViewLoad, mmaMessagesNewMessageEvent) { + var newMessagesObserver, + siteId = $mmSite.getId(), + discussions; $scope.loaded = false; - // Set observers to watch for new messages on discussions. If a user sees a new message in a discussion, we'll update - // the discussion's last message in discussions list. - function setObservers(discussions) { - clearObservers(); - - angular.forEach(discussions, function(discussion) { - observers.push($mmEvents.on($mmaMessages.getDiscussionEventName(discussion.message.user), function(data) { - if (data && data.timecreated > discussion.message.timecreated) { - discussion.message.message = data.message; - discussion.message.timecreated = data.timecreated; - } - })); - }); - } - - // Clear observers. - function clearObservers() { - angular.forEach(observers, function(observer) { - if (observer && observer.off) { - observer.off(); - } - }); - } - function fetchDiscussions() { - return $mmaMessages.getDiscussions().then(function(discussions) { + return $mmaMessages.getDiscussions().then(function(discs) { + discussions = discs; + // Convert to an array for sorting. var array = []; angular.forEach(discussions, function(v) { array.push(v); }); $scope.discussions = array; - setObservers(array); }, function(error) { if (typeof error === 'string') { $mmUtil.showErrorModal(error); @@ -69,10 +48,14 @@ angular.module('mm.addons.messages') }); } - $scope.refresh = function() { - $mmaMessages.invalidateDiscussionsCache().then(function() { + function refreshData() { + return $mmaMessages.invalidateDiscussionsCache().then(function() { return fetchDiscussions(); - }).finally(function() { + }); + } + + $scope.refresh = function() { + refreshData().finally(function() { $scope.$broadcast('scroll.refreshComplete'); }); }; @@ -84,8 +67,30 @@ angular.module('mm.addons.messages') $rootScope.$broadcast(mmCoreSplitViewLoad); }); + newMessagesObserver = $mmEvents.on(mmaMessagesNewMessageEvent, function(data) { + var discussion; + + if (data && data.siteid == siteId && data.userid) { + discussion = discussions[data.userid]; + + if (typeof discussion == 'undefined') { + // It's a new discussion. Refresh list. + $scope.loaded = false; + refreshData().finally(function() { + $scope.loaded = true; + }); + } else if (data.timecreated > discussion.message.timecreated) { + // An existing discussion has a new message, update the last message. + discussion.message.message = data.message; + discussion.message.timecreated = data.timecreated; + } + } + }); + $scope.$on('$destroy', function() { - clearObservers(); + if (newMessagesObserver && newMessagesObserver.off) { + newMessagesObserver.off(); + } }); }); diff --git a/www/addons/messages/services/messages.js b/www/addons/messages/services/messages.js index 79ab341cbef..22e8a6a872c 100644 --- a/www/addons/messages/services/messages.js +++ b/www/addons/messages/services/messages.js @@ -232,13 +232,15 @@ angular.module('mm.addons.messages') /** * Get the name of the events of a discussion. + * These events aren't used anymore, please just listen to mmaMessagesNewMessageEvent. * * @param {Number} userid User ID of the discussion. * @return {String} Name of the event. + * @deprecated since version 2.10 */ self.getDiscussionEventName = function(userid) { return mmaMessagesNewMessageEvent + '_' + $mmSite.getUserId() + '_' + userid; - } + }; /** * Return the current user's discussion with another user.