Skip to content

Commit 4699df6

Browse files
committed
Merge pull request #372 from dpalou/MOBILE-1319
MOBILE-1319 messages: Delete messages implemented
2 parents 44b6c98 + a3f2867 commit 4699df6

File tree

6 files changed

+121
-28
lines changed

6 files changed

+121
-28
lines changed

www/addons/messages/controllers/discussion.js

Lines changed: 62 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,15 @@ 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) {
27+
$mmUser, $translate) {
2828

2929
$log = $log.getInstance('mmaMessagesDiscussionCtrl');
3030

3131
var userId = $stateParams.userId,
3232
userFullname = $stateParams.userFullname,
3333
messagesBeingSent = 0,
3434
polling,
35+
fetching,
3536
backView = $ionicHistory.backView(),
3637
lastMessage,
3738
scrollView = $ionicScrollDelegate.$getByHandle('mmaMessagesScroll');
@@ -146,6 +147,38 @@ angular.module('mm.addons.messages')
146147
}
147148
};
148149

150+
// Convenience function to fetch messages.
151+
function fetchMessages() {
152+
$log.debug('Polling new messages for discussion with user ' + userId);
153+
if (messagesBeingSent > 0) {
154+
// We do not poll while a message is being sent or we could confuse the user
155+
// as his message would disappear from the list, and he'd have to wait for the
156+
// interval to check for new messages.
157+
return;
158+
} else if (!$mmApp.isOnline()) {
159+
// Obviously we cannot check for new messages when the app is offline.
160+
return;
161+
} else if (fetching) {
162+
// Already fetching.
163+
return;
164+
}
165+
166+
fetching = true;
167+
168+
// Invalidate the cache before fetching.
169+
$mmaMessages.invalidateDiscussionCache(userId);
170+
$mmaMessages.getDiscussion(userId).then(function(messages) {
171+
if (messagesBeingSent > 0) {
172+
// Ignore polling if due to a race condition.
173+
return;
174+
}
175+
$scope.messages = $mmaMessages.sortMessages(messages);
176+
notifyNewMessage();
177+
}).finally(function() {
178+
fetching = false;
179+
});
180+
}
181+
149182
// Set a polling to get new messages every certain time.
150183
function setPolling() {
151184
if (polling) {
@@ -154,29 +187,7 @@ angular.module('mm.addons.messages')
154187
}
155188

156189
// Start polling.
157-
polling = $interval(function() {
158-
$log.debug('Polling new messages for discussion with user ' + userId);
159-
if (messagesBeingSent > 0) {
160-
// We do not poll while a message is being sent or we could confuse the user
161-
// as his message would disappear from the list, and he'd have to wait for the
162-
// interval to check for new messages.
163-
return;
164-
} else if (!$mmApp.isOnline()) {
165-
// Obviously we cannot check for new messages when the app is offline.
166-
return;
167-
}
168-
169-
// Invalidate the cache before fetching.
170-
$mmaMessages.invalidateDiscussionCache(userId);
171-
$mmaMessages.getDiscussion(userId).then(function(messages) {
172-
if (messagesBeingSent > 0) {
173-
// Ignore polling if due to a race condition.
174-
return;
175-
}
176-
$scope.messages = $mmaMessages.sortMessages(messages);
177-
notifyNewMessage();
178-
});
179-
}, mmaMessagesPollInterval);
190+
polling = $interval(fetchMessages, mmaMessagesPollInterval);
180191
}
181192

182193
// Unset polling.
@@ -264,6 +275,33 @@ angular.module('mm.addons.messages')
264275
}
265276
}
266277

278+
// Check if user can delete messages.
279+
$scope.canDelete = $mmaMessages.canDeleteMessages();
280+
281+
// Function to select a message to be deleted.
282+
$scope.selectMessage = function(id) {
283+
$scope.selectedMessage = id;
284+
};
285+
286+
// Function to delete a message.
287+
$scope.deleteMessage = function(message, index) {
288+
$mmUtil.showConfirm($translate('mma.messages.deletemessageconfirmation')).then(function() {
289+
var modal = $mmUtil.showModalLoading('mm.core.deleting', true);
290+
$mmaMessages.deleteMessage(message.id, message.read).then(function() {
291+
$scope.messages.splice(index, 1); // Remove message from the list without having to wait for re-fetch.
292+
fetchMessages(); // Re-fetch messages to update cached data.
293+
}).catch(function(error) {
294+
if (typeof error === 'string') {
295+
$mmUtil.showErrorModal(error);
296+
} else {
297+
$mmUtil.showErrorModal('mma.messages.errordeletemessage', true);
298+
}
299+
}).finally(function() {
300+
modal.dismiss();
301+
});
302+
});
303+
};
304+
267305
if ($ionicPlatform.isTablet()) {
268306
$mmEvents.trigger(mmaMessagesDiscussionLoadedEvent, userId);
269307
}

www/addons/messages/lang/en.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
"contactname": "Contact name",
55
"contactlistempty": "The contact list is empty",
66
"contacts": "Contacts",
7-
"erroruseronlyacceptsmessagefromcontacts": "",
7+
"deletemessage": "Delete message",
8+
"deletemessageconfirmation": "Are you sure you want to delete this message? It will only be deleted from your messaging history and will still be viewable by the user who sent or received the message.",
9+
"errordeletemessage": "Error while deleting the message.",
810
"errorwhileretrievingcontacts": "Error while retrieving the contacts from the server.",
911
"errorwhileretrievingdiscussions": "Error while retrieving the discussions from the server.",
1012
"errorwhileretrievingmessages": "Error while retrieving the messages from the server.",

www/addons/messages/scss/styles.scss

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,13 @@ $mma-messages-date-badge: "stable" !default;
3232

3333
.mma-messages-discussion-container {
3434
padding-bottom: 15px;
35+
}
36+
37+
.button.button-icon.mma-messages-delete-button {
38+
min-height: auto;
39+
line-height: initial;
40+
&:before {
41+
font-size: 100%;
42+
line-height: initial;
43+
}
3544
}

www/addons/messages/services/messages.js

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,41 @@ angular.module('mm.addons.messages')
6060
});
6161
};
6262

63+
/**
64+
* Check if messages can be deleted in current site.
65+
*
66+
* @module mm.addons.messages
67+
* @ngdoc method
68+
* @name $mmaMessages#canDeleteMessages
69+
* @return {Boolean} True if can delete messages, false otherwise.
70+
*/
71+
self.canDeleteMessages = function() {
72+
return $mmSite.wsAvailable('core_message_delete_message');
73+
};
74+
75+
/**
76+
* Check if messages can be deleted in current site.
77+
*
78+
* @module mm.addons.messages
79+
* @ngdoc method
80+
* @name $mmaMessages#deleteMessage
81+
* @param {Number} id Message ID.
82+
* @param {Number} read 1 if message is read, 0 otherwise.
83+
* @param {Number} [userId] User we want to delete the message for. If not defined, use current user.
84+
* @return {Promise} Promise resolved when the message has been deleted.
85+
*/
86+
self.deleteMessage = function(id, read, userId) {
87+
userId = userId || $mmSite.getUserId();
88+
var params = {
89+
messageid: id,
90+
userid: userId,
91+
read: read
92+
};
93+
return $mmSite.write('core_message_delete_message', params).then(function() {
94+
return self.invalidateDiscussionCache(userId);
95+
});
96+
};
97+
6398
/**
6499
* Get all the contacts of the current user.
65100
*
@@ -405,7 +440,12 @@ angular.module('mm.addons.messages')
405440
newestfirst: 1,
406441
});
407442

408-
return $mmSite.read('core_message_get_messages', params, presets);
443+
return $mmSite.read('core_message_get_messages', params, presets).then(function(response) {
444+
angular.forEach(response.messages, function(message) {
445+
message.read = params.read == 0 ? 0 : 1;
446+
});
447+
return response;
448+
});
409449
};
410450

411451
/**

www/addons/messages/templates/discussion.html

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,14 @@
1212

1313
<p ng-if="showDate(messages[$index], messages[$index - 1])" class="mma-messages-date"><span>{{ message.timecreated * 1000 | mmFormatDate:"dfdayweekmonth" }}</span></p>
1414

15-
<div class='item item-message item-text-wrap' ng-class='{"item-message-mine": message.useridfrom == currentUserId}'>
15+
<div class='item item-message item-text-wrap' ng-class='{"item-message-mine": message.useridfrom == currentUserId}' on-hold="selectMessage(message.id)">
1616

1717
<mm-format-text after-render="scrollAfterRender" watch="true">{{ message.smallmessage | mmaMessagesFormat }}</mm-format-text>
1818
<ion-spinner ng-if="message.sending"></ion-spinner>
19-
<span class="item-note">{{ message.timecreated * 1000 | mmFormatDate:"dftimedate" }}</span>
19+
<span class="item-note">
20+
{{ message.timecreated * 1000 | mmFormatDate:"dftimedate" }}
21+
<button class="button button-icon icon ion-close-round mma-messages-delete-button" ng-if="canDelete && selectedMessage && selectedMessage == message.id" ng-click="deleteMessage(message, $index)"></button>
22+
</span>
2023

2124
</div>
2225

www/core/lang/en.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
"course": "Course",
2222
"day": "day",
2323
"days": "days",
24+
"deleting": "Deleting",
2425
"description": "Description",
2526
"dfdayweekmonth": "ddd, D MMM",
2627
"dflastweekdate": "ddd",

0 commit comments

Comments
 (0)