forked from CIT/Vmeda.Online
		
	MOBILE-2860 message: Allow conversations to be muted
This commit is contained in:
		
							parent
							
								
									c6e01bfa66
								
							
						
					
					
						commit
						791d9b4afa
					
				| @ -197,6 +197,7 @@ | ||||
|   "addon.messages.messagenotsent": "local_moodlemobileapp", | ||||
|   "addon.messages.messagepreferences": "message", | ||||
|   "addon.messages.messages": "message", | ||||
|   "addon.messages.muteconversation": "message", | ||||
|   "addon.messages.newmessage": "message", | ||||
|   "addon.messages.newmessages": "local_moodlemobileapp", | ||||
|   "addon.messages.nocontactrequests": "message", | ||||
| @ -230,6 +231,7 @@ | ||||
|   "addon.messages.unabletomessage": "message", | ||||
|   "addon.messages.unblockuser": "message", | ||||
|   "addon.messages.unblockuserconfirm": "message", | ||||
|   "addon.messages.unmuteconversation": "message", | ||||
|   "addon.messages.useentertosend": "message", | ||||
|   "addon.messages.useentertosenddescdesktop": "local_moodlemobileapp", | ||||
|   "addon.messages.useentertosenddescmac": "local_moodlemobileapp", | ||||
|  | ||||
| @ -36,6 +36,7 @@ | ||||
|     "messagenotsent": "The message was not sent. Please try again later.", | ||||
|     "messagepreferences": "Message preferences", | ||||
|     "messages": "Messages", | ||||
|     "muteconversation": "Mute", | ||||
|     "newmessage": "New message", | ||||
|     "newmessages": "New messages", | ||||
|     "nocontactrequests": "No contact requests", | ||||
| @ -69,6 +70,7 @@ | ||||
|     "unabletomessage": "You are unable to message this user", | ||||
|     "unblockuser": "Unblock user", | ||||
|     "unblockuserconfirm": "Are you sure you want to unblock {{$a}}?", | ||||
|     "unmuteconversation": "Unmute", | ||||
|     "useentertosend": "Use enter to send", | ||||
|     "useentertosenddescdesktop": "If disabled, you can use Ctrl+Enter to send the message.", | ||||
|     "useentertosenddescmac": "If disabled, you can use Cmd+Enter to send the message.", | ||||
|  | ||||
| @ -5,6 +5,7 @@ | ||||
|             <ion-avatar *ngIf="loaded && otherMember" class="core-bar-button-image" core-user-avatar [user]="otherMember" [linkProfile]="false" [checkOnline]="otherMember.showonlinestatus" item-start (click)="showInfo && viewInfo()"></ion-avatar> | ||||
|             <core-format-text [text]="title" (click)="showInfo && !isGroup && viewInfo()"></core-format-text> | ||||
|             <core-icon *ngIf="conversation && conversation.isfavourite" name="fa-star"></core-icon> | ||||
|             <core-icon *ngIf="conversation && conversation.ismuted" name="volume-off"></core-icon> | ||||
|         </ion-title> | ||||
|         <ion-buttons end></ion-buttons> | ||||
|     </ion-navbar> | ||||
| @ -15,6 +16,7 @@ | ||||
|             <core-context-menu-item [hidden]="!groupMessagingEnabled || !conversation" [priority]="800" [content]="(conversation && conversation.isfavourite ? 'addon.messages.removefromfavourites' : 'addon.messages.addtofavourites') | translate" (action)="changeFavourite($event)" [closeOnClick]="false" [iconAction]="favouriteIcon"></core-context-menu-item> | ||||
|             <core-context-menu-item [hidden]="isSelf || !otherMember || otherMember.isblocked" [priority]="700" [content]="'addon.messages.blockuser' | translate" (action)="blockUser()" [iconAction]="blockIcon"></core-context-menu-item> | ||||
|             <core-context-menu-item [hidden]="isSelf || !otherMember || !otherMember.isblocked" [priority]="700" [content]="'addon.messages.unblockuser' | translate" (action)="unblockUser()" [iconAction]="blockIcon"></core-context-menu-item> | ||||
|             <core-context-menu-item [hidden]="!muteEnabled || !conversation" [priority]="600" [content]="(conversation && conversation.ismuted ? 'addon.messages.unmuteconversation' : 'addon.messages.muteconversation') | translate" (action)="changeMute($event)" [closeOnClick]="false" [iconAction]="muteIcon"></core-context-menu-item> | ||||
|             <core-context-menu-item [hidden]="!canDelete" [priority]="400" [content]="'addon.messages.showdeletemessages' | translate" (action)="toggleDelete()" [iconAction]="(showDelete ? 'checkbox-outline' : 'square-outline')"></core-context-menu-item> | ||||
|             <core-context-menu-item [hidden]="!groupMessagingEnabled || !conversationId || isGroup" [priority]="200" [content]="'addon.messages.deleteconversation' | translate" (action)="deleteConversation($event)" [closeOnClick]="false" [iconAction]="deleteIcon"></core-context-menu-item> | ||||
|             <core-context-menu-item [hidden]="isSelf || !otherMember || otherMember.iscontact || requestContactSent || requestContactReceived" [priority]="100" [content]="'addon.messages.addtoyourcontacts' | translate" (action)="createContactRequest()" [iconAction]="addRemoveIcon"></core-context-menu-item> | ||||
|  | ||||
| @ -88,6 +88,8 @@ export class AddonMessagesDiscussionPage implements OnDestroy { | ||||
|     requestContactSent = false; | ||||
|     requestContactReceived = false; | ||||
|     isSelf = false; | ||||
|     muteEnabled = false; | ||||
|     muteIcon = 'volume-off'; | ||||
| 
 | ||||
|     constructor(private eventsProvider: CoreEventsProvider, sitesProvider: CoreSitesProvider, navParams: NavParams, | ||||
|             private userProvider: CoreUserProvider, private navCtrl: NavController, private messagesSync: AddonMessagesSyncProvider, | ||||
| @ -99,6 +101,7 @@ export class AddonMessagesDiscussionPage implements OnDestroy { | ||||
|         this.siteId = sitesProvider.getCurrentSiteId(); | ||||
|         this.currentUserId = sitesProvider.getCurrentSiteUserId(); | ||||
|         this.groupMessagingEnabled = this.messagesProvider.isGroupMessagingEnabled(); | ||||
|         this.muteEnabled = this.messagesProvider.isMuteConversationEnabled(); | ||||
| 
 | ||||
|         this.logger = logger.getInstance('AddonMessagesDiscussionPage'); | ||||
| 
 | ||||
| @ -443,6 +446,7 @@ export class AddonMessagesDiscussionPage implements OnDestroy { | ||||
|                     this.conversationImage = conversation.imageurl; | ||||
|                     this.isGroup = conversation.type == AddonMessagesProvider.MESSAGE_CONVERSATION_TYPE_GROUP; | ||||
|                     this.favouriteIcon = conversation.isfavourite ? 'fa-star-o' : 'fa-star'; | ||||
|                     this.muteIcon = conversation.ismuted ? 'volume-up' : 'volume-off'; | ||||
|                     if (!this.isGroup) { | ||||
|                         this.userId = conversation.userid; | ||||
|                     } | ||||
| @ -1107,6 +1111,33 @@ export class AddonMessagesDiscussionPage implements OnDestroy { | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Change the mute state of the current conversation. | ||||
|      * | ||||
|      * @param {Function} [done] Function to call when done. | ||||
|      */ | ||||
|     changeMute(done?: () => void): void { | ||||
|         this.muteIcon = 'spinner'; | ||||
| 
 | ||||
|         this.messagesProvider.muteConversation(this.conversation.id, !this.conversation.ismuted).then(() => { | ||||
|             this.conversation.ismuted = !this.conversation.ismuted; | ||||
| 
 | ||||
|             // Get the conversation data so it's cached. Don't block the user for this.
 | ||||
|             this.messagesProvider.getConversation(this.conversation.id, undefined, true); | ||||
| 
 | ||||
|             this.eventsProvider.trigger(AddonMessagesProvider.UPDATE_CONVERSATION_LIST_EVENT, { | ||||
|                 conversationId: this.conversation.id, | ||||
|                 action: 'mute', | ||||
|                 value: this.conversation.ismuted | ||||
|             }, this.siteId); | ||||
|         }).catch((error) => { | ||||
|             this.domUtils.showErrorModalDefault(error, 'Error changing muted state.'); | ||||
|         }).finally(() => { | ||||
|             this.muteIcon = this.conversation.ismuted ? 'volume-up' : 'volume-off'; | ||||
|             done && done(); | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Calculate whether there are pending contact requests. | ||||
|      */ | ||||
|  | ||||
| @ -101,6 +101,7 @@ | ||||
|         <h2> | ||||
|             <core-format-text [text]="conversation.name"></core-format-text> | ||||
|             <core-icon name="fa-ban" *ngIf="conversation.isblocked" [label]="'addon.messages.contactblocked' | translate"></core-icon> | ||||
|             <core-icon *ngIf="conversation.ismuted" name="volume-off"></core-icon> | ||||
|         </h2> | ||||
|         <ion-note *ngIf="conversation.lastmessagedate > 0 || conversation.unreadcount"> | ||||
|             <ion-badge *ngIf="conversation.unreadcount > 0">{{ conversation.unreadcount }}</ion-badge> | ||||
|  | ||||
| @ -166,8 +166,23 @@ export class AddonMessagesGroupConversationsPage implements OnInit, OnDestroy { | ||||
|         }); | ||||
| 
 | ||||
|         // Update conversations if we receive an event to do so.
 | ||||
|         this.updateConversationListObserver = eventsProvider.on(AddonMessagesProvider.UPDATE_CONVERSATION_LIST_EVENT, () => { | ||||
|         this.updateConversationListObserver = eventsProvider.on(AddonMessagesProvider.UPDATE_CONVERSATION_LIST_EVENT, (data) => { | ||||
|             if (data && data.action == 'mute') { | ||||
|                 // If the conversation is displayed, change its muted value.
 | ||||
|                 const expandedOption = this.getExpandedOption(); | ||||
| 
 | ||||
|                 if (expandedOption && expandedOption.conversations) { | ||||
|                     const conversation = this.findConversation(data.conversationId, undefined, expandedOption); | ||||
|                     if (conversation) { | ||||
|                         conversation.ismuted = data.value; | ||||
|                     } | ||||
|                 } | ||||
| 
 | ||||
|                 return; | ||||
|             } | ||||
| 
 | ||||
|             this.refreshData(); | ||||
| 
 | ||||
|         }, this.siteId); | ||||
| 
 | ||||
|         // If a message push notification is received, refresh the view.
 | ||||
|  | ||||
| @ -1938,6 +1938,34 @@ export class AddonMessagesProvider { | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Returns whether or not a site supports muting or unmuting a conversation. | ||||
|      * | ||||
|      * @param {CoreSite} [site] The site to check, undefined for current site. | ||||
|      * @return {boolean} If related WS is available on current site. | ||||
|      * @since 3.7 | ||||
|      */ | ||||
|     isMuteConversationEnabled(site?: CoreSite): boolean { | ||||
|         site = site || this.sitesProvider.getCurrentSite(); | ||||
| 
 | ||||
|         return site.wsAvailable('core_message_mute_conversations'); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Returns whether or not a site supports muting or unmuting a conversation. | ||||
|      * | ||||
|      * @param {string} [siteId] Site ID. If not defined, current site. | ||||
|      * @return {Promise<boolean>} Promise resolved with boolean: whether related WS is available on a certain site. | ||||
|      * @since 3.7 | ||||
|      */ | ||||
|     isMuteConversationEnabledInSite(siteId?: string): Promise<boolean> { | ||||
|         return this.sitesProvider.getSite(siteId).then((site) => { | ||||
|             return this.isMuteConversationEnabled(site); | ||||
|         }).catch(() => { | ||||
|             return false; | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Returns whether or not the plugin is enabled in a certain site. | ||||
|      * | ||||
| @ -2043,6 +2071,53 @@ export class AddonMessagesProvider { | ||||
|         return this.sitesProvider.getCurrentSite().write('core_message_mark_all_messages_as_read', params, preSets); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Mute or unmute a conversation. | ||||
|      * | ||||
|      * @param {number} conversationId Conversation ID. | ||||
|      * @param {boolean} set Whether to mute or unmute. | ||||
|      * @param {string} [siteId]  Site ID. If not defined, use current site. | ||||
|      * @param {number} [userId] User ID. If not defined, current user in the site. | ||||
|      * @return {Promise<any>}  Resolved when done. | ||||
|      */ | ||||
|     muteConversation(conversationId: number, set: boolean, siteId?: string, userId?: number): Promise<any> { | ||||
|         return this.muteConversations([conversationId], set, siteId, userId); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Mute or unmute some conversations. | ||||
|      * | ||||
|      * @param {number[]} conversations Conversation IDs. | ||||
|      * @param {boolean} set Whether to mute or unmute. | ||||
|      * @param {string} [siteId]  Site ID. If not defined, use current site. | ||||
|      * @param {number} [userId] User ID. If not defined, current user in the site. | ||||
|      * @return {Promise<any>}  Resolved when done. | ||||
|      */ | ||||
|     muteConversations(conversations: number[], set: boolean, siteId?: string, userId?: number): Promise<any> { | ||||
|         return this.sitesProvider.getSite(siteId).then((site) => { | ||||
|             userId = userId || site.getUserId(); | ||||
| 
 | ||||
|             const params = { | ||||
|                     userid: userId, | ||||
|                     conversationids: conversations | ||||
|                 }, | ||||
|                 wsName = set ? 'core_message_mute_conversations' : 'core_message_unmute_conversations'; | ||||
| 
 | ||||
|             return site.write(wsName, params).then(() => { | ||||
|                 // Invalidate the conversations data.
 | ||||
|                 const promises = []; | ||||
| 
 | ||||
|                 conversations.forEach((conversationId) => { | ||||
|                     promises.push(this.invalidateConversation(conversationId, site.getId(), userId)); | ||||
|                 }); | ||||
| 
 | ||||
|                 return Promise.all(promises).catch(() => { | ||||
|                     // Ignore errors.
 | ||||
|                 }); | ||||
|             }); | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Refresh the number of contact requests sent to the current user. | ||||
|      * | ||||
|  | ||||
| @ -197,6 +197,7 @@ | ||||
|     "addon.messages.messagenotsent": "The message was not sent. Please try again later.", | ||||
|     "addon.messages.messagepreferences": "Message preferences", | ||||
|     "addon.messages.messages": "Messages", | ||||
|     "addon.messages.muteconversation": "Mute", | ||||
|     "addon.messages.newmessage": "New message", | ||||
|     "addon.messages.newmessages": "New messages", | ||||
|     "addon.messages.nocontactrequests": "No contact requests", | ||||
| @ -230,6 +231,7 @@ | ||||
|     "addon.messages.unabletomessage": "You are unable to message this user", | ||||
|     "addon.messages.unblockuser": "Unblock user", | ||||
|     "addon.messages.unblockuserconfirm": "Are you sure you want to unblock {{$a}}?", | ||||
|     "addon.messages.unmuteconversation": "Unmute", | ||||
|     "addon.messages.useentertosend": "Use enter to send", | ||||
|     "addon.messages.useentertosenddescdesktop": "If disabled, you can use Ctrl+Enter to send the message.", | ||||
|     "addon.messages.useentertosenddescmac": "If disabled, you can use Cmd+Enter to send the message.", | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user