From 1146eea0fa30b4c62c7cea87ef40e5b27122b487 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Mon, 25 Mar 2019 14:40:05 +0100 Subject: [PATCH] MOBILE-2927 messages: Detect push in group conversations --- src/addon/messages/messages.module.ts | 4 +- .../messages/providers/mainmenu-handler.ts | 57 ++++++++++++++++++- src/addon/messages/providers/messages.ts | 34 +++++++++-- 3 files changed, 84 insertions(+), 11 deletions(-) diff --git a/src/addon/messages/messages.module.ts b/src/addon/messages/messages.module.ts index 2dd05562f..8cc6a9b7b 100644 --- a/src/addon/messages/messages.module.ts +++ b/src/addon/messages/messages.module.ts @@ -121,8 +121,8 @@ export class AddonMessagesModule { // Check if we have enough information to open the conversation. if (notification.convid && enabled) { pageParams.conversationId = Number(notification.convid); - } else if (notification.userfromid) { - pageParams.discussionUserId = Number(notification.userfromid); + } else if (notification.userfromid || notification.useridfrom) { + pageParams.discussionUserId = Number(notification.userfromid || notification.useridfrom); } linkHelper.goInSite(undefined, pageName, pageParams, notification.site); diff --git a/src/addon/messages/providers/mainmenu-handler.ts b/src/addon/messages/providers/mainmenu-handler.ts index 4b83ae499..155e0c2e8 100644 --- a/src/addon/messages/providers/mainmenu-handler.ts +++ b/src/addon/messages/providers/mainmenu-handler.ts @@ -229,8 +229,59 @@ export class AddonMessagesMainMenuHandler implements CoreMainMenuHandler, CoreCr * @return {Promise} Promise resolved with the notifications. */ protected fetchMessages(siteId?: string): Promise { - return this.messagesProvider.getUnreadReceivedMessages(true, false, true, siteId).then((response) => { - return response.messages; + return this.sitesProvider.getSite(siteId).then((site) => { + if (site.isVersionGreaterEqualThan('3.7')) { + + // Use get conversations WS to be able to get group conversations messages. + return this.messagesProvider.getConversations(undefined, undefined, 0, site.id, undefined, false, true) + .then((result) => { + + // Find the first unmuted conversation. + const conv = result.conversations.find((conversation) => { + return !conversation.ismuted; + }); + + if (conv.isread) { + // The conversation is read, no unread messages. + return []; + } + + const currentUserId = site.getUserId(), + message = conv.messages[0]; // Treat only the last message, is the one we're interested. + + if (!message || message.useridfrom == currentUserId) { + // No last message or not from current user. Return empty list. + return []; + } + + // Add some calculated data. + message.contexturl = ''; + message.contexturlname = ''; + message.convid = conv.id; + message.fullmessage = message.text; + message.fullmessageformat = 0; + message.fullmessagehtml = ''; + message.notification = 0; + message.read = 0; + message.smallmessage = message.smallmessage || message.text; + message.subject = conv.name; + message.timecreated = message.timecreated * 1000; + message.timeread = 0; + message.useridto = currentUserId; + message.usertofullname = site.getInfo().fullname; + + const userFrom = conv.members.find((member) => { + return member.id == message.useridfrom; + }); + message.userfromfullname = userFrom && userFrom.fullname; + + return [message]; + }); + } else { + return this.messagesProvider.getUnreadReceivedMessages(true, false, true, siteId).then((response) => { + return response.messages; + }); + } }); } @@ -242,7 +293,7 @@ export class AddonMessagesMainMenuHandler implements CoreMainMenuHandler, CoreCr */ protected getTitleAndText(message: any): Promise { const data = { - title: message.userfromfullname, + title: message.name || message.userfromfullname, }; return this.textUtils.formatText(message.text, true, true).catch(() => { diff --git a/src/addon/messages/providers/messages.ts b/src/addon/messages/providers/messages.ts index 6bf99d882..bfa615909 100644 --- a/src/addon/messages/providers/messages.ts +++ b/src/addon/messages/providers/messages.ts @@ -882,14 +882,20 @@ export class AddonMessagesProvider { result.messages = result.messages.slice(0, limitTo); } + let lastReceived; + result.messages.forEach((message) => { // Convert time to milliseconds. message.timecreated = message.timecreated ? message.timecreated * 1000 : 0; + + if (!lastReceived && message.useridfrom != userId) { + lastReceived = message; + } }); - if (this.appProvider.isDesktop() && params.useridto == userId && limitFrom === 0) { + if (this.appProvider.isDesktop() && limitFrom === 0 && lastReceived) { // Store the last received message (we cannot know if it's unread or not). Don't block the user for this. - this.storeLastReceivedMessageIfNeeded(conversationId, result.messages[0], site.getId()); + this.storeLastReceivedMessageIfNeeded(conversationId, lastReceived, site.getId()); } if (excludePending) { @@ -923,11 +929,13 @@ export class AddonMessagesProvider { * @param {number} [limitFrom=0] The offset to start at. * @param {string} [siteId] Site ID. If not defined, use current site. * @param {number} [userId] User ID. If not defined, current user in the site. + * @param {boolean} [forceCache] True if it should return cached data. Has priority over ignoreCache. + * @param {boolean} [ignoreCache] True if it should ignore cached data (it will always fail in offline or server down). * @return {Promise} Promise resolved with the conversations. * @since 3.6 */ - getConversations(type?: number, favourites?: boolean, limitFrom: number = 0, siteId?: string, userId?: number) - : Promise<{conversations: any[], canLoadMore: boolean}> { + getConversations(type?: number, favourites?: boolean, limitFrom: number = 0, siteId?: string, userId?: number, + forceCache?: boolean, ignoreCache?: boolean): Promise<{conversations: any[], canLoadMore: boolean}> { return this.sitesProvider.getSite(siteId).then((site) => { userId = userId || site.getUserId(); @@ -941,6 +949,13 @@ export class AddonMessagesProvider { limitnum: this.LIMIT_MESSAGES + 1, }; + if (forceCache) { + preSets['omitExpires'] = true; + } else if (ignoreCache) { + preSets['getFromCache'] = false; + preSets['emergencyCache'] = false; + } + if (typeof type != 'undefined' && type != null) { params.type = type; } @@ -951,8 +966,15 @@ export class AddonMessagesProvider { return site.read('core_message_get_conversations', params, preSets).then((response) => { // Format the conversations, adding some calculated fields. const conversations = response.conversations.slice(0, this.LIMIT_MESSAGES).map((conversation) => { - return this.formatConversation(conversation, userId); - }); + return this.formatConversation(conversation, userId); + }), + conv = conversations[0], + lastMessage = conv && conv.messages[0]; + + if (this.appProvider.isDesktop() && limitFrom === 0 && lastMessage && !conv.sentfromcurrentuser) { + // Store the last received message (we cannot know if it's unread or not). Don't block the user for this. + this.storeLastReceivedMessageIfNeeded(conv.id, lastMessage, site.getId()); + } return { conversations: conversations,