diff --git a/src/addons/messages/pages/discussion/discussion.ts b/src/addons/messages/pages/discussion/discussion.ts index fcc8dc0c1..307167767 100644 --- a/src/addons/messages/pages/discussion/discussion.ts +++ b/src/addons/messages/pages/discussion/discussion.ts @@ -65,7 +65,7 @@ export class AddonMessagesDiscussionPage implements OnInit, OnDestroy, AfterView protected messagesBeingSent = 0; protected pagesLoaded = 1; - protected lastMessage = { text: '', timecreated: 0 }; + protected lastMessage?: { text: string; timecreated: number }; protected keepMessageMap: {[hash: string]: boolean} = {}; protected syncObserver: CoreEventObserver; protected oldContentHeight = 0; @@ -465,7 +465,7 @@ export class AddonMessagesDiscussionPage implements OnInit, OnDestroy, AfterView // If we received a new message while using group messaging, force mark messages as read. const last = this.messages[this.messages.length - 1]; - const forceMark = this.groupMessagingEnabled && last && last.useridfrom != this.currentUserId && this.lastMessage.text != '' + const forceMark = this.groupMessagingEnabled && last && last.useridfrom !== this.currentUserId && !!this.lastMessage && (last.text !== this.lastMessage.text || last.timecreated !== this.lastMessage.timecreated); // Notify that there can be a new message. @@ -773,14 +773,14 @@ export class AddonMessagesDiscussionPage implements OnInit, OnDestroy, AfterView * Notify the last message found so discussions list controller can tell if last message should be updated. */ protected notifyNewMessage(): void { - const last = this.messages[this.messages.length - 1]; + const last = this.messages[this.messages.length - 1] as AddonMessagesConversationMessageFormatted | undefined; let trigger = false; if (!last) { - this.lastMessage = { text: '', timecreated: 0 }; + this.lastMessage = undefined; trigger = true; - } else if (last.text !== this.lastMessage.text || last.timecreated !== this.lastMessage.timecreated) { + } else if (last.text !== this.lastMessage?.text || last.timecreated !== this.lastMessage?.timecreated) { this.lastMessage = { text: last.text || '', timecreated: last.timecreated }; trigger = true; } @@ -790,8 +790,9 @@ export class AddonMessagesDiscussionPage implements OnInit, OnDestroy, AfterView CoreEvents.trigger(AddonMessagesProvider.NEW_MESSAGE_EVENT, { conversationId: this.conversationId, userId: this.userId, - message: this.lastMessage.text, - timecreated: this.lastMessage.timecreated, + message: this.lastMessage?.text, + timecreated: this.lastMessage?.timecreated ?? 0, + userFrom: last?.useridfrom ? this.members[last.useridfrom] : undefined, isfavourite: !!this.conversation?.isfavourite, type: this.conversation?.type, }, this.siteId); diff --git a/src/addons/messages/pages/discussions-35/discussions.ts b/src/addons/messages/pages/discussions-35/discussions.ts index 3b597d0c7..f82f985ae 100644 --- a/src/addons/messages/pages/discussions-35/discussions.ts +++ b/src/addons/messages/pages/discussions-35/discussions.ts @@ -89,7 +89,7 @@ export class AddonMessagesDiscussions35Page implements OnInit, OnDestroy { }); } else if (discussion.message) { // An existing discussion has a new message, update the last message. - discussion.message.message = data.message; + discussion.message.message = data.message ?? ''; discussion.message.timecreated = data.timecreated; } } diff --git a/src/addons/messages/pages/group-conversations/group-conversations.html b/src/addons/messages/pages/group-conversations/group-conversations.html index 109cedd73..9cca75e2d 100644 --- a/src/addons/messages/pages/group-conversations/group-conversations.html +++ b/src/addons/messages/pages/group-conversations/group-conversations.html @@ -185,7 +185,7 @@

-

+

{{ 'addon.messages.you' | translate }} diff --git a/src/addons/messages/pages/group-conversations/group-conversations.ts b/src/addons/messages/pages/group-conversations/group-conversations.ts index d250f26ad..0250072b8 100644 --- a/src/addons/messages/pages/group-conversations/group-conversations.ts +++ b/src/addons/messages/pages/group-conversations/group-conversations.ts @@ -112,7 +112,7 @@ export class AddonMessagesGroupConversationsPage implements OnInit, OnDestroy { this.newMessagesObserver = CoreEvents.on( AddonMessagesProvider.NEW_MESSAGE_EVENT, (data) => { - // Check if the new message belongs to the option that is currently expanded. + // Check if the new message belongs to the option that is currently expanded. const expandedOption = this.getExpandedOption(); const messageOption = this.getConversationOption(data); @@ -124,7 +124,7 @@ export class AddonMessagesGroupConversationsPage implements OnInit, OnDestroy { const conversation = this.findConversation(data.conversationId, data.userId, expandedOption); if (conversation === undefined) { - // Probably a new conversation, refresh the list. + // Probably a new conversation, refresh the list. this.loaded = false; this.refreshData().finally(() => { this.loaded = true; @@ -132,19 +132,34 @@ export class AddonMessagesGroupConversationsPage implements OnInit, OnDestroy { return; } - if (conversation.lastmessage != data.message || conversation.lastmessagedate != data.timecreated / 1000) { + + if (data.message === undefined) { + conversation.lastmessage = undefined; + conversation.lastmessagedate = undefined; + conversation.sentfromcurrentuser = undefined; + + return; + } + + if (conversation.lastmessage !== data.message || conversation.lastmessagedate !== data.timecreated / 1000) { const isNewer = data.timecreated / 1000 > (conversation.lastmessagedate || 0); // An existing conversation has a new message, update the last message. conversation.lastmessage = data.message; conversation.lastmessagedate = data.timecreated / 1000; + if (data.userFrom) { + conversation.sentfromcurrentuser = data.userFrom.id === this.currentUserId; + if (conversation.type === AddonMessagesProvider.MESSAGE_CONVERSATION_TYPE_GROUP) { + conversation.members[0] = data.userFrom; + } + } // Sort the affected list. const option = this.getConversationOption(conversation); option.conversations = AddonMessages.sortConversations(option.conversations || []); if (isNewer) { - // The last message is newer than the previous one, scroll to top to keep viewing the conversation. + // The last message is newer than the previous one, scroll to top to keep viewing the conversation. this.content?.scrollToTop(); } } diff --git a/src/addons/messages/services/messages.ts b/src/addons/messages/services/messages.ts index 8ec8b37f9..5fbe30c06 100644 --- a/src/addons/messages/services/messages.ts +++ b/src/addons/messages/services/messages.ts @@ -3669,8 +3669,9 @@ export type AddonMessagesReadChangedEventData = { export type AddonMessagesNewMessagedEventData = { conversationId?: number; userId?: number; - message: string; + message?: string; // If undefined it means the conversation has no messages, e.g. last message was deleted. timecreated: number; + userFrom?: AddonMessagesConversationMember; isfavourite: boolean; type?: number; }; diff --git a/src/addons/notes/lang.json b/src/addons/notes/lang.json index 732140ed1..e2ab32ccc 100644 --- a/src/addons/notes/lang.json +++ b/src/addons/notes/lang.json @@ -10,5 +10,5 @@ "personalnotes": "Personal notes", "publishstate": "Context", "sitenotes": "Site notes", - "warningnotenotsent": "Couldn't add note(s) to course {{course}}. {{error}}" + "warningnotenotsent": "Couldn't add or delete note(s). {{error}}" } diff --git a/src/addons/notes/services/notes-sync.ts b/src/addons/notes/services/notes-sync.ts index 749bb5af6..494ad931c 100644 --- a/src/addons/notes/services/notes-sync.ts +++ b/src/addons/notes/services/notes-sync.ts @@ -231,7 +231,7 @@ export class AddonNotesSyncProvider extends CoreSyncBaseProvider Translate.instant('addon.notes.warningnotenotsent', { - course: 'fullname' in course ? course.fullname : courseId, + course: 'fullname' in course ? course.fullname : courseId, // @deprecated since 4.3. error: error, })); }