// (C) Copyright 2015 Moodle Pty Ltd. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. import { Component, OnInit } from '@angular/core'; import { CoreUser } from '@features/user/services/user'; import { IonRefresher } from '@ionic/angular'; import { CoreNavigator } from '@services/navigator'; import { CoreSites } from '@services/sites'; import { CoreDomUtils } from '@services/utils/dom'; import { CoreUtils } from '@services/utils/utils'; import { AddonModChat } from '../../services/chat'; import { AddonModChatFormattedSessionMessage, AddonModChatHelper } from '../../services/chat-helper'; /** * Page that displays list of chat session messages. */ @Component({ selector: 'page-addon-mod-chat-session-messages', templateUrl: 'session-messages.html', styleUrls: ['session-messages.scss', '../../../../messages/pages/discussion/discussion.scss'], }) export class AddonModChatSessionMessagesPage implements OnInit { currentUserId!: number; cmId!: number; messages: AddonModChatFormattedSessionMessage[] = []; loaded = false; courseId!: number; protected chatId!: number; protected sessionStart!: number; protected sessionEnd!: number; protected groupId!: number; /** * @inheritdoc */ ngOnInit(): void { this.courseId = CoreNavigator.getRouteNumberParam('courseId')!; this.cmId = CoreNavigator.getRouteNumberParam('cmId')!; this.sessionStart = CoreNavigator.getRouteNumberParam('sessionStart')!; this.sessionEnd = CoreNavigator.getRouteNumberParam('sessionEnd')!; this.chatId = CoreNavigator.getRouteNumberParam('chatId')!; this.groupId = CoreNavigator.getRouteNumberParam('groupId') || 0; this.currentUserId = CoreSites.getCurrentSiteUserId(); this.fetchMessages(); } /** * Fetch session messages. * * @return Promise resolved when done. */ protected async fetchMessages(): Promise { try { const messages = await AddonModChat.getSessionMessages( this.chatId, this.sessionStart, this.sessionEnd, this.groupId, { cmId: this.cmId }, ); this.messages = await AddonModChat.getMessagesUserData(messages, this.courseId); // Calculate which messages need to display the date or user data. for (let index = 0 ; index < this.messages.length; index++) { const prevMessage = index > 0 ? this.messages[index - 1] : undefined; this.messages[index] = AddonModChatHelper.formatMessage(this.currentUserId, this.messages[index], prevMessage); const message = this.messages[index]; if (message.beep && message.beep != String(this.currentUserId)) { this.loadMessageBeepWho(message); } } this.messages[this.messages.length - 1].showTail = true; } catch (error) { CoreDomUtils.showErrorModalDefault(error, 'core.errorloadingcontent', true); } finally { this.loaded = true; } } protected async loadMessageBeepWho(message: AddonModChatFormattedSessionMessage): Promise { message.beepWho = await this.getUserFullname(message.beep!); } /** * Get the user fullname for a beep. * * @param id User Id before parsing. * @return User fullname. */ protected async getUserFullname(id: string): Promise { const idNumber = parseInt(id, 10); if (isNaN(idNumber)) { return id; } try { const user = await CoreUser.getProfile(idNumber, this.courseId, true); return user.fullname; } catch { // Error getting profile. return id; } } /** * Refresh session messages. * * @param refresher Refresher. */ async refreshMessages(refresher: IonRefresher): Promise { try { await CoreUtils.ignoreErrors(AddonModChat.invalidateSessionMessages(this.chatId, this.sessionStart, this.groupId)); await this.fetchMessages(); } finally { refresher.complete(); } } }