From a73dde467c5ab0fa375fb618b7d6f2d0d4cedc94 Mon Sep 17 00:00:00 2001 From: Peter Maquiran Date: Mon, 9 Jan 2023 10:49:58 +0100 Subject: [PATCH] improve chat --- src/app/home/home.page.ts | 8 +- src/app/modals/profile/profile.page.ts | 6 +- src/app/models/beast-orm.ts | 19 +- .../group-messages/group-messages.page.html | 6 +- .../pages/chat/messages/messages.page.html | 6 +- .../gabinete-digital/gabinete-digital.page.ts | 2 +- src/app/services/auth.service.ts | 3 +- src/app/services/chat.service.ts | 28 +- src/app/services/chat/chat-system.service.ts | 15 +- src/app/services/chat/message.service.ts | 138 ++++-- src/app/services/chat/room.service.ts | 423 ++++++++---------- .../services/chat/viewed-message.service.ts | 52 ++- src/app/services/inativity.service.ts | 40 +- .../group-messages/group-messages.page.html | 6 +- .../shared/chat/messages/messages.page.html | 19 +- .../shared/chat/messages/messages.page.scss | 7 + src/app/shared/chat/messages/messages.page.ts | 3 + src/assets/icon/governoangola_A.png | Bin 0 -> 75852 bytes src/environments/environment.ts | 14 +- src/index.html | 2 +- version/git-version.ts | 12 +- 21 files changed, 436 insertions(+), 373 deletions(-) create mode 100644 src/assets/icon/governoangola_A.png diff --git a/src/app/home/home.page.ts b/src/app/home/home.page.ts index f6dbe7daf..b3e1bda3f 100644 --- a/src/app/home/home.page.ts +++ b/src/app/home/home.page.ts @@ -102,7 +102,7 @@ export class HomePage implements OnInit { window['inactivity/function'] = () => { - if (window.location.pathname != '/inactivity') { + if (window.location.pathname != '/inactivity' && window.location.pathname != '/') { document.querySelectorAll('ion-modal').forEach((e: any) => e.remove()); document.querySelectorAll('.popover-viewport').forEach((e: any) => e.remove()); @@ -112,9 +112,11 @@ export class HomePage implements OnInit { SessionStore.setUrlBeforeInactivity(pathname) if (this.platform.is('mobileweb')) { - this.router.navigate(['/inactivity']); + // this.router.navigate(['/inactivity']); + window.location.pathname = '/inactivity' } else { - this.router.navigate(['/']); + // this.router.navigate(['/']); + window.location.pathname = '/' } } diff --git a/src/app/modals/profile/profile.page.ts b/src/app/modals/profile/profile.page.ts index 257b64fa3..912873482 100644 --- a/src/app/modals/profile/profile.page.ts +++ b/src/app/modals/profile/profile.page.ts @@ -59,7 +59,6 @@ export class ProfilePage implements OnInit { ngOnInit() { if (this.platform.is('desktop') || this.platform.is('mobileweb')) { - // console.log('Notifications not supported') this.getNotificationData(); } else { this.getNotificationData(); @@ -78,8 +77,6 @@ export class ProfilePage implements OnInit { async getNotificationData() { - console.log('profile',this.storageservice.key("Notifications")) - const keyExist = await this.storageservice.keyExist("Notifications") if(keyExist) { @@ -225,9 +222,8 @@ export class ProfilePage implements OnInit { setTimeout(() => { // alert('logout') this.router.navigateByUrl('/auth', { replaceUrl: true }); - this.router.navigate(['/auth']); - setTimeout(() =>{ + setTimeout(() => { if(this.logoutOut == false) { window.location.pathname = '/auth' } diff --git a/src/app/models/beast-orm.ts b/src/app/models/beast-orm.ts index fc116a9a2..8edea3bb2 100644 --- a/src/app/models/beast-orm.ts +++ b/src/app/models/beast-orm.ts @@ -3,7 +3,6 @@ import { environment } from 'src/environments/environment' const { ArrayField, JsonField} = models.indexedDB.fields export class MessageModel extends models.Model { - channels = ArrayField() mentions = ArrayField() msg = models.CharField() @@ -17,27 +16,33 @@ export class MessageModel extends models.Model { offline = models.BooleanField() viewed = ArrayField({blank:true}) received = ArrayField({blank:true}) - localReference = models.CharField({blank:true}) + localReference = models.CharField({blank:true, unique: true}) attachments = ArrayField({blank:true}) file = JsonField({blank:true}) + async getAttachments() { + const _attachments = await attachments.filter({id: this['id']}) + return _attachments + } +} + +export class attachments extends models.Model { + message = models.OneToOneField({model:MessageModel}) + attachments = ArrayField({default:[]}) } export class DeleteMessageModel extends models.Model { - messageId = models.CharField() rid = models.CharField() u = JsonField() needToReceiveBy = ArrayField() } - - models.register({ databaseName: 'chat-storage'+environment.version.lastCommitNumber, type: 'indexedDB', - version: 5, - models: [MessageModel, DeleteMessageModel] + version: 10, + models: [MessageModel, DeleteMessageModel, attachments] }) diff --git a/src/app/pages/chat/group-messages/group-messages.page.html b/src/app/pages/chat/group-messages/group-messages.page.html index dc8a49e1f..274e63b16 100644 --- a/src/app/pages/chat/group-messages/group-messages.page.html +++ b/src/app/pages/chat/group-messages/group-messages.page.html @@ -64,7 +64,7 @@ - +
Tentar
@@ -103,7 +103,7 @@ - +
Tentar
@@ -157,7 +157,7 @@ - +
Tentar
diff --git a/src/app/pages/chat/messages/messages.page.html b/src/app/pages/chat/messages/messages.page.html index 427b039c6..e58d98f8f 100644 --- a/src/app/pages/chat/messages/messages.page.html +++ b/src/app/pages/chat/messages/messages.page.html @@ -61,7 +61,7 @@ - +
Tentar
@@ -98,7 +98,7 @@ - +
Tentar
@@ -164,7 +164,7 @@ - +
Tentar
diff --git a/src/app/pages/gabinete-digital/gabinete-digital.page.ts b/src/app/pages/gabinete-digital/gabinete-digital.page.ts index cee2c2fae..7b8e1226c 100644 --- a/src/app/pages/gabinete-digital/gabinete-digital.page.ts +++ b/src/app/pages/gabinete-digital/gabinete-digital.page.ts @@ -206,7 +206,7 @@ export class GabineteDigitalPage implements OnInit { }) this.backgroundservice.registerBackService('Online', () => { - this.loadAllProcesses(); + // this.loadAllProcesses(); }); diff --git a/src/app/services/auth.service.ts b/src/app/services/auth.service.ts index 20287d5a9..d0c0b6d6f 100644 --- a/src/app/services/auth.service.ts +++ b/src/app/services/auth.service.ts @@ -116,9 +116,10 @@ export class AuthService { SessionStore.save() this.RochetChatConnectorService.setStatus('online') - + window['RochetChatConnectorService'] = this.RochetChatConnectorService setTimeout(() => { this.ChatSystemService.getAllRooms(); + this.RochetChatConnectorService.setStatus('online') }, 200); diff --git a/src/app/services/chat.service.ts b/src/app/services/chat.service.ts index cdef8f659..89e27fede 100644 --- a/src/app/services/chat.service.ts +++ b/src/app/services/chat.service.ts @@ -395,21 +395,27 @@ export class ChatService { if(this.NetworkServiceService.getCurrentNetworkStatus() == ConnectionStatus.Offline) { this.RochetChatConnectorService.registerCallback({ + requestId: 'refreshtoken', type: 'reConnect', - funx: async ()=> { + funx: async () => { + this.resetTimer(); await this.refreshtoken(); - + + return true } }) } else { - this.resetTimer(); - await this.refreshtoken(); + + setTimeout(async () => { + this.resetTimer(); + await this.refreshtoken(); + }, 60000) + } } - } else if(!SessionStore.user.ChatData) { // do nothing } else if (!this.headers) { @@ -437,7 +443,6 @@ export class ChatService { } - functionTimer = null; timerEventTriggerDate = null timerEventTriggerDateLastUpdate = null @@ -447,8 +452,15 @@ export class ChatService { this.timerEventTriggerDate = new Date(+new Date() + 60000*15); this.functionTimer = setTimeout(() => { - this.refreshtoken(); - }, 60000 * 5); // time is in milliseconds + + if(this.NetworkServiceService.getCurrentNetworkStatus() == ConnectionStatus.Online) { + this.refreshtoken(); + } else { + this.resetTimer() + } + + }, 60000 * 15); // time is in milliseconds + } } diff --git a/src/app/services/chat/chat-system.service.ts b/src/app/services/chat/chat-system.service.ts index d66e1f5e6..07c820cfb 100644 --- a/src/app/services/chat/chat-system.service.ts +++ b/src/app/services/chat/chat-system.service.ts @@ -283,11 +283,12 @@ export class ChatSystemService { this.loadingWholeList = false await this.storage.set('Rooms', rooms); + this.sortRoomList() + setTimeout(() => { this.sortRoomList() }, 1000) - setTimeout(() => { this.sortRoomList() }, 10000) @@ -480,19 +481,19 @@ export class ChatSystemService { */ private getUserStatus(id?:string) { - this.RochetChatConnectorService.getUserStatus((d) => { + this.RochetChatConnectorService.getUserStatus(async (d) => { + const userId = d.fields.args[0][0] const username = d.fields.args[0][1] const statusNum = d.fields.args[0][2] - const statusText = this.statusNumberToText(statusNum) - this.users.forEach((user, index) => { - if(user.username == username) { - this.users[index].status = statusText + for ( const user of this.users) { + if(user._id == userId) { + user.status = statusText } - }) + } }) } diff --git a/src/app/services/chat/message.service.ts b/src/app/services/chat/message.service.ts index 9943312a5..6a9610ea6 100644 --- a/src/app/services/chat/message.service.ts +++ b/src/app/services/chat/message.service.ts @@ -12,8 +12,8 @@ import { HttpEventType } from '@angular/common/http'; import { AttachmentsService } from 'src/app/services/attachments.service'; import { NetworkServiceService , ConnectionStatus} from 'src/app/services/network-service.service'; import { ChatSystemService } from './chat-system.service'; -import { resolve } from 'dns'; -import { async } from '@angular/core/testing'; +import { v4 as uuidv4 } from 'uuid' + @Injectable({ providedIn: 'root' }) @@ -38,7 +38,6 @@ export class MessageService { _updatedAt file attachments - offline = true displayType = '' temporaryData: any = {} hasFile = false @@ -50,8 +49,8 @@ export class MessageService { from: 'Offline'|'History'|'stream'| 'send' duration = '' localReference = null - viewed = [] - received = [] + viewed: string[] = [] + received: string[]= [] addToDb = false messageSend = false @@ -73,7 +72,7 @@ export class MessageService { private ChatSystemService: ChatSystemService) { } - setData({customFields = {}, channels, mentions, msg ,rid ,ts, u, t, _id, id, _updatedAt, file, attachments, temporaryData, localReference , viewed = [], received = [], delate = false, delateRequest =false, from, sendAttempt = 0 }:Message) { + setData({customFields = {}, channels, mentions, msg ,rid ,ts, u, t, _id, id, _updatedAt, file, attachments, temporaryData, localReference = 'out-'+uuidv4() , viewed = [], received = [], delate = false, delateRequest =false, from, sendAttempt = 0 }:Message) { this.channels = channels || [] this.mentions = mentions || [] @@ -102,11 +101,9 @@ export class MessageService { this.received = [...new Set([...received,...this.received])]; if(!this.ts) { - this.offline = true this.messageSend = false } else { this.messageSend = true - this.offline = false } if (this.file) { @@ -137,6 +134,34 @@ export class MessageService { this.calDateDuration() } + + get offline () { + if(!this._id) { + return true + } + + if(!this.ts) { + return true + } + + return false + } + + /** + * Message is on the server + */ + get online() { + return !this.offline + } + + /** + * if Message is already saved on database + */ + get save() { + return this.id != '' + } + + private usernameToDisplayName(username) { try { @@ -150,7 +175,6 @@ export class MessageService { } async send(): Promise { - if(this.messageSend) { return new Promise((resolve, reject) => { resolve('solve') @@ -183,7 +207,7 @@ export class MessageService { this.RochetChatConnectorService.registerCallback({ type: 'reConnect', - funx: async ()=> { + funx: async () => { this.send().catch((error) =>{ console.error(error) }) @@ -250,7 +274,6 @@ export class MessageService { } if(this.NetworkServiceService.getCurrentNetworkStatus() == ConnectionStatus.Online) { - // console.log('online send') if(this.msg == '') { if(this.sendAttempt >= 4) { @@ -259,7 +282,6 @@ export class MessageService { ChatMessage = ChatMessage.message.result clearTimeout(this.functionTimer); - this.messageSend = true this.redefinedMessage(ChatMessage) } @@ -270,12 +292,12 @@ export class MessageService { } } else { + this.RochetChatConnectorService.send(params).then( (ChatMessage: any) => { ChatMessage = ChatMessage.message.result clearTimeout(this.functionTimer); - this.messageSend = true this.redefinedMessage(ChatMessage) } @@ -286,7 +308,6 @@ export class MessageService { } this.functionTimer = setTimeout(() => { - this.RochetChatConnectorService.registerCallback({ type:'Onmessage', key:'ping-pong-message', @@ -300,7 +321,7 @@ export class MessageService { return true } - this.save() + this.saveChanges() } }) @@ -312,7 +333,6 @@ export class MessageService { this.RochetChatConnectorService.registerCallback({ type: 'reConnect', funx: async ()=> { - this.send().catch((error) =>{ console.error(error) }) @@ -329,11 +349,18 @@ export class MessageService { const message = this.getChatObj() this.manualRetry = false + this.messageSend = true ChatMessage = Object.assign(message, ChatMessage) this.setData(ChatMessage) - await this.save() + const roomObject = this.ChatSystemService.getRoomById(this.rid) + const users = roomObject.getUsersByStatus('online') + for(const user of users) { + this.addReceived(user._id) + } + + await this.saveChanges() } downloadFileMsg() { @@ -363,7 +390,7 @@ export class MessageService { } // save the changes to the storage - this.save() + this.saveChanges() this.downloadLoader = false; this.downloadAttachments = true this.downloadAttachmentsTemp++; @@ -384,30 +411,55 @@ export class MessageService { async delateStatusFalse() { this.delate = true - this.save() + this.saveChanges() + } + + addViewed(id: string) { + if(this.messageOwner()) { + let found = this.viewed.find((UserId) => UserId == id) + + if(!found) { + this.viewed.push(id) + return true + } + } + + return false + } + + addReceived(id: string) { + if(this.messageOwner()) { + let found = this.received.find((UserId) => UserId == id) + + if(!found) { + this.received.push(id) + return true + } + } + return false } async delateDB() { - const message = await MessageModel.get({_id: this._id}) + const message = await MessageModel.get({id: this.id}) await message.delete() } isSenderIsNotMe(ChatMessage) { - return SessionStore.user.UserName != ChatMessage.u.username + return SessionStore.user.ChatData.data.userId != ChatMessage.u._id } - messageOwnerById(id) { - return SessionStore.user.UserName != this.u.username + messageOwner() { + return SessionStore.user.ChatData.data.userId == this.u._id } private getChatObj() { return { channels: this.channels, mentions: this.mentions, - //msg: this.AESEncrypt.encrypt(this.msg, SessionStore.user.UserName), + // msg: this.AESEncrypt.encrypt(this.msg, SessionStore.user.UserName), sendAttempt: this.sendAttempt, msg:this.msg, rid: this.rid, @@ -427,8 +479,10 @@ export class MessageService { } } + earlySave = false + async addMessageDB() { - if(!this.addToDb) { + if(!this.addToDb && this.save) { this.addToDb = true const message = this.getChatObj() @@ -436,15 +490,39 @@ export class MessageService { const createdMessage = await MessageModel.create(message) this.id = createdMessage.id + + if(this.earlySave) { + this.saveChanges(); + } } } - async save() { - const message = this.getChatObj() + async saveChanges() { + + + if(this.save) { + const message = this.getChatObj() + let a + + if (this.localReference) { + a = await MessageModel.get({localReference: this.localReference}) + } else if (this._id) { + a = await MessageModel.get({id: this.id}) + } else if(this.id) { + a = await MessageModel.get({_id: this._id}) + } + + for( const [name, value] of Object.entries(message)) { + a[name] = value + } + + await a.save() + + } else { + this.earlySave = true + console.log('save change to early') + } - - await MessageModel.update(message) - } decryptMessage() { diff --git a/src/app/services/chat/room.service.ts b/src/app/services/chat/room.service.ts index ee94368b7..2d76dfcec 100644 --- a/src/app/services/chat/room.service.ts +++ b/src/app/services/chat/room.service.ts @@ -23,6 +23,7 @@ import { AttachmentsService } from 'src/app/services/attachments.service'; import { ConnectionStatus, NetworkServiceService} from 'src/app/services/network-service.service'; import { ChatSystemService } from './chat-system.service'; import { ViewedMessageService } from './viewed-message.service' +import * as FIFOProcessQueue from 'fifo-process-queue'; @Injectable({ providedIn: 'root' @@ -47,9 +48,9 @@ export class RoomService { message = '' lastMessageTxt = '' userThatIsTyping = '' - messagesLocalReference = [] - members = [] - membersExcludeMe = [] + messagesLocalReference: string[] = [] + members: chatUser[] = [] + membersExcludeMe: chatUser[] = [] u sessionStore = SessionStore countDownTime = '' @@ -186,9 +187,13 @@ export class RoomService { if(!this.isGroup) { for(let user of this.ChatSystemService.users) { - if(this.membersExcludeMe[0]._id == user._id) { - return user.status + + for (const members of this.membersExcludeMe) { + if(members._id == user._id) { + return user.status + } } + } } @@ -260,71 +265,7 @@ export class RoomService { "stream-room-messages", async (IncomingChatMessage:IncomingChatMessage) => { - let IncomingChatMessageArgs = IncomingChatMessage.fields.args[0] - let ChatMessage : ChatMessageInterface = this.fix_updatedAt(IncomingChatMessageArgs) - - const allMessageIds = this.messages.map((e)=> e._id); - - if(!this.messagesLocalReference.includes(ChatMessage.localReference) && !allMessageIds.includes(ChatMessage?._id)) { - - this.messagesLocalReference.push(ChatMessage.localReference); - - const message = await this.prepareCreate({message: ChatMessage, save: true}); - message.messageSend = true - message.from = 'stream' - message.loadHistory = this.hasLoadHistory - - this.lastMessage = message; - this.calDateDuration(ChatMessage._updatedAt); - - if (message.t == 'r') { - this.name = message.msg; - } - - if(this.isSenderIsNotMe(ChatMessage)) { - this.NativeNotificationService.sendNotificationChat({ - message: message.msg, - title: this.name - }); - } - - if(this.hasLoadHistory == true) { - await message.addMessageDB() - } - - if(this.chatOpen == false) { - this.messageUnread = true - } - - setTimeout(()=>{ - this.scrollDown() - }, 50) - } else { - - this.messages.forEach((message, index)=> { - if(message.localReference == ChatMessage.localReference) { - - const membersIds = this.membersExcludeMe.map((user)=> user._id) - - this.getAllUsers().forEach( async (users) => { - - if(membersIds.includes(users._id)) { - - if(users.status != 'offline') { - - this.messages[index].received.push(users._id) - - setTimeout(() => { - message.save() - }, 150) - - } - } - }); - } - }) - - } + this.appendReceiveMessage.push(IncomingChatMessage) } ) @@ -334,9 +275,7 @@ export class RoomService { if(message.fields.eventName == this.id+'/'+'typing') { const args = message.fields.args - - - + if (typeof args[1] != 'object') { this.userThatIsTyping = this.usernameToDisplayName(args[0]) @@ -350,7 +289,6 @@ export class RoomService { this.readAllMessage() } else if(args[0]?.method == 'deleteMessage' || args[1]?.method == 'deleteMessage') { - this.deleteMessage(args[1]?.method?._id) } else { @@ -363,6 +301,68 @@ export class RoomService { }) } + appendReceiveMessage = FIFOProcessQueue(async (IncomingChatMessage:IncomingChatMessage, done) => { + + let IncomingChatMessageArgs = IncomingChatMessage.fields.args[0] + let ChatMessage : ChatMessageInterface = this.fix_updatedAt(IncomingChatMessageArgs) + + + let found = this.findMessageBy_id(ChatMessage._id) || + this.findMessageBy_localReference(ChatMessage?.localReference) + // || await this.findMessageInDBByData({_id:ChatMessage._id, localReference:ChatMessage.localReference }) + + if(!found) { + + const message = await this.prepareCreate({message: ChatMessage, save: true}); + this.registerSendMessage(message) + + message.from = 'stream' + message.loadHistory = this.hasLoadHistory + + this.lastMessage = message; + this.calDateDuration(ChatMessage._updatedAt); + + if (message.t == 'r') { + this.name = message.msg; + } + + if(this.isSenderIsNotMe(ChatMessage)) { + this.NativeNotificationService.sendNotificationChat({ + message: message.msg, + title: this.name + }); + } + + if(this.hasLoadHistory == true) { + await message.addMessageDB() + } + + if(this.chatOpen == false) { + this.messageUnread = true + } + + setTimeout(()=>{ + this.scrollDown() + }, 50) + + } + + setTimeout(() => { + done() + }, 5) + }) + + getUsersByStatus(status: 'offline' | 'online') { + + return this.getAllUsers().filter((user => { + for(const member of this.membersExcludeMe) { + if(user._id == member._id && user.status == status) { + return true + } + } + })) + + } getRoomMembersIds(): string[] { try { @@ -528,7 +528,7 @@ export class RoomService { this.RochetChatConnectorService.deleteMessage(msgId).then(async() => { message.delateRequest = true - await message.save(); + await message.saveChanges(); this.deleteMessage(msgId); }) @@ -564,8 +564,8 @@ export class RoomService { this.message= '' - this.messagesLocalReference.push(localReference) const message: MessageService = await this.prepareCreate({message:offlineChatMessage, save: environment.chatOffline}) + this.registerSendMessage(message) if(this.hasLoadHistory == true) { await message.addMessageDB() @@ -574,7 +574,6 @@ export class RoomService { message.send() message.from = 'send' message.loadHistory = this.hasLoadHistory - if (environment.chatOffline) { @@ -589,6 +588,24 @@ export class RoomService { } + /** + * Register all send message so that + * the incoming message wont be confuse to + * other user the localReference is the identifier + */ + registerSendMessage(message: MessageService) { + this.messagesLocalReference.push(message.localReference) + } + + + localReferenceExist(message: MessageService) { + for( const localReference of this.messagesLocalReference) { + if(localReference == message?.localReference) { + return true + } + } + return false + } sendTyping(text:string = this.message) { @@ -660,8 +677,11 @@ export class RoomService { return JSON.parse(str); } + + restoreOnce = false async restoreMessageFromDB() { - if(environment.chatOffline) { + if(environment.chatOffline && this.restoreOnce == false) { + this.restoreOnce = true const messages = await MessageModel.filter({rid:this.id}).execute() @@ -669,31 +689,24 @@ export class RoomService { const wewMessage = await this.simplePrepareMessage(ChatMessage) wewMessage.from = 'Offline' wewMessage.loadHistory = this.hasLoadHistory - if(wewMessage.offline == false) { - const message = await this.prepareMessageCreateIfNotExist_iD({message:ChatMessage}) - if(message) { - message.from = 'Offline' - message.loadHistory = this.hasLoadHistory - message?.decryptMessage() - } + const message = await this.prepareCreate({message:ChatMessage}) + message.from = 'Offline' + message.loadHistory = this.hasLoadHistory + message?.decryptMessage() } else { + + const offlineMessage = await this.prepareCreate({message:ChatMessage}) - const offlineMessage = await this.prepareMessageCreateIfNotExist({message:ChatMessage}) - - if(offlineMessage) { - offlineMessage.from = 'Offline' - offlineMessage.loadHistory = this.hasLoadHistory - - this.messagesLocalReference.push(offlineMessage.localReference) - - offlineMessage?.decryptMessage() - offlineMessage.send() - - } + offlineMessage.from = 'Offline' + offlineMessage.loadHistory = this.hasLoadHistory + this.registerSendMessage(offlineMessage) + offlineMessage?.decryptMessage() + offlineMessage.send() + // console.log('send offline', ChatMessage) } @@ -710,6 +723,7 @@ export class RoomService { } // runs onces only + async loadHistory({limit = 1000, forceUpdate = false }) { if(forceUpdate == false) { @@ -718,23 +732,27 @@ export class RoomService { } } - if(this.restoreFromOffline == false) { - this.restoreFromOffline = true - await this.restoreMessageFromDB() - } - - const chatHistory: chatHistory = await this.RochetChatConnectorService.loadHistory(this.id, limit) if(chatHistory?.result?.messages) { const messagesId = this.messages.map((message)=> message._id) + const users = this.getUsersByStatus('online') + for(let message of chatHistory.result.messages.reverse()) { if (!messagesId.includes(message._id)) { - const messagesToSave = await this.prepareMessageCreateIfNotExist_iD({message: message}); - if(messagesToSave) { + const messagesToSave = await this.prepareMessageCreateIfNotExist({message: message}); + if(messagesToSave != null) { + + messagesToSave.received = users.map((user) => user._id) messagesToSave.addMessageDB() + + // console.log('add history', message) + } else { + // console.log('exit') } + } else { + // console.log('exit') } } @@ -744,28 +762,6 @@ export class RoomService { }, 50) this.hasLoadHistory = true - this.messageReorder(); - } - - } - - async messageReorder() { - const reorderMessage: MessageService[] = this.messages.filter((message) => - message.from == 'send' && !message.loadHistory || message.from == 'stream' && !message.loadHistory - ); - - - let i = 0 - for(let message of this.messages) { - if(message.from == 'send' && !message.loadHistory || message.from == 'stream' && !message.loadHistory) { - this.messages.splice(i, 1) - } - i++; - } - - for(let message of reorderMessage) { - this.messages.push(message) - message.addMessageDB() } } @@ -774,60 +770,11 @@ export class RoomService { async readAllMessage() { - - const membersIds = this.membersExcludeMe.map((user)=> user._id) - - - await this.messages.forEach( async (message, index) => { - if(message._id) { - if(message.viewed.length == 0) { - this.messages[index].viewed = membersIds; - this.messages[index].received = membersIds; - - await this.messages[index].save() - } - } - }) + this.ViewedMessageService.requestReadAll(this) } - /** - * @description find or create message - * @param message - * @param save - * @returns - */ - async prepareMessage({message, save = true, redefined = false}): Promise { - message = this.fix_updatedAt(message) - - const wewMessage = new MessageService(this.NfService, this.RochetChatConnectorService, this.ChatMethodsService, this.AESEncrypt, this.AttachmentsService, this.NetworkServiceService, this.ChatSystemService) - wewMessage.setData(message) - wewMessage.loadHistory = this.hasLoadHistory - - let foundIndex; - - const found = this.messages.find((MessageService, index) => { - if (MessageService._id == message._id) { - foundIndex = index - return true - } else { - return false - } - }) - - if(save) { - if (!found) { - this.messages.push(wewMessage) - return wewMessage - } - } else if(foundIndex) { - return this.messages[foundIndex] - } else { - return wewMessage - } - - } async ChatMessageIsPresentInTheView(ChatMessage:ChatMessageInterface) { let foundIndex; @@ -849,48 +796,18 @@ export class RoomService { } - /** - * @description find or create message - * @param message - * @param save - * @returns - */ - async prepareCreate({message, save = true}): Promise { + + + async prepareCreate({message, save = true}): Promise { message = this.fix_updatedAt(message) const wewMessage = new MessageService(this.NfService, this.RochetChatConnectorService, this.ChatMethodsService, this.AESEncrypt, this.AttachmentsService, this.NetworkServiceService, this.ChatSystemService) wewMessage.setData(message) wewMessage.loadHistory = this.hasLoadHistory - - - let found; - - if(wewMessage.localReference != null) { - found = this.messages.find((MessageService, index) => { - if ( MessageService.localReference == wewMessage.localReference ) { - return true - } else { - return false - } - }) - } else { - found = this.messages.find((MessageService, index) => { - if ( MessageService._id == wewMessage._id) { - return true - } else { - return false - } - }) - } - - if (!found) { - this.messages.push(wewMessage) - return wewMessage - } + this.messages.push(wewMessage) return wewMessage - } @@ -903,40 +820,62 @@ export class RoomService { return wewMessage } + + private findMessageBy_id (id) { + for( let m of this.messages) { + if(m._id == id) { + return true + } + } + + return false + } + + private findMessageBy_localReference (localReference) { + for( let m of this.messages) { + if(m.localReference == localReference) { + return true + } + } + + return false + } + + private async findMessageInDBByLocalReference({localReference}) { + const a = await MessageModel.get({localReference: localReference}) + + return typeof a.id == 'number' + } + + private async findMessageInDBByLocalId({_id}) { + const a = await MessageModel.get({_id: _id}) + return typeof a.id == 'number' + } + + private async findMessageInDBByData({localReference, _id}) { + + // console.log('look') + const a = await MessageModel.filter({localReference: localReference}) + if(a.length >= 1) { + // console.log('localReference', localReference) + return true + } + + const c = await MessageModel.filter({_id: _id}) + if(c.length >= 1) { + // console.log('_id', _id) + return true + } + + // console.log('look not found') + return false + } + async prepareMessageCreateIfNotExist({message}) { message = this.fix_updatedAt(message) - let foundIndex; - const found = this.messages.find((MessageService, index) => { - if (MessageService._id == message._id || - MessageService.localReference == message.localReference ) { - foundIndex = index - return true - } else { - return false - } - }) - - if (!found) { - const wewMessage = this.simplePrepareMessage(message) - this.messages.push(wewMessage) - return wewMessage - } else { - return null - } - } - - - async prepareMessageCreateIfNotExist_iD({message}) { - message = this.fix_updatedAt(message) - - const found = this.messages.find((MessageService, index) => { - if (MessageService._id == message._id) { - return true - } else { - return false - } - }) + let found = await this.findMessageBy_id(message._id) || this.findMessageBy_localReference(message.localReference) + // || await this.findMessageInDBByData({_id:message._id, localReference:message.localReference }) if (!found) { const wewMessage = this.simplePrepareMessage(message) diff --git a/src/app/services/chat/viewed-message.service.ts b/src/app/services/chat/viewed-message.service.ts index bbc5e1582..779087eb5 100644 --- a/src/app/services/chat/viewed-message.service.ts +++ b/src/app/services/chat/viewed-message.service.ts @@ -7,7 +7,8 @@ import { RoomService } from './room.service'; }) export class ViewedMessageService { - constructor() { } + constructor() { + } viewQueue = FIFOProcessQueue(async ({room, userId, statusNum, statusText}, callback) => { @@ -20,25 +21,15 @@ export class ViewedMessageService { room.deleteMessageToReceive(userId) } - await room.messages.forEach(async (message, index) => { - if(!message.messageOwnerById(userId)) { - - if(!room.messages[index]?.received?.includes(userId)) { - - if(room.messages[index]._id) { - try { - if(!room.messages[index].received.includes(userId)) { - room.messages[index].received.push(userId) - } - } catch(e) { - room.messages[index].received = [userId] - } - room.messages[index].save() + for (const message of room.messages) { + if(message.online) { + for(let id of membersIds) { + if(message.addReceived(id)) { + await message.saveChanges() } - } } - }) + } setTimeout(function () { callback(); @@ -47,8 +38,35 @@ export class ViewedMessageService { } }) + + + viewReadQueue = FIFOProcessQueue(async ({room}, callback) => { + + const membersIds: string[] = room.membersExcludeMe.map((user)=> user._id) + + for (const message of room.messages) { + if(message.online) { + for(let id of membersIds) { + + if(message.addViewed(id)) { + message.addReceived(id) + await message.saveChanges() + } + } + } + } + + setTimeout(() => { + callback() + },100) + + }) request(room:RoomService, userId, statusNum, statusText) { this.viewQueue.push({room, userId, statusNum, statusText}) } + + requestReadAll(room:RoomService) { + this.viewReadQueue.push({room}) + } } diff --git a/src/app/services/inativity.service.ts b/src/app/services/inativity.service.ts index b916e493d..b118ce180 100644 --- a/src/app/services/inativity.service.ts +++ b/src/app/services/inativity.service.ts @@ -11,28 +11,28 @@ export class InativityService { private router: Router, ) { - // var time; - // window.onload = resetTimer; - // window.onmousemove = resetTimer; - // window.onmousedown = resetTimer; // catches touchscreen presses as well - // window.ontouchstart = resetTimer; // catches touchscreen swipes as well - // window.onclick = resetTimer; // catches touchpad clicks as well - // window.onkeydown = resetTimer; - // window.addEventListener('scroll', resetTimer, true); // improved; see comments + var time; + window.onload = resetTimer; + window.onmousemove = resetTimer; + window.onmousedown = resetTimer; // catches touchscreen presses as well + window.ontouchstart = resetTimer; // catches touchscreen swipes as well + window.onclick = resetTimer; // catches touchpad clicks as well + window.onkeydown = resetTimer; + window.addEventListener('scroll', resetTimer, true); // improved; see comments - // function userIsNotActive() { - // // your function for too long inactivity goes here - // // SessionStore.setInativity(false) - // // alert('go out') - // try { - // // window['inactivity/function']() - // } catch (error) {} + function userIsNotActive() { + // your function for too long inactivity goes here + SessionStore.setInativity(false) + // alert('go out') + try { + window['inactivity/function']() + } catch (error) {} - // } + } - // function resetTimer() { - // clearTimeout(time); - // time = setTimeout(userIsNotActive, 60000 * 1); // time is in milliseconds - // } + function resetTimer() { + clearTimeout(time); + time = setTimeout(userIsNotActive, 60000 * 5); // time is in milliseconds + } } } diff --git a/src/app/shared/chat/group-messages/group-messages.page.html b/src/app/shared/chat/group-messages/group-messages.page.html index 6c21a23f3..f41950b82 100644 --- a/src/app/shared/chat/group-messages/group-messages.page.html +++ b/src/app/shared/chat/group-messages/group-messages.page.html @@ -60,7 +60,7 @@ - +
Tentar
@@ -106,7 +106,7 @@ - +
Tentar
@@ -161,7 +161,7 @@ - +
Tentar
diff --git a/src/app/shared/chat/messages/messages.page.html b/src/app/shared/chat/messages/messages.page.html index 07894481c..584c6c4e3 100644 --- a/src/app/shared/chat/messages/messages.page.html +++ b/src/app/shared/chat/messages/messages.page.html @@ -49,7 +49,7 @@
- {{msg.u.name}} + {{msg.u.name}} {{msg.duration}}
@@ -59,9 +59,10 @@ - + + - +
Tentar
@@ -81,7 +82,7 @@
- {{msg.u.name}} + {{msg.u.name}} {{msg.duration}}
@@ -103,9 +104,9 @@
image - + {{ msg.viewed }} - +
Tentar
@@ -169,9 +170,9 @@
- + {{ msg.viewed }} - +
Tentar
@@ -189,7 +190,7 @@ Apagou a mensagem
- {{msg.u.name}} criou esta reunião
+ {{msg.u.name}} criou esta reunião

diff --git a/src/app/shared/chat/messages/messages.page.scss b/src/app/shared/chat/messages/messages.page.scss index 9349b4c69..388f21c6c 100644 --- a/src/app/shared/chat/messages/messages.page.scss +++ b/src/app/shared/chat/messages/messages.page.scss @@ -397,4 +397,11 @@ ion-footer { padding: 6px; border-radius: 10px; cursor: pointer; +} + +.red-top { + border-top: 1px solid red !important; +} +.red { + color: red !important; } \ No newline at end of file diff --git a/src/app/shared/chat/messages/messages.page.ts b/src/app/shared/chat/messages/messages.page.ts index ade54d692..f74cb4955 100644 --- a/src/app/shared/chat/messages/messages.page.ts +++ b/src/app/shared/chat/messages/messages.page.ts @@ -144,6 +144,9 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy this.deleteRecording() + + // this.ChatSystemService.getDmRoom(this.roomId).deleteAll() + } async ChatMessageDebuggingPage() { diff --git a/src/assets/icon/governoangola_A.png b/src/assets/icon/governoangola_A.png new file mode 100644 index 0000000000000000000000000000000000000000..9c360396a713863724ef0f14623c057b80888395 GIT binary patch literal 75852 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 - + diff --git a/version/git-version.ts b/version/git-version.ts index dd13a7a05..73dfd8450 100644 --- a/version/git-version.ts +++ b/version/git-version.ts @@ -1,12 +1,12 @@ export let versionData = { - "shortSHA": "572ab6db7", - "SHA": "572ab6db7b8cc05e5b32362f48dbad03cc948d52", + "shortSHA": "56c173394", + "SHA": "56c17339455d3377bd2bb274440cb502e780ff8d", "branch": "develop_bitOut-fix", "lastCommitAuthor": "'Peter Maquiran'", - "lastCommitTime": "'Thu Jan 5 12:11:50 2023 +0100'", - "lastCommitMessage": "save", - "lastCommitNumber": "4613", + "lastCommitTime": "'Thu Jan 5 12:18:21 2023 +0100'", + "lastCommitMessage": "merge", + "lastCommitNumber": "4617", "change": "", - "changeStatus": "On branch develop_bitOut-fix\nAll conflicts fixed but you are still merging.\n (use \"git commit\" to conclude merge)\n\nChanges to be committed:\n\tmodified: src/app/app.module.ts\n\tmodified: src/app/modals/profile/profile.page.html\n\tmodified: src/app/modals/profile/profile.page.ts\n\tmodified: src/app/pages/login/login.page.ts\n\tmodified: src/app/services/notifications.service.ts\n\tmodified: src/app/shared/header/header.page.ts\n\tmodified: src/environments/environment.ts\n\tmodified: src/main.ts", + "changeStatus": "On branch develop_bitOut-fix\nChanges to be committed:\n (use \"git restore --staged ...\" to unstage)\n\tmodified: src/app/home/home.page.ts\n\tmodified: src/app/modals/profile/profile.page.ts\n\tmodified: src/app/models/beast-orm.ts\n\tmodified: src/app/pages/chat/group-messages/group-messages.page.html\n\tmodified: src/app/pages/chat/messages/messages.page.html\n\tmodified: src/app/pages/gabinete-digital/gabinete-digital.page.ts\n\tmodified: src/app/services/auth.service.ts\n\tmodified: src/app/services/chat.service.ts\n\tmodified: src/app/services/chat/chat-system.service.ts\n\tmodified: src/app/services/chat/message.service.ts\n\tmodified: src/app/services/chat/room.service.ts\n\tmodified: src/app/services/chat/viewed-message.service.ts\n\tmodified: src/app/services/inativity.service.ts\n\tmodified: src/app/shared/chat/group-messages/group-messages.page.html\n\tmodified: src/app/shared/chat/messages/messages.page.html\n\tmodified: src/app/shared/chat/messages/messages.page.scss\n\tmodified: src/app/shared/chat/messages/messages.page.ts\n\tnew file: src/assets/icon/governoangola_A.png\n\tmodified: src/environments/environment.ts\n\tmodified: src/index.html\n\tmodified: version/git-version.ts", "changeAuthor": "peter.maquiran" } \ No newline at end of file