mirror of
https://code.equilibrium.co.ao/ITO/doneit-web.git
synced 2026-04-18 20:47:54 +00:00
1 line
81 KiB
JSON
1 line
81 KiB
JSON
{"ast":null,"code":"import _asyncToGenerator from \"C:/Users/eudes.inacio/GabineteDigital/gabinete-digital-fo/node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js\";\nimport { __decorate } from \"tslib\";\nimport { Injectable } from '@angular/core';\nimport { RochetChatConnectorService } from 'src/app/services/chat/rochet-chat-connector.service';\nimport { MessageService } from 'src/app/services/chat/message.service';\nimport { showDateDuration } from 'src/plugin/showDateDuration';\nimport { Storage } from '@ionic/storage';\nimport { Platform } from '@ionic/angular';\nimport { SqliteService } from 'src/app/services/sqlite.service';\nimport { NativeNotificationService } from 'src/app/services/native-notification.service';\nimport { SessionStore } from 'src/app/store/session.service';\nimport { capitalizeTxt } from 'src/plugin/text';\nimport { SortService } from '../functions/sort.service';\nimport { environment } from 'src/environments/environment';\nimport { ChatService } from 'src/app/services/chat.service';\nimport { NfService } from 'src/app/services/chat/nf.service';\nimport { v4 as uuidv4 } from 'uuid';\nimport { ChatMethodsService } from './chat-methods.service';\nimport { DeleteMessageModel, MessageModel } from '../../models/beast-orm';\nimport { AESEncrypt } from '../aesencrypt.service';\nimport { AttachmentsService } from 'src/app/services/attachments.service';\nimport { ConnectionStatus, NetworkServiceService } from 'src/app/services/network-service.service';\nimport { ChatSystemService } from './chat-system.service';\nimport { ViewedMessageService } from './viewed-message.service';\nimport * as FIFOProcessQueue from 'fifo-process-queue';\nimport { NotificationsService } from '../notifications.service';\nlet RoomService = class RoomService {\n constructor(RochetChatConnectorService, MessageService, storage, platform, sqlservice, NativeNotificationService, sortService, chatService, NfService, ChatMethodsService, AESEncrypt, AttachmentsService, NetworkServiceService, ChatSystemService, ViewedMessageService, notificationService) {\n var _this = this;\n this.RochetChatConnectorService = RochetChatConnectorService;\n this.MessageService = MessageService;\n this.storage = storage;\n this.platform = platform;\n this.sqlservice = sqlservice;\n this.NativeNotificationService = NativeNotificationService;\n this.sortService = sortService;\n this.chatService = chatService;\n this.NfService = NfService;\n this.ChatMethodsService = ChatMethodsService;\n this.AESEncrypt = AESEncrypt;\n this.AttachmentsService = AttachmentsService;\n this.NetworkServiceService = NetworkServiceService;\n this.ChatSystemService = ChatSystemService;\n this.ViewedMessageService = ViewedMessageService;\n this.notificationService = notificationService;\n this.messages = [];\n this.storageMessage = [];\n this.messagesBeforeOfflineAPI = [];\n this.id = '';\n this.t = '';\n this.name = '';\n this._updatedAt = {};\n this.hasLoadHistory = false;\n this.restoreFromOffline = false;\n this.duration = '';\n this.isTyping = false;\n this.otherUserType = false;\n this.lastTimeType = null;\n this.message = '';\n this.lastMessageTxt = '';\n this.userThatIsTyping = '';\n this.messagesLocalReference = [];\n this.members = [];\n this.membersExcludeMe = [];\n this.sessionStore = SessionStore;\n this.countDownTime = '';\n this.chatOpen = false;\n this.messageUnread = false;\n this.status = {\n receive: {\n message: false,\n typing: false,\n readMessage: false,\n deleteMessage: false\n }\n };\n this.subscribeAttempt = false;\n this.scrollDown = () => {};\n /**\r\n * @description get user list from ws-chat-methods.service\r\n * @returns chatUser[]\r\n */\n this.getAllUsers = () => {\n return [];\n };\n this.sortRoomList = () => {};\n this.chatServiceDeleteRoom = roomId => {};\n this.appendReceiveMessage = FIFOProcessQueue( /*#__PURE__*/function () {\n var _ref = _asyncToGenerator(function* (IncomingChatMessage, done) {\n let IncomingChatMessageArgs = IncomingChatMessage.fields.args[0];\n let ChatMessage = _this.fix_updatedAt(IncomingChatMessageArgs);\n let found = _this.findMessageBy_id(ChatMessage._id) || _this.findMessageBy_localReference(ChatMessage?.localReference);\n // || await this.findMessageInDBByData({_id:ChatMessage._id, localReference:ChatMessage.localReference })\n if (!found) {\n ChatMessage.origin = 'stream';\n const message = yield _this.prepareCreate({\n message: ChatMessage,\n save: false\n });\n _this.registerSendMessage(message);\n message.from = 'stream';\n message.loadHistory = _this.hasLoadHistory;\n _this.lastMessage = message;\n _this.calDateDuration(ChatMessage._updatedAt);\n if (message.t == 'r') {\n _this.name = message.msg;\n }\n if (_this.isSenderIsNotMe(ChatMessage)) {\n _this.NativeNotificationService.sendNotificationChat({\n message: message.msg,\n title: _this.name\n });\n }\n if (_this.hasLoadHistory == true) {\n _this.messages.push(message);\n yield message.addMessageDB();\n } else {\n _this.messagesBeforeOfflineAPI.push(message);\n }\n if (_this.chatOpen == false) {\n _this.messageUnread = true;\n }\n setTimeout(() => {\n _this.scrollDown();\n }, 50);\n }\n setTimeout(() => {\n done();\n }, 5);\n });\n return function (_x, _x2) {\n return _ref.apply(this, arguments);\n };\n }());\n this.restoreOnce = false;\n // runs onces only\n this.loadHistoryCount = 0;\n this.NativeNotificationService.askForPermission();\n this.RochetChatConnectorService.getUserStatus(d => {\n const userId = d.fields.args[0][0];\n const statusNum = d.fields.args[0][2];\n const statusText = this.statusNumberToText(statusNum);\n this.ViewedMessageService.request(this, userId, statusNum, statusText);\n });\n this.RochetChatConnectorService.registerCallback({\n type: 'Offline',\n funx: () => {\n /**\r\n * @description when the phone is in the background for a long time it could disconnects from the socket then the socket reconnects automatically,\r\n * when the connection is lost the subscribe is also lost, so we have to subscribe again when reconnection is establish.\r\n */\n this.resetStatus();\n this.hasLoadHistory = false;\n this.subscribeAttempt = false;\n }\n });\n }\n /**\r\n * @description convert rocketchat statues num to readable string\r\n * @param text\r\n * @returns\r\n */\n statusNumberToText(text) {\n if (text == '0') {\n return \"offline\";\n } else if (text == '1') {\n return \"online\";\n } else if (text == '2') {\n return \"away\";\n } else if (text == '3') {\n return \"busy\";\n }\n }\n resetStatus() {\n this.status = {\n receive: {\n message: false,\n typing: false,\n readMessage: false,\n deleteMessage: false\n }\n };\n }\n setData({\n membersExcludeMe,\n members,\n u,\n customFields = {},\n id,\n name,\n t,\n lastMessage = new MessageService(this.NfService, this.RochetChatConnectorService, this.ChatMethodsService, this.AESEncrypt, this.AttachmentsService, this.NetworkServiceService, this.ChatSystemService, this.notificationService),\n _updatedAt\n }) {\n this.customFields = customFields;\n this.id = id;\n this.name = name;\n this.t = t;\n this.lastMessage = lastMessage;\n this._updatedAt = _updatedAt;\n this.u = u;\n this.members = members;\n this.membersExcludeMe = membersExcludeMe;\n this.calDateDuration();\n if (this.customFields?.countDownDate) {\n this.countDownDate(this.customFields.countDownDate);\n }\n }\n updateInfo() {\n // this.chatService.getRoomInfo(this.id).toPromise();\n }\n get online() {\n if (!this.isGroup) {\n for (let user of this.ChatSystemService.users) {\n for (const members of this.membersExcludeMe) {\n if (members._id == user._id) {\n return user.status;\n }\n }\n }\n }\n return 'offline';\n }\n countDownDate(date) {\n let difference = new Date(date).getTime() - new Date().getTime();\n let c_day = Math.floor(difference / (1000 * 60 * 60 * 24));\n let c_hours = Math.floor(difference % (1000 * 60 * 60 * 24) / (1000 * 60 * 60));\n let c_minutes = Math.floor(difference % (1000 * 60 * 60) / (1000 * 60));\n let c_seconds = Math.floor(difference % (1000 * 60) / 1000);\n this.countDownTime = this.addZero(c_day) + \" : \" + this.addZero(c_hours) + \" : \" + this.addZero(c_minutes) + \" : \" + this.addZero(c_seconds);\n if (difference < 0) {\n this.deleteRoom();\n } else {\n setTimeout(() => {\n this.countDownDate(date);\n }, 1000);\n }\n }\n addZero(i) {\n if (i < 10) {\n i = \"0\" + i;\n }\n return i;\n }\n deleteRoom() {\n this.countDownTime = \"Expired\";\n let body = {\n \"roomId\": this.id\n };\n // this.chatService.getRoomInfo(this.id).subscribe( room =>{});\n if (this.t === 'p') {\n this.chatService.deleteGroup(body).subscribe(res => {\n this.ChatSystemService.deleteRoom(this.id);\n this.ChatSystemService.getAllRooms();\n this.chatServiceDeleteRoom(this.id);\n });\n } else {\n this.chatService.deleteChannel(body).subscribe(res => {\n this.ChatSystemService.deleteRoom(this.id);\n this.ChatSystemService.getAllRooms();\n this.chatServiceDeleteRoom(this.id);\n });\n }\n }\n isSenderIsNotMe(ChatMessage) {\n return SessionStore.user.UserName != ChatMessage.u.username;\n }\n senderId(ChatMessage) {\n return ChatMessage.u._id;\n }\n receiveMessage() {\n var _this2 = this;\n this.RochetChatConnectorService.updateRoomEventss(this.id, \"stream-room-messages\", /*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(function* (IncomingChatMessage) {\n _this2.appendReceiveMessage.push(IncomingChatMessage);\n });\n return function (_x3) {\n return _ref2.apply(this, arguments);\n };\n }());\n this.RochetChatConnectorService.receiveStreamNotifyRoom(message => {\n if (message.fields.eventName == this.id + '/' + 'typing') {\n const args = message.fields.args;\n if (typeof args[1] != 'object') {\n this.userThatIsTyping = this.usernameToDisplayName(args[0]);\n this.isTyping = args[1];\n this.otherUserType = args[1];\n const user = args[0];\n if (SessionStore.user.UserName != user) {\n this.readAllMessage();\n }\n } else if (args[0]?.method == 'viewMessage' || args[1]?.method == 'viewMessage') {\n const user = args[0];\n if (SessionStore.user.UserName != user) {\n this.readAllMessage();\n }\n } else if (args[0]?.method == 'deleteMessage' || args[1]?.method == 'deleteMessage') {\n this.deleteMessage(args[1]?.method?._id);\n } else {}\n } else if (message.fields.eventName == this.id + '/' + 'deleteMessage') {}\n });\n }\n getUsersByStatus(status) {\n return this.getAllUsers().filter(user => {\n for (const member of this.membersExcludeMe) {\n if (user._id == member._id && user.status == status) {\n return true;\n }\n }\n });\n }\n getRoomMembersIds() {\n try {\n return this.membersExcludeMe.map(user => user._id);\n } catch (error) {\n return [];\n }\n }\n getAllMemberThatIsNotOffline() {\n const membersIds = this.getRoomMembersIds();\n const allChatUsers = this.getAllUsers();\n const AllMemberThatIsNotOffline = [];\n for (let user of allChatUsers) {\n if (membersIds.includes(user._id)) {\n if (user.status != 'offline') {\n AllMemberThatIsNotOffline.push(user._id);\n }\n }\n }\n return AllMemberThatIsNotOffline;\n }\n getAllMemberThatIsOffline() {\n const membersIds = this.getRoomMembersIds();\n const allChatUsers = this.getAllUsers();\n const AllMemberThatIsNotOffline = [];\n for (let user of allChatUsers) {\n if (membersIds.includes(user._id)) {\n if (user.status == 'offline') {\n AllMemberThatIsNotOffline.push(user._id);\n }\n }\n }\n return AllMemberThatIsNotOffline;\n }\n deleteMessageToReceive(userId) {\n var _this3 = this;\n return _asyncToGenerator(function* () {\n const allDeleteMessages = yield DeleteMessageModel.filter({\n rid: _this3.id\n }).execute();\n for (let message_ of allDeleteMessages) {\n if (message_.needToReceiveBy.includes(userId)) {\n message_.needToReceiveBy = message_.needToReceiveBy.filter(e => e != userId);\n _this3.sendFalseTypingReadMessage('deleteMessage', {\n _id: message_.messageId\n });\n if (message_.needToReceiveBy.length == 0) {\n const deleteMessage = yield DeleteMessageModel.get({\n messageId: message_.messageId\n });\n yield deleteMessage.delete();\n } else {\n yield DeleteMessageModel.update(message_);\n }\n }\n }\n })();\n }\n receiveMessageDelete() {\n var _this4 = this;\n return _asyncToGenerator(function* () {\n _this4.RochetChatConnectorService.updateRoomEventss(_this4.id, \"stream-notify-room\", /*#__PURE__*/function () {\n var _ref3 = _asyncToGenerator(function* (ChatMessage) {\n const DeletedMessageId = ChatMessage.fields.args[0]._id;\n const message = _this4.messages.find(e => e._id == DeletedMessageId);\n if (message.delate == false) {\n _this4.deleteMessage(DeletedMessageId);\n }\n });\n return function (_x4) {\n return _ref3.apply(this, arguments);\n };\n }());\n })();\n }\n /**\r\n * @description delete message in the view\r\n * @param id message ID\r\n */\n deleteMessage(_id) {\n var _this5 = this;\n return _asyncToGenerator(function* () {\n const id = _id;\n for (let i = 0; i <= _this5.messages.length; i++) {\n if (_this5.messages[i]?._id == id) {\n if (SessionStore.user.UserName == _this5.messages[i]?.u?.username) {\n const allMemberThatIsOffline = _this5.getAllMemberThatIsOffline();\n DeleteMessageModel.create({\n messageId: _this5.messages[i]._id,\n rid: _this5.messages[i].rid,\n ts: _this5.messages[i].ts,\n u: _this5.messages[i].u,\n needToReceiveBy: allMemberThatIsOffline\n });\n }\n _this5.messages[i]?.delateDB();\n _this5.messages.splice(i, 1);\n //Get previous last message from room\n const previousLastMessage = _this5.messages.slice(-1)[0];\n if (previousLastMessage) {\n _this5.lastMessage = previousLastMessage;\n _this5.calDateDuration(previousLastMessage._updatedAt);\n _this5.sortRoomList();\n }\n return true;\n } else {\n // \n }\n }\n })();\n }\n deleteAll() {\n this.messages.forEach(message => {\n if (message?._id) {\n this.sendDeleteRequest(message._id);\n }\n });\n }\n delateMessageToSendToOthers(userId) {\n return _asyncToGenerator(function* () {\n const deleteMessage = yield DeleteMessageModel.all();\n const toSend = deleteMessage.filter(DeleteMessage => !DeleteMessage.includes(userId));\n })();\n }\n sendDeleteRequest(msgId) {\n var _this6 = this;\n return _asyncToGenerator(function* () {\n const message = _this6.messages.find(e => e._id == msgId);\n yield message.delateStatusFalse();\n if (_this6.NetworkServiceService.getCurrentNetworkStatus() == ConnectionStatus.Online) {\n _this6.RochetChatConnectorService.deleteMessage(msgId).then( /*#__PURE__*/_asyncToGenerator(function* () {\n message.delateRequest = true;\n yield message.saveChanges();\n _this6.deleteMessage(msgId);\n }));\n } else {\n _this6.RochetChatConnectorService.registerCallback({\n type: 'reConnect',\n funx: function () {\n var _ref5 = _asyncToGenerator(function* () {\n _this6.sendDeleteRequest(msgId);\n return true;\n });\n return function funx() {\n return _ref5.apply(this, arguments);\n };\n }()\n });\n }\n })();\n }\n /**\r\n * @description sen text message\r\n */\n send({\n file = null,\n attachments = null,\n temporaryData = {}\n }) {\n var _this7 = this;\n return _asyncToGenerator(function* () {\n const localReference = uuidv4();\n let offlineChatMessage = {\n rid: _this7.id,\n msg: _this7.message,\n attachments,\n file,\n temporaryData,\n localReference,\n origin: 'local'\n };\n _this7.message = '';\n const message = yield _this7.prepareCreate({\n message: offlineChatMessage,\n save: environment.chatOffline\n });\n _this7.registerSendMessage(message);\n if (_this7.hasLoadHistory == true) {\n yield message.addMessageDB();\n }\n message.send();\n message.from = 'send';\n message.loadHistory = _this7.hasLoadHistory;\n if (environment.chatOffline) {\n setTimeout(() => {\n _this7.scrollDown();\n }, 150);\n _this7.lastMessage = message;\n _this7.calDateDuration(message._updatedAt);\n _this7.sortRoomList();\n }\n })();\n }\n /**\r\n * Register all send message so that\r\n * the incoming message wont be confuse to\r\n * other user the localReference is the identifier\r\n */\n registerSendMessage(message) {\n this.messagesLocalReference.push(message.localReference);\n }\n localReferenceExist(message) {\n for (const localReference of this.messagesLocalReference) {\n if (localReference == message?.localReference) {\n return true;\n }\n }\n return false;\n }\n sendTyping(text = this.message) {\n if (this.lastMessageTxt == text) {\n return false;\n }\n this.lastTimeType = new Date().getTime();\n const lastIsTyping = this.isTyping;\n if (text.length >= 1) {\n this.isTyping = true;\n } else {\n this.isTyping = false;\n }\n if (lastIsTyping != this.isTyping) {\n this.RochetChatConnectorService.sendStreamNotifyRoom(this.id, SessionStore.user.UserName, 'typing', this.isTyping).catch(error => console.error(error));\n }\n this.lastMessageTxt = this.message;\n this.typingWatch();\n }\n sendFalseTypingReadMessage(method, param) {\n this.RochetChatConnectorService.sendStreamNotifyRoom(this.id, SessionStore.user.UserName, 'typing', {\n method: method,\n params: param\n }).catch(error => console.error(error));\n this.setTypingOff();\n }\n typingWatch() {\n setTimeout(() => {\n const now = new Date().getTime();\n if (now - this.lastTimeType >= 2888) {\n if (this.isTyping == true) {\n this.isTyping = false;\n this.RochetChatConnectorService.sendStreamNotifyRoom(this.id, SessionStore.user.UserName, 'typing', this.isTyping).catch(error => console.error(error));\n }\n }\n }, 3000);\n }\n setTypingOff() {\n this.sendTyping('');\n }\n roomLeave() {\n this.setTypingOff();\n this.chatOpen = false;\n }\n open() {\n // this.typing(this.message)\n this.chatOpen = true;\n this.messageUnread = false;\n this.sendReadMessage();\n }\n leave(rid) {\n this.RochetChatConnectorService.leaveRoom(this.id).catch(error => console.error(error));\n }\n isJson(str) {\n try {\n JSON.parse(str);\n } catch (e) {\n return \"\";\n }\n return JSON.parse(str);\n }\n restoreMessageFromDB() {\n var _this8 = this;\n return _asyncToGenerator(function* () {\n if (environment.chatOffline && _this8.restoreOnce == false) {\n _this8.restoreOnce = true;\n const messages = yield MessageModel.filter({\n rid: _this8.id\n }).execute();\n for (let ChatMessage of messages) {\n const wewMessage = yield _this8.simplePrepareMessage(ChatMessage);\n wewMessage.from = 'Offline';\n wewMessage.loadHistory = _this8.hasLoadHistory;\n if (wewMessage.offline == false) {\n const message = yield _this8.prepareCreate({\n message: ChatMessage\n });\n message.from = 'Offline';\n message.loadHistory = _this8.hasLoadHistory;\n message?.decryptMessage();\n } else {\n const offlineMessage = yield _this8.prepareCreate({\n message: ChatMessage\n });\n offlineMessage.from = 'Offline';\n offlineMessage.loadHistory = _this8.hasLoadHistory;\n _this8.registerSendMessage(offlineMessage);\n offlineMessage?.decryptMessage();\n offlineMessage.send();\n }\n if (wewMessage.delate && !wewMessage.offline && !wewMessage.delateRequest) {\n _this8.sendDeleteRequest(wewMessage._id);\n }\n }\n setTimeout(() => {\n _this8.scrollDown();\n }, 50);\n }\n })();\n }\n loadHistory({\n limit = 1000,\n forceUpdate = false\n }) {\n var _this9 = this;\n return _asyncToGenerator(function* () {\n if (forceUpdate == false) {\n if (_this9.hasLoadHistory) {\n return false;\n }\n }\n _this9.hasLoadHistory = true;\n yield _this9.restoreMessageFromDB();\n const chatHistory = yield _this9.RochetChatConnectorService.loadHistory(_this9.id, limit);\n if (chatHistory?.result?.messages) {\n const users = _this9.getUsersByStatus('online');\n for (let message of chatHistory.result.messages.reverse()) {\n message.origin = 'history';\n message.from = 'History';\n const messagesToSave = yield _this9.prepareMessageCreateIfNotExist({\n message: message\n });\n if (messagesToSave != null) {\n messagesToSave.received = users.map(user => user._id);\n messagesToSave.addMessageDB();\n }\n }\n for (const message of _this9.messagesBeforeOfflineAPI) {\n const messagesToSave = yield _this9.prepareMessageCreateIfNotExist({\n message: message\n });\n if (messagesToSave != null) {\n messagesToSave.received = users.map(user => user._id);\n messagesToSave.addMessageDB();\n }\n }\n _this9.messagesBeforeOfflineAPI = [];\n setTimeout(() => {\n _this9.scrollDown();\n }, 50);\n }\n })();\n }\n readAllMessage() {\n var _this10 = this;\n return _asyncToGenerator(function* () {\n _this10.ViewedMessageService.requestReadAll(_this10);\n })();\n }\n ChatMessageIsPresentInTheView(ChatMessage) {\n var _this11 = this;\n return _asyncToGenerator(function* () {\n let foundIndex;\n const found = _this11.messages.find((MessageService, index) => {\n if (MessageService._id == ChatMessage._id) {\n foundIndex = index;\n return true;\n } else {\n return false;\n }\n });\n if (foundIndex) {\n return {\n found,\n foundIndex\n };\n } else {\n return false;\n }\n })();\n }\n prepareCreate({\n message,\n save = true\n }) {\n var _this12 = this;\n return _asyncToGenerator(function* () {\n message = _this12.fix_updatedAt(message);\n const wewMessage = new MessageService(_this12.NfService, _this12.RochetChatConnectorService, _this12.ChatMethodsService, _this12.AESEncrypt, _this12.AttachmentsService, _this12.NetworkServiceService, _this12.ChatSystemService, _this12.notificationService);\n wewMessage.setData(message);\n wewMessage.loadHistory = _this12.hasLoadHistory;\n if (save) {\n _this12.messages.push(wewMessage);\n }\n return wewMessage;\n })();\n }\n simplePrepareMessage(message) {\n message = this.fix_updatedAt(message);\n const wewMessage = new MessageService(this.NfService, this.RochetChatConnectorService, this.ChatMethodsService, this.AESEncrypt, this.AttachmentsService, this.NetworkServiceService, this.ChatSystemService, this.notificationService);\n wewMessage.setData(message);\n wewMessage.loadHistory = this.hasLoadHistory;\n return wewMessage;\n }\n findMessageBy_id(id) {\n for (let m of this.messages) {\n if (m?._id == id) {\n return true;\n }\n }\n return false;\n }\n findMessageBy_localReference(localReference) {\n for (let m of this.messages) {\n if (m?.localReference == localReference) {\n return true;\n }\n }\n return false;\n }\n findMessageInDBByLocalReference({\n localReference\n }) {\n return _asyncToGenerator(function* () {\n const a = yield MessageModel.get({\n localReference: localReference\n });\n return typeof a.id == 'number';\n })();\n }\n findMessageInDBByLocalId({\n _id\n }) {\n return _asyncToGenerator(function* () {\n const a = yield MessageModel.get({\n _id: _id\n });\n return typeof a.id == 'number';\n })();\n }\n findMessageInDBByData({\n localReference,\n _id\n }) {\n return _asyncToGenerator(function* () {\n const a = yield MessageModel.filter({\n localReference: localReference\n });\n if (a.length >= 1) {\n return true;\n }\n const c = yield MessageModel.filter({\n _id: _id\n });\n if (c.length >= 1) {\n return true;\n }\n return false;\n })();\n }\n prepareMessageCreateIfNotExist({\n message\n }) {\n var _this13 = this;\n return _asyncToGenerator(function* () {\n message = _this13.fix_updatedAt(message);\n let found = (yield _this13.findMessageBy_id(message._id)) || (yield _this13.findMessageBy_localReference(message.localReference));\n // || await this.findMessageInDBByData({_id:message._id, localReference:message.localReference })\n if (!found) {\n const wewMessage = _this13.simplePrepareMessage(message);\n _this13.messages.push(wewMessage);\n return wewMessage;\n } else {\n return null;\n }\n })();\n }\n calDateDuration(date = null) {\n this.duration = showDateDuration(date || this._updatedAt);\n this._updatedAt = date || this._updatedAt;\n }\n fix_updatedAt(message) {\n if (message?.result) {\n message.result._updatedAt = message.result._updatedAt['$date'];\n } else if (message?._updatedAt) {\n if (message._updatedAt.hasOwnProperty('$date')) {\n message._updatedAt = message._updatedAt['$date'];\n }\n }\n return message;\n }\n usernameToDisplayName(username) {\n try {\n const firstName = capitalizeTxt(username.split('.')[0]);\n const lastName = capitalizeTxt(username.split('.')[1]);\n return firstName + ' ' + lastName;\n } catch (error) {\n return username;\n }\n }\n sendReadMessage() {\n this.RochetChatConnectorService.readMessage(this.id).catch(error => {\n console.error(error);\n });\n this.sendFalseTypingReadMessage('viewMessage', {});\n this.messageUnread = false;\n }\n};\nRoomService.ctorParameters = () => [{\n type: RochetChatConnectorService\n}, {\n type: MessageService\n}, {\n type: Storage\n}, {\n type: Platform\n}, {\n type: SqliteService\n}, {\n type: NativeNotificationService\n}, {\n type: SortService\n}, {\n type: ChatService\n}, {\n type: NfService\n}, {\n type: ChatMethodsService\n}, {\n type: AESEncrypt\n}, {\n type: AttachmentsService\n}, {\n type: NetworkServiceService\n}, {\n type: ChatSystemService\n}, {\n type: ViewedMessageService\n}, {\n type: NotificationsService\n}];\nRoomService = __decorate([Injectable({\n providedIn: 'root'\n})], RoomService);\nexport { RoomService };","map":{"version":3,"mappings":"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","names":["Injectable","RochetChatConnectorService","MessageService","showDateDuration","Storage","Platform","SqliteService","NativeNotificationService","SessionStore","capitalizeTxt","SortService","environment","ChatService","NfService","v4","uuidv4","ChatMethodsService","DeleteMessageModel","MessageModel","AESEncrypt","AttachmentsService","ConnectionStatus","NetworkServiceService","ChatSystemService","ViewedMessageService","FIFOProcessQueue","NotificationsService","RoomService","constructor","storage","platform","sqlservice","sortService","chatService","notificationService","receive","message","typing","readMessage","deleteMessage","roomId","IncomingChatMessage","done","IncomingChatMessageArgs","fields","args","ChatMessage","_this","fix_updatedAt","found","findMessageBy_id","_id","findMessageBy_localReference","localReference","origin","prepareCreate","save","registerSendMessage","from","loadHistory","hasLoadHistory","lastMessage","calDateDuration","_updatedAt","t","name","msg","isSenderIsNotMe","sendNotificationChat","title","messages","push","addMessageDB","messagesBeforeOfflineAPI","chatOpen","messageUnread","setTimeout","scrollDown","askForPermission","getUserStatus","d","userId","statusNum","statusText","statusNumberToText","request","registerCallback","type","funx","resetStatus","subscribeAttempt","text","status","setData","membersExcludeMe","members","u","customFields","id","countDownDate","updateInfo","online","isGroup","user","users","date","difference","Date","getTime","c_day","Math","floor","c_hours","c_minutes","c_seconds","countDownTime","addZero","deleteRoom","i","body","deleteGroup","subscribe","res","getAllRooms","chatServiceDeleteRoom","deleteChannel","UserName","username","senderId","receiveMessage","updateRoomEventss","_this2","appendReceiveMessage","receiveStreamNotifyRoom","eventName","userThatIsTyping","usernameToDisplayName","isTyping","otherUserType","readAllMessage","method","getUsersByStatus","getAllUsers","filter","member","getRoomMembersIds","map","error","getAllMemberThatIsNotOffline","membersIds","allChatUsers","AllMemberThatIsNotOffline","includes","getAllMemberThatIsOffline","deleteMessageToReceive","allDeleteMessages","rid","_this3","execute","message_","needToReceiveBy","e","sendFalseTypingReadMessage","messageId","length","get","delete","update","receiveMessageDelete","_this4","DeletedMessageId","find","delate","_this5","allMemberThatIsOffline","create","ts","delateDB","splice","previousLastMessage","slice","sortRoomList","deleteAll","forEach","sendDeleteRequest","delateMessageToSendToOthers","all","toSend","DeleteMessage","msgId","_this6","delateStatusFalse","getCurrentNetworkStatus","Online","then","delateRequest","saveChanges","send","file","attachments","temporaryData","offlineChatMessage","_this7","chatOffline","messagesLocalReference","localReferenceExist","sendTyping","lastMessageTxt","lastTimeType","lastIsTyping","sendStreamNotifyRoom","catch","console","typingWatch","param","params","setTypingOff","now","roomLeave","open","sendReadMessage","leave","leaveRoom","isJson","str","JSON","parse","restoreMessageFromDB","_this8","restoreOnce","wewMessage","simplePrepareMessage","offline","decryptMessage","offlineMessage","limit","forceUpdate","_this9","chatHistory","result","reverse","messagesToSave","prepareMessageCreateIfNotExist","received","_this10","requestReadAll","ChatMessageIsPresentInTheView","foundIndex","_this11","index","_this12","m","findMessageInDBByLocalReference","a","findMessageInDBByLocalId","findMessageInDBByData","c","_this13","duration","hasOwnProperty","firstName","split","lastName","providedIn"],"sourceRoot":"","sources":["C:\\Users\\eudes.inacio\\GabineteDigital\\gabinete-digital-fo\\src\\app\\services\\chat\\room.service.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\nimport { RochetChatConnectorService } from 'src/app/services/chat/rochet-chat-connector.service';\r\nimport { MessageService } from 'src/app/services/chat/message.service';\r\nimport { showDateDuration } from 'src/plugin/showDateDuration';\r\nimport { chatHistory } from 'src/app/models/chatMethod';\r\nimport { Storage } from '@ionic/storage';\r\nimport { Platform } from '@ionic/angular';\r\nimport { SqliteService } from 'src/app/services/sqlite.service';\r\nimport { NativeNotificationService } from 'src/app/services/native-notification.service';\r\nimport { SessionStore } from 'src/app/store/session.service';\r\nimport { capitalizeTxt } from 'src/plugin/text'\r\nimport { SortService } from '../functions/sort.service';\r\nimport { chatUser } from 'src/app/models/chatMethod';\r\nimport { environment } from 'src/environments/environment';\r\nimport { ChatService } from 'src/app/services/chat.service';\r\nimport { NfService } from 'src/app/services/chat/nf.service';\r\nimport { v4 as uuidv4 } from 'uuid'\r\nimport { ChatMethodsService } from './chat-methods.service';\r\nimport { DeleteMessageModel, MessageModel } from '../../models/beast-orm';\r\nimport { AESEncrypt } from '../aesencrypt.service';\r\nimport { IncomingChatMessage, ChatMessageInterface, falseTypingMethod } from 'src/app/models/message.model';\r\nimport { AttachmentsService } from 'src/app/services/attachments.service';\r\nimport { ConnectionStatus, NetworkServiceService} from 'src/app/services/network-service.service';\r\nimport { ChatSystemService } from './chat-system.service';\r\nimport { ViewedMessageService } from './viewed-message.service'\r\nimport * as FIFOProcessQueue from 'fifo-process-queue';\r\nimport { NotificationsService } from '../notifications.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class RoomService {\r\n\r\n messages: MessageService[] = []\r\n storageMessage: any[] = [];\r\n lastMessage: MessageService;\r\n messagesBeforeOfflineAPI: MessageService[] = []\r\n\r\n customFields: any;\r\n id = ''\r\n t = ''\r\n name = ''\r\n _updatedAt = {}\r\n hasLoadHistory = false\r\n restoreFromOffline = false\r\n duration = ''\r\n isTyping = false\r\n otherUserType = false\r\n lastTimeType = null\r\n message = ''\r\n lastMessageTxt = ''\r\n userThatIsTyping = ''\r\n messagesLocalReference: string[] = []\r\n members: chatUser[] = []\r\n membersExcludeMe: chatUser[] = []\r\n u\r\n sessionStore = SessionStore\r\n countDownTime = ''\r\n chatOpen = false\r\n messageUnread = false\r\n\r\n status = {\r\n receive: {\r\n message: false,\r\n typing: false,\r\n readMessage: false,\r\n deleteMessage: false\r\n }\r\n }\r\n\r\n isGroup: boolean\r\n subscribeAttempt = false\r\n\r\n scrollDown = () => { }\r\n\r\n /**\r\n * @description get user list from ws-chat-methods.service\r\n * @returns chatUser[]\r\n */\r\n getAllUsers = (): chatUser[] => {\r\n return []\r\n }\r\n\r\n sortRoomList = () => {}\r\n chatServiceDeleteRoom = (roomId) => {}\r\n\r\n constructor(\r\n public RochetChatConnectorService: RochetChatConnectorService,\r\n private MessageService: MessageService,\r\n private storage: Storage,\r\n private platform: Platform,\r\n private sqlservice: SqliteService,\r\n private NativeNotificationService: NativeNotificationService,\r\n private sortService: SortService,\r\n private chatService: ChatService,\r\n private NfService: NfService,\r\n private ChatMethodsService: ChatMethodsService,\r\n private AESEncrypt: AESEncrypt,\r\n private AttachmentsService: AttachmentsService,\r\n private NetworkServiceService: NetworkServiceService,\r\n private ChatSystemService: ChatSystemService,\r\n private ViewedMessageService: ViewedMessageService,\r\n private notificationService: NotificationsService\r\n ) {\r\n this.NativeNotificationService.askForPermission()\r\n\r\n this.RochetChatConnectorService.getUserStatus((d) => {\r\n\r\n const userId = d.fields.args[0][0]\r\n const statusNum = d.fields.args[0][2]\r\n const statusText = this.statusNumberToText(statusNum)\r\n\r\n this.ViewedMessageService.request(this, userId, statusNum, statusText)\r\n\r\n })\r\n\r\n this.RochetChatConnectorService.registerCallback({\r\n type: 'Offline',\r\n funx: () => {\r\n /**\r\n * @description when the phone is in the background for a long time it could disconnects from the socket then the socket reconnects automatically,\r\n * when the connection is lost the subscribe is also lost, so we have to subscribe again when reconnection is establish.\r\n */\r\n this.resetStatus();\r\n this.hasLoadHistory = false\r\n this.subscribeAttempt = false\r\n }\r\n });\r\n\r\n }\r\n\r\n /**\r\n * @description convert rocketchat statues num to readable string\r\n * @param text\r\n * @returns\r\n */\r\n statusNumberToText(text) {\r\n if(text == '0') {\r\n return \"offline\"\r\n }\r\n else if(text == '1') {\r\n return \"online\"\r\n }\r\n else if(text == '2') {\r\n return \"away\"\r\n }\r\n else if(text == '3') {\r\n return \"busy\"\r\n }\r\n }\r\n\r\n\r\n resetStatus() {\r\n this.status = {\r\n receive: {\r\n message: false,\r\n typing: false,\r\n readMessage: false,\r\n deleteMessage: false\r\n }\r\n }\r\n }\r\n\r\n setData({membersExcludeMe, members, u, customFields = {}, id, name, t, lastMessage = new MessageService(this.NfService, this.RochetChatConnectorService, this.ChatMethodsService, this.AESEncrypt, this.AttachmentsService, this.NetworkServiceService, this.ChatSystemService,this.notificationService), _updatedAt }) {\r\n this.customFields = customFields\r\n this.id = id\r\n this.name = name\r\n this.t = t\r\n this.lastMessage = lastMessage\r\n this._updatedAt = _updatedAt\r\n this.u = u\r\n this.members = members\r\n this.membersExcludeMe = membersExcludeMe\r\n\r\n this.calDateDuration();\r\n\r\n\r\n if(this.customFields?.countDownDate) {\r\n this.countDownDate(this.customFields.countDownDate);\r\n }\r\n\r\n }\r\n\r\n updateInfo() {\r\n // this.chatService.getRoomInfo(this.id).toPromise();\r\n\r\n }\r\n\r\n get online() {\r\n \r\n if(!this.isGroup) {\r\n for(let user of this.ChatSystemService.users) {\r\n\r\n for (const members of this.membersExcludeMe) {\r\n if(members._id == user._id) {\r\n return user.status\r\n }\r\n }\r\n \r\n }\r\n }\r\n\r\n return 'offline'\r\n }\r\n\r\n countDownDate(date) {\r\n let difference = new Date(date).getTime() - new Date().getTime();\r\n let c_day = Math.floor(difference/(1000*60*60*24));\r\n let c_hours = Math.floor((difference % (1000*60*60*24)) / (1000*60*60));\r\n let c_minutes = Math.floor((difference % (1000*60*60)) / (1000*60));\r\n let c_seconds = Math.floor((difference % (1000*60)) / 1000);\r\n\r\n this.countDownTime = this.addZero(c_day) + \" : \" + this.addZero(c_hours) + \" : \" + this.addZero(c_minutes) + \" : \" + this.addZero(c_seconds) ;\r\n\r\n if(difference < 0) {\r\n\r\n this.deleteRoom();\r\n\r\n } else {\r\n setTimeout(() => {\r\n this.countDownDate(date)\r\n }, 1000)\r\n }\r\n }\r\n\r\n addZero(i) {\r\n if (i < 10) {\r\n i = \"0\" + i;\r\n }\r\n return i;\r\n }\r\n\r\n deleteRoom() {\r\n this.countDownTime = \"Expired\";\r\n let body = { \"roomId\": this.id }\r\n\r\n // this.chatService.getRoomInfo(this.id).subscribe( room =>{});\r\n\r\n if(this.t === 'p') {\r\n this.chatService.deleteGroup(body).subscribe(res=>{\r\n this.ChatSystemService.deleteRoom(this.id);\r\n this.ChatSystemService.getAllRooms();\r\n this.chatServiceDeleteRoom(this.id);\r\n });\r\n }\r\n else {\r\n this.chatService.deleteChannel(body).subscribe(res=>{ \r\n this.ChatSystemService.deleteRoom(this.id);\r\n this.ChatSystemService.getAllRooms();\r\n this.chatServiceDeleteRoom(this.id);\r\n });\r\n }\r\n }\r\n\r\n\r\n isSenderIsNotMe(ChatMessage) {\r\n return SessionStore.user.UserName != ChatMessage.u.username\r\n }\r\n\r\n senderId(ChatMessage) {\r\n return ChatMessage.u._id\r\n }\r\n\r\n receiveMessage() {\r\n\r\n this.RochetChatConnectorService.updateRoomEventss(\r\n this.id,\r\n \"stream-room-messages\",\r\n async (IncomingChatMessage:IncomingChatMessage) => {\r\n\r\n this.appendReceiveMessage.push(IncomingChatMessage)\r\n\r\n }\r\n )\r\n\r\n this.RochetChatConnectorService.receiveStreamNotifyRoom((message) => {\r\n\r\n if(message.fields.eventName == this.id+'/'+'typing') {\r\n\r\n const args = message.fields.args\r\n\r\n if (typeof args[1] != 'object') {\r\n this.userThatIsTyping = this.usernameToDisplayName(args[0])\r\n \r\n this.isTyping = args[1]\r\n this.otherUserType = args[1]\r\n\r\n const user = args[0]\r\n if(SessionStore.user.UserName != user) {\r\n this.readAllMessage()\r\n }\r\n\r\n } else if(args[0]?.method == 'viewMessage' || args[1]?.method == 'viewMessage') {\r\n const user = args[0]\r\n\r\n if(SessionStore.user.UserName != user) {\r\n this.readAllMessage()\r\n }\r\n\r\n } else if(args[0]?.method == 'deleteMessage' || args[1]?.method == 'deleteMessage') {\r\n \r\n this.deleteMessage(args[1]?.method?._id)\r\n \r\n } else {\r\n\r\n }\r\n\r\n } else if (message.fields.eventName == this.id+'/'+'deleteMessage') {}\r\n\r\n })\r\n }\r\n\r\n appendReceiveMessage = FIFOProcessQueue(async (IncomingChatMessage:IncomingChatMessage, done) => {\r\n\r\n let IncomingChatMessageArgs = IncomingChatMessage.fields.args[0]\r\n let ChatMessage : ChatMessageInterface = this.fix_updatedAt(IncomingChatMessageArgs)\r\n\r\n\r\n let found = this.findMessageBy_id(ChatMessage._id) || \r\n this.findMessageBy_localReference(ChatMessage?.localReference)\r\n // || await this.findMessageInDBByData({_id:ChatMessage._id, localReference:ChatMessage.localReference })\r\n\r\n if(!found) {\r\n\r\n ChatMessage.origin = 'stream' \r\n const message = await this.prepareCreate({message: ChatMessage, save: false});\r\n this.registerSendMessage(message)\r\n\r\n message.from = 'stream'\r\n message.loadHistory = this.hasLoadHistory\r\n\r\n this.lastMessage = message;\r\n this.calDateDuration(ChatMessage._updatedAt);\r\n\r\n if (message.t == 'r') {\r\n this.name = message.msg;\r\n }\r\n\r\n if(this.isSenderIsNotMe(ChatMessage)) {\r\n this.NativeNotificationService.sendNotificationChat({\r\n message: message.msg,\r\n title: this.name\r\n });\r\n }\r\n \r\n if(this.hasLoadHistory == true) {\r\n this.messages.push(message)\r\n await message.addMessageDB()\r\n } else {\r\n this.messagesBeforeOfflineAPI.push(message)\r\n }\r\n\r\n if(this.chatOpen == false) {\r\n this.messageUnread = true\r\n }\r\n\r\n setTimeout(() => {\r\n this.scrollDown()\r\n }, 50) \r\n \r\n }\r\n\r\n setTimeout(() => {\r\n done()\r\n }, 5)\r\n })\r\n\r\n getUsersByStatus(status: 'offline' | 'online') {\r\n\r\n return this.getAllUsers().filter((user => {\r\n for(const member of this.membersExcludeMe) {\r\n if(user._id == member._id && user.status == status) {\r\n return true\r\n }\r\n }\r\n }))\r\n\r\n }\r\n\r\n getRoomMembersIds(): string[] {\r\n try {\r\n return this.membersExcludeMe.map((user)=> user._id)\r\n } catch(error) {\r\n return []\r\n }\r\n \r\n }\r\n\r\n getAllMemberThatIsNotOffline(): string[] {\r\n\r\n const membersIds = this.getRoomMembersIds()\r\n const allChatUsers = this.getAllUsers()\r\n\r\n const AllMemberThatIsNotOffline = []\r\n\r\n for(let user of allChatUsers) {\r\n if(membersIds.includes(user._id)) {\r\n\r\n if(user.status != 'offline') {\r\n AllMemberThatIsNotOffline.push(user._id)\r\n }\r\n }\r\n }\r\n\r\n return AllMemberThatIsNotOffline\r\n }\r\n\r\n getAllMemberThatIsOffline(): string[] {\r\n\r\n const membersIds = this.getRoomMembersIds()\r\n const allChatUsers = this.getAllUsers()\r\n\r\n const AllMemberThatIsNotOffline = []\r\n\r\n for(let user of allChatUsers) {\r\n if(membersIds.includes(user._id)) {\r\n\r\n if(user.status == 'offline') {\r\n AllMemberThatIsNotOffline.push(user._id)\r\n }\r\n }\r\n }\r\n\r\n return AllMemberThatIsNotOffline\r\n }\r\n\r\n\r\n async deleteMessageToReceive(userId) {\r\n \r\n const allDeleteMessages = await DeleteMessageModel.filter({rid: this.id}).execute()\r\n\r\n for(let message_ of allDeleteMessages) {\r\n \r\n if(message_.needToReceiveBy.includes(userId)) {\r\n\r\n message_.needToReceiveBy = message_.needToReceiveBy.filter((e)=> e != userId)\r\n this.sendFalseTypingReadMessage('deleteMessage',{_id:message_.messageId})\r\n\r\n if(message_.needToReceiveBy.length == 0) {\r\n \r\n const deleteMessage = await DeleteMessageModel.get({messageId: message_.messageId})\r\n await deleteMessage.delete()\r\n\r\n } else {\r\n await DeleteMessageModel.update(message_)\r\n }\r\n\r\n }\r\n \r\n }\r\n\r\n } \r\n\r\n async receiveMessageDelete() {\r\n\r\n this.RochetChatConnectorService.updateRoomEventss(\r\n this.id,\r\n \"stream-notify-room\",\r\n async (ChatMessage) => {\r\n const DeletedMessageId = ChatMessage.fields.args[0]._id;\r\n\r\n const message = this.messages.find((e) => e._id == DeletedMessageId)\r\n\r\n if(message.delate == false) {\r\n this.deleteMessage(DeletedMessageId)\r\n }\r\n \r\n }\r\n )\r\n }\r\n\r\n /**\r\n * @description delete message in the view\r\n * @param id message ID\r\n */\r\n async deleteMessage(_id) {\r\n \r\n const id = _id\r\n\r\n for (let i =0; i <= this.messages.length; i++) {\r\n\r\n if(this.messages[i]?._id == id ) {\r\n\r\n \r\n if (SessionStore.user.UserName == this.messages[i]?.u?.username) {\r\n const allMemberThatIsOffline = this.getAllMemberThatIsOffline()\r\n \r\n DeleteMessageModel.create({\r\n messageId: this.messages[i]._id,\r\n rid: this.messages[i].rid,\r\n ts: this.messages[i].ts,\r\n u: this.messages[i].u,\r\n needToReceiveBy: allMemberThatIsOffline\r\n })\r\n }\r\n \r\n this.messages[i]?.delateDB()\r\n this.messages.splice(i, 1)\r\n\r\n //Get previous last message from room\r\n const previousLastMessage = this.messages.slice(-1)[0];\r\n\r\n if(previousLastMessage) {\r\n this.lastMessage = previousLastMessage;\r\n this.calDateDuration(previousLastMessage._updatedAt)\r\n this.sortRoomList()\r\n }\r\n\r\n\r\n return true\r\n\r\n } else {\r\n // \r\n }\r\n }\r\n\r\n }\r\n\r\n\r\n deleteAll() {\r\n this.messages.forEach((message) => {\r\n if(message?._id) {\r\n this.sendDeleteRequest(message._id)\r\n }\r\n })\r\n }\r\n\r\n async delateMessageToSendToOthers(userId) {\r\n \r\n const deleteMessage = await DeleteMessageModel.all();\r\n\r\n const toSend = deleteMessage.filter((DeleteMessage:string[])=> ! DeleteMessage.includes(userId))\r\n\r\n }\r\n\r\n\r\n async sendDeleteRequest(msgId) {\r\n\r\n const message = this.messages.find((e)=>e._id == msgId)\r\n await message.delateStatusFalse()\r\n\r\n if(this.NetworkServiceService.getCurrentNetworkStatus() == ConnectionStatus.Online) {\r\n \r\n this.RochetChatConnectorService.deleteMessage(msgId).then(async() => {\r\n message.delateRequest = true\r\n await message.saveChanges();\r\n this.deleteMessage(msgId);\r\n })\r\n\r\n } else {\r\n this.RochetChatConnectorService.registerCallback({\r\n type: 'reConnect',\r\n funx: async ()=> {\r\n \r\n this.sendDeleteRequest(msgId)\r\n return true\r\n }\r\n })\r\n }\r\n\r\n }\r\n\r\n\r\n /**\r\n * @description sen text message\r\n */\r\n async send({file = null, attachments = null, temporaryData = {}}) {\r\n\r\n const localReference = uuidv4();\r\n\r\n let offlineChatMessage = {\r\n rid: this.id,\r\n msg: this.message,\r\n attachments,\r\n file,\r\n temporaryData,\r\n localReference,\r\n origin: 'local'\r\n }\r\n\r\n this.message= ''\r\n \r\n const message: MessageService = await this.prepareCreate({message:offlineChatMessage, save: environment.chatOffline})\r\n this.registerSendMessage(message)\r\n\r\n if(this.hasLoadHistory == true) {\r\n await message.addMessageDB()\r\n }\r\n \r\n message.send()\r\n message.from = 'send'\r\n message.loadHistory = this.hasLoadHistory\r\n\r\n if (environment.chatOffline) {\r\n \r\n setTimeout(() => {\r\n this.scrollDown()\r\n }, 150)\r\n\r\n this.lastMessage = message\r\n this.calDateDuration(message._updatedAt)\r\n this.sortRoomList()\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Register all send message so that\r\n * the incoming message wont be confuse to\r\n * other user the localReference is the identifier\r\n */\r\n registerSendMessage(message: MessageService) {\r\n this.messagesLocalReference.push(message.localReference)\r\n }\r\n\r\n\r\n localReferenceExist(message: MessageService) {\r\n for( const localReference of this.messagesLocalReference) {\r\n if(localReference == message?.localReference) {\r\n return true\r\n }\r\n }\r\n return false\r\n }\r\n\r\n sendTyping(text:string = this.message) {\r\n\r\n if(this.lastMessageTxt == text) { return false }\r\n this.lastTimeType = new Date().getTime()\r\n\r\n const lastIsTyping = this.isTyping\r\n if(text.length >= 1) {\r\n this.isTyping = true\r\n } else {\r\n this.isTyping = false\r\n }\r\n\r\n if(lastIsTyping != this.isTyping) {\r\n this.RochetChatConnectorService.sendStreamNotifyRoom(this.id, SessionStore.user.UserName, 'typing', this.isTyping).catch((error) => console.error(error));\r\n }\r\n\r\n this.lastMessageTxt = this.message\r\n this.typingWatch()\r\n }\r\n\r\n sendFalseTypingReadMessage(method,param: object) {\r\n this.RochetChatConnectorService.sendStreamNotifyRoom(this.id, SessionStore.user.UserName, 'typing', {method:method, params: param} as falseTypingMethod).catch((error) => console.error(error))\r\n this.setTypingOff()\r\n }\r\n\r\n private typingWatch() {\r\n setTimeout(() => {\r\n const now = new Date().getTime()\r\n\r\n if((now - this.lastTimeType) >= 2888) {\r\n\r\n if(this.isTyping == true) {\r\n this.isTyping = false\r\n this.RochetChatConnectorService.sendStreamNotifyRoom(this.id, SessionStore.user.UserName, 'typing', this.isTyping).catch((error) => console.error(error))\r\n }\r\n }\r\n\r\n }, 3000)\r\n }\r\n\r\n private setTypingOff() {\r\n this.sendTyping('')\r\n }\r\n\r\n roomLeave() {\r\n this.setTypingOff()\r\n this.chatOpen = false\r\n }\r\n\r\n open() {\r\n // this.typing(this.message)\r\n this.chatOpen = true\r\n this.messageUnread = false\r\n this.sendReadMessage()\r\n }\r\n\r\n\r\n leave(rid?) {\r\n this.RochetChatConnectorService.leaveRoom(this.id).catch((error) => console.error(error))\r\n }\r\n\r\n isJson(str) {\r\n try {\r\n JSON.parse(str);\r\n } catch (e) {\r\n return \"\";\r\n }\r\n return JSON.parse(str);\r\n }\r\n\r\n\r\n restoreOnce = false\r\n async restoreMessageFromDB() {\r\n if(environment.chatOffline && this.restoreOnce == false) {\r\n this.restoreOnce = true\r\n\r\n const messages = await MessageModel.filter({rid:this.id}).execute()\r\n\r\n for (let ChatMessage of messages) { \r\n const wewMessage = await this.simplePrepareMessage(ChatMessage)\r\n wewMessage.from = 'Offline'\r\n wewMessage.loadHistory = this.hasLoadHistory\r\n\r\n if(wewMessage.offline == false) {\r\n\r\n const message = await this.prepareCreate({message:ChatMessage})\r\n message.from = 'Offline'\r\n message.loadHistory = this.hasLoadHistory\r\n message?.decryptMessage()\r\n \r\n } else {\r\n \r\n const offlineMessage = await this.prepareCreate({message:ChatMessage})\r\n\r\n offlineMessage.from = 'Offline'\r\n offlineMessage.loadHistory = this.hasLoadHistory\r\n this.registerSendMessage(offlineMessage)\r\n offlineMessage?.decryptMessage()\r\n offlineMessage.send()\r\n\r\n\r\n }\r\n\r\n if(wewMessage.delate && !wewMessage.offline && !wewMessage.delateRequest) {\r\n this.sendDeleteRequest(wewMessage._id)\r\n }\r\n }\r\n \r\n setTimeout(() => {\r\n this.scrollDown()\r\n }, 50)\r\n }\r\n }\r\n\r\n // runs onces only\r\n loadHistoryCount = 0\r\n async loadHistory({limit = 1000, forceUpdate = false }) {\r\n\r\n if(forceUpdate == false) {\r\n if (this.hasLoadHistory) {\r\n return false\r\n }\r\n }\r\n\r\n this.hasLoadHistory = true\r\n\r\n await this.restoreMessageFromDB()\r\n const chatHistory: chatHistory = await this.RochetChatConnectorService.loadHistory(this.id, limit)\r\n\r\n if(chatHistory?.result?.messages) {\r\n\r\n const users = this.getUsersByStatus('online')\r\n\r\n for(let message of chatHistory.result.messages.reverse()) {\r\n\r\n message.origin = 'history'\r\n message.from = 'History'\r\n const messagesToSave = await this.prepareMessageCreateIfNotExist({message: message});\r\n if(messagesToSave != null) {\r\n\r\n messagesToSave.received = users.map((user) => user._id)\r\n messagesToSave.addMessageDB()\r\n }\r\n \r\n }\r\n\r\n\r\n for( const message of this.messagesBeforeOfflineAPI) {\r\n const messagesToSave = await this.prepareMessageCreateIfNotExist({message: message});\r\n if(messagesToSave != null) {\r\n\r\n messagesToSave.received = users.map((user) => user._id)\r\n messagesToSave.addMessageDB() \r\n }\r\n }\r\n this.messagesBeforeOfflineAPI = []\r\n\r\n setTimeout(() => {\r\n this.scrollDown()\r\n }, 50)\r\n \r\n }\r\n\r\n }\r\n\r\n async readAllMessage() {\r\n\r\n this.ViewedMessageService.requestReadAll(this)\r\n\r\n }\r\n\r\n\r\n\r\n async ChatMessageIsPresentInTheView(ChatMessage:ChatMessageInterface) {\r\n let foundIndex;\r\n\r\n const found = this.messages.find((MessageService, index) => {\r\n if (MessageService._id == ChatMessage._id) {\r\n foundIndex = index\r\n return true\r\n } else {\r\n return false\r\n }\r\n })\r\n\r\n if (foundIndex) {\r\n return { found, foundIndex}\r\n } else {\r\n return false\r\n }\r\n }\r\n\r\n\r\n\r\n\r\n async prepareCreate({message, save = true}): Promise<MessageService> {\r\n message = this.fix_updatedAt(message)\r\n\r\n const wewMessage = new MessageService(this.NfService, this.RochetChatConnectorService, this.ChatMethodsService, this.AESEncrypt, this.AttachmentsService, this.NetworkServiceService, this.ChatSystemService,this.notificationService)\r\n wewMessage.setData(message)\r\n wewMessage.loadHistory = this.hasLoadHistory\r\n \r\n if(save) {\r\n this.messages.push(wewMessage)\r\n }\r\n \r\n return wewMessage\r\n }\r\n\r\n\r\n simplePrepareMessage(message) {\r\n message = this.fix_updatedAt(message)\r\n const wewMessage = new MessageService(this.NfService, this.RochetChatConnectorService, this.ChatMethodsService, this.AESEncrypt, this.AttachmentsService, this.NetworkServiceService, this.ChatSystemService,this.notificationService)\r\n wewMessage.setData(message)\r\n wewMessage.loadHistory = this.hasLoadHistory\r\n\r\n return wewMessage\r\n }\r\n\r\n\r\n private findMessageBy_id (id) {\r\n for( let m of this.messages) {\r\n if(m?._id == id) {\r\n return true\r\n }\r\n }\r\n \r\n return false\r\n }\r\n\r\n private findMessageBy_localReference (localReference) {\r\n for( let m of this.messages) {\r\n if(m?.localReference == localReference) {\r\n return true\r\n }\r\n }\r\n\r\n return false\r\n }\r\n\r\n private async findMessageInDBByLocalReference({localReference}) {\r\n const a = await MessageModel.get({localReference: localReference})\r\n \r\n return typeof a.id == 'number'\r\n }\r\n\r\n private async findMessageInDBByLocalId({_id}) {\r\n const a = await MessageModel.get({_id: _id})\r\n return typeof a.id == 'number'\r\n }\r\n\r\n private async findMessageInDBByData({localReference, _id}) {\r\n \r\n const a = await MessageModel.filter({localReference: localReference})\r\n if(a.length >= 1) {\r\n\r\n return true\r\n }\r\n\r\n const c = await MessageModel.filter({_id: _id})\r\n if(c.length >= 1) {\r\n\r\n return true\r\n }\r\n\r\n\r\n return false\r\n }\r\n\r\n async prepareMessageCreateIfNotExist({message}) {\r\n message = this.fix_updatedAt(message)\r\n\r\n let found = await this.findMessageBy_id(message._id) || await this.findMessageBy_localReference(message.localReference)\r\n // || await this.findMessageInDBByData({_id:message._id, localReference:message.localReference })\r\n\r\n if (!found) {\r\n const wewMessage = this.simplePrepareMessage(message)\r\n this.messages.push(wewMessage)\r\n return wewMessage\r\n } else {\r\n return null\r\n }\r\n }\r\n\r\n private calDateDuration(date = null) {\r\n this.duration = showDateDuration(date || this._updatedAt);\r\n this._updatedAt = date || this._updatedAt\r\n }\r\n\r\n private fix_updatedAt(message): ChatMessageInterface {\r\n if (message?.result) {\r\n message.result._updatedAt = message.result._updatedAt['$date']\r\n } else if(message?._updatedAt) {\r\n if(message._updatedAt.hasOwnProperty('$date')) {\r\n message._updatedAt = message._updatedAt['$date']\r\n }\r\n }\r\n return message\r\n }\r\n\r\n usernameToDisplayName(username) {\r\n\r\n try {\r\n const firstName = capitalizeTxt(username.split('.')[0])\r\n const lastName = capitalizeTxt(username.split('.')[1])\r\n return firstName + ' ' + lastName\r\n } catch(error) {\r\n return username\r\n }\r\n\r\n }\r\n\r\n sendReadMessage() {\r\n this.RochetChatConnectorService.readMessage(this.id).catch((error) =>{\r\n console.error(error)\r\n })\r\n this.sendFalseTypingReadMessage('viewMessage', {})\r\n this.messageUnread = false\r\n }\r\n\r\n}\r\n"]},"metadata":{},"sourceType":"module"} |