import { Injectable } from '@angular/core'; import { Storage } from '@ionic/storage'; import { environment } from 'src/environments/environment'; @Injectable({ providedIn: 'root' }) export class ChatStorageService { constructor( private storage: Storage, ) { } /** * @description delete message in the DB. get all messages, delete then corresponding message and update the store * @param id message ID */ async deleteMessageFromDb(messageId, roomId) { if (environment.chatOffline) { await this.storage.get('chatmsg' + roomId).then(async(messages: any = []) => { if(!Array.isArray(messages)) { messages = [] } await messages.forEach( async (message, index) => { if(message._id == messageId) { messages.splice(index, 1) } }) this.storage.set('chatmsg' + roomId, messages).then((value) => { // console.log('MSG SAVED ON STORAGE', value) }); }) } } async updateMessageDB(ChatMessage, roomId, identificator) { if (environment.chatOffline) { await this.storage.get('chatmsg' + roomId).then(async(messages: any = []) => { if(!Array.isArray(messages)) { messages = [] } let index; const find = messages.find((message, _index)=> { if(message?.localReference == ChatMessage?.localReference || message?._id == ChatMessage?._id) { index = _index return true } return false }) if(find) { messages[index] = Object.assign(messages[index], ChatMessage) await this.storage.set('chatmsg' + roomId, messages) } else { // console.log('failed to update', identificator, ':',ChatMessage) } }) } } async updateChat(history, roomId, identificator = '_id') { if (environment.chatOffline) { await this.storage.get('chatmsg' + roomId).then(async(messages: any = []) => { if(!Array.isArray(messages)) { messages = [] } history.forEach( async(ChatMessage)=>{ let index; const find = messages.find((message, _index)=> { if(message[identificator]) { if(message[identificator] == ChatMessage[identificator]) { index = _index return true } } return false }) if(find) { messages[index] = Object.assign(messages[index], ChatMessage) // if(messages[index].msg.includes('***********')) { // console.log('storage update') // console.log(JSON.stringify(messages[index])) // console.log(JSON.stringify(ChatMessage)) // } await this.storage.set('chatmsg' + roomId, messages) } else { console.log('failed to update', identificator) } }) }) } } async addMessageDB(ChatMessage, roomId) { if (environment.chatOffline) { await this.storage.get('chatmsg' + roomId).then(async(messages: any = []) => { if(!Array.isArray(messages)) { messages = [] } if(!ChatMessage._id && environment.chatOffline) { delete ChatMessage.temporaryData messages.push(ChatMessage) console.log('no ID') await this.storage.set('chatmsg' + roomId, messages) // console.log('add to DB', ChatMessage) } else { const find = messages.find((message)=> { return message._id == ChatMessage._id }) if(!find) { delete ChatMessage.temporaryData messages.push(ChatMessage) await this.storage.set('chatmsg' + roomId, messages) // console.log('add to DB', ChatMessage) } else { console.log('duplicate') } } }) } } async addManyMessageDB(_ChatMessage: any[], roomId) { if (environment.chatOffline) { await this.storage.get('chatmsg' + roomId).then(async(messages: any = []) => { if(!Array.isArray(messages)) { messages = [] } await _ChatMessage.forEach(async(ChatMessage)=>{ if(!ChatMessage._id && environment.chatOffline) { delete ChatMessage.temporaryData messages.push(ChatMessage) // console.log('add to DB') } else { const find = messages.find((message)=> { return message._id == ChatMessage._id }) if(!find) { delete ChatMessage.temporaryData messages.push(ChatMessage) // console.log('add to DB') } } }) await this.storage.set('chatmsg' + roomId, messages) }) } } }