Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 62 additions & 24 deletions www/addons/messages/controllers/discussion.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,15 @@ 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) {
$mmUser, $translate) {

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

var userId = $stateParams.userId,
userFullname = $stateParams.userFullname,
messagesBeingSent = 0,
polling,
fetching,
backView = $ionicHistory.backView(),
lastMessage,
scrollView = $ionicScrollDelegate.$getByHandle('mmaMessagesScroll');
Expand Down Expand Up @@ -146,6 +147,38 @@ angular.module('mm.addons.messages')
}
};

// Convenience function to fetch messages.
function fetchMessages() {
$log.debug('Polling new messages for discussion with user ' + userId);
if (messagesBeingSent > 0) {
// We do not poll while a message is being sent or we could confuse the user
// as his message would disappear from the list, and he'd have to wait for the
// interval to check for new messages.
return;
} else if (!$mmApp.isOnline()) {
// Obviously we cannot check for new messages when the app is offline.
return;
} else if (fetching) {
// Already fetching.
return;
}

fetching = true;

// Invalidate the cache before fetching.
$mmaMessages.invalidateDiscussionCache(userId);
$mmaMessages.getDiscussion(userId).then(function(messages) {
if (messagesBeingSent > 0) {
// Ignore polling if due to a race condition.
return;
}
$scope.messages = $mmaMessages.sortMessages(messages);
notifyNewMessage();
}).finally(function() {
fetching = false;
});
}

// Set a polling to get new messages every certain time.
function setPolling() {
if (polling) {
Expand All @@ -154,29 +187,7 @@ angular.module('mm.addons.messages')
}

// Start polling.
polling = $interval(function() {
$log.debug('Polling new messages for discussion with user ' + userId);
if (messagesBeingSent > 0) {
// We do not poll while a message is being sent or we could confuse the user
// as his message would disappear from the list, and he'd have to wait for the
// interval to check for new messages.
return;
} else if (!$mmApp.isOnline()) {
// Obviously we cannot check for new messages when the app is offline.
return;
}

// Invalidate the cache before fetching.
$mmaMessages.invalidateDiscussionCache(userId);
$mmaMessages.getDiscussion(userId).then(function(messages) {
if (messagesBeingSent > 0) {
// Ignore polling if due to a race condition.
return;
}
$scope.messages = $mmaMessages.sortMessages(messages);
notifyNewMessage();
});
}, mmaMessagesPollInterval);
polling = $interval(fetchMessages, mmaMessagesPollInterval);
}

// Unset polling.
Expand Down Expand Up @@ -264,6 +275,33 @@ angular.module('mm.addons.messages')
}
}

// Check if user can delete messages.
$scope.canDelete = $mmaMessages.canDeleteMessages();

// Function to select a message to be deleted.
$scope.selectMessage = function(id) {
$scope.selectedMessage = id;
};

// Function to delete a message.
$scope.deleteMessage = function(message, index) {
$mmUtil.showConfirm($translate('mma.messages.deletemessageconfirmation')).then(function() {
var modal = $mmUtil.showModalLoading('mm.core.deleting', true);
$mmaMessages.deleteMessage(message.id, message.read).then(function() {
$scope.messages.splice(index, 1); // Remove message from the list without having to wait for re-fetch.
fetchMessages(); // Re-fetch messages to update cached data.
}).catch(function(error) {
if (typeof error === 'string') {
$mmUtil.showErrorModal(error);
} else {
$mmUtil.showErrorModal('mma.messages.errordeletemessage', true);
}
}).finally(function() {
modal.dismiss();
});
});
};

if ($ionicPlatform.isTablet()) {
$mmEvents.trigger(mmaMessagesDiscussionLoadedEvent, userId);
}
Expand Down
4 changes: 3 additions & 1 deletion www/addons/messages/lang/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@
"contactname": "Contact name",
"contactlistempty": "The contact list is empty",
"contacts": "Contacts",
"erroruseronlyacceptsmessagefromcontacts": "",
"deletemessage": "Delete message",
"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.",
"errordeletemessage": "Error while deleting the message.",
"errorwhileretrievingcontacts": "Error while retrieving the contacts from the server.",
"errorwhileretrievingdiscussions": "Error while retrieving the discussions from the server.",
"errorwhileretrievingmessages": "Error while retrieving the messages from the server.",
Expand Down
9 changes: 9 additions & 0 deletions www/addons/messages/scss/styles.scss
Original file line number Diff line number Diff line change
Expand Up @@ -32,4 +32,13 @@ $mma-messages-date-badge: "stable" !default;

.mma-messages-discussion-container {
padding-bottom: 15px;
}

.button.button-icon.mma-messages-delete-button {
min-height: auto;
line-height: initial;
&:before {
font-size: 100%;
line-height: initial;
}
}
42 changes: 41 additions & 1 deletion www/addons/messages/services/messages.js
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,41 @@ angular.module('mm.addons.messages')
});
};

/**
* Check if messages can be deleted in current site.
*
* @module mm.addons.messages
* @ngdoc method
* @name $mmaMessages#canDeleteMessages
* @return {Boolean} True if can delete messages, false otherwise.
*/
self.canDeleteMessages = function() {
return $mmSite.wsAvailable('core_message_delete_message');
};

/**
* Check if messages can be deleted in current site.
*
* @module mm.addons.messages
* @ngdoc method
* @name $mmaMessages#deleteMessage
* @param {Number} id Message ID.
* @param {Number} read 1 if message is read, 0 otherwise.
* @param {Number} [userId] User we want to delete the message for. If not defined, use current user.
* @return {Promise} Promise resolved when the message has been deleted.
*/
self.deleteMessage = function(id, read, userId) {
userId = userId || $mmSite.getUserId();
var params = {
messageid: id,
userid: userId,
read: read
};
return $mmSite.write('core_message_delete_message', params).then(function() {
return self.invalidateDiscussionCache(userId);
});
};

/**
* Get all the contacts of the current user.
*
Expand Down Expand Up @@ -405,7 +440,12 @@ angular.module('mm.addons.messages')
newestfirst: 1,
});

return $mmSite.read('core_message_get_messages', params, presets);
return $mmSite.read('core_message_get_messages', params, presets).then(function(response) {
angular.forEach(response.messages, function(message) {
message.read = params.read == 0 ? 0 : 1;
});
return response;
});
};

/**
Expand Down
7 changes: 5 additions & 2 deletions www/addons/messages/templates/discussion.html
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,14 @@

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

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

<mm-format-text after-render="scrollAfterRender" watch="true">{{ message.smallmessage | mmaMessagesFormat }}</mm-format-text>
<ion-spinner ng-if="message.sending"></ion-spinner>
<span class="item-note">{{ message.timecreated * 1000 | mmFormatDate:"dftimedate" }}</span>
<span class="item-note">
{{ message.timecreated * 1000 | mmFormatDate:"dftimedate" }}
<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>
</span>

</div>

Expand Down
1 change: 1 addition & 0 deletions www/core/lang/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
"course": "Course",
"day": "day",
"days": "days",
"deleting": "Deleting",
"description": "Description",
"dfdayweekmonth": "ddd, D MMM",
"dflastweekdate": "ddd",
Expand Down