import { Injectable } from '@angular/core'; import { Message } from 'src/app/models/chatMethod'; import { Storage } from '@ionic/storage'; import { SessionStore } from 'src/app/store/session.service'; import { capitalizeTxt } from 'src/plugin/text' import { NfService } from 'src/app/services/chat/nf.service' import { WsChatService } from 'src/app/services/chat/ws-chat.service'; import { environment } from 'src/environments/environment'; import { showDateDuration } from 'src/plugin/showDateDuration'; @Injectable({ providedIn: 'root' }) export class MessageService { customFields channels = [] mentions = [] msg = '' rid = '' ts = {} u = {} t = '' _id ='' _updatedAt file attachments offline = true displayType = '' temporaryData: any = {} hasFile = false hasSendAttachment = false sendAttempt = 0 uploadingFile = false errorUploadingAttachment = false loadHistory = false duration = '' localReference = null constructor(private storage: Storage, private NfService: NfService, private WsChatService: WsChatService) { } setData({customFields, channels, mentions, msg ,rid ,ts, u, t, _id, _updatedAt, file, attachments, temporaryData, localReference}:Message) { this.customFields = customFields this.channels = channels || [] this.mentions = mentions || [] this.msg = msg || "" this.rid = rid this.ts = ts this.u = u || { name: this.usernameToDisplayName(SessionStore.user.RochetChatUser), username: SessionStore.user.RochetChatUser, _id: ""} this.t = t this._id = _id this._updatedAt = _updatedAt || new Date().getTime() this.file = file this.attachments = attachments this.temporaryData = temporaryData this.localReference = localReference || null if(!this.ts) { this.offline = true } else { this.offline = false } if (this.file) { if(this.file.type) { if(typeof(this.file.type) == 'string') { this.hasFile = true } } } if(this.hasFile) { this.getFileFromDb() if(this.file.type != 'application/webtrix') { this.displayType = this.file.type.replace('application/','').toUpperCase() } } this.calDateDuration() } private usernameToDisplayName(username) { const firstName = capitalizeTxt(username.split('.')[0]) const lastName = capitalizeTxt(username.split('.')[1]) return firstName + ' ' + lastName } getFileFromDb() { if(this.hasFile) { if (this.file.guid) { this.storage.get(this.file.guid).then((image) => { if(image != null) { this.file.image_url = image } }); } } } async send(): Promise { this.sendAttempt++; if(!this.hasFile) { this.WsChatService.send({roomId:this.rid, msg:this.msg, requestId: this.localReference}).then(({message, requestId}) => { let ChatMessage = message.result if (environment.chatOffline) { this.redefinedMessage(ChatMessage) alert('redifie') this.offline = false } return new Promise((resolve, reject)=>{ resolve(ChatMessage) }) }) } else { this.uploadingFile = true let uploadSuccessfully = false if(this.hasSendAttachment == false) { uploadSuccessfully = await this.NfService.beforeSendAttachment(this) } this.uploadingFile = false if(uploadSuccessfully || this.hasSendAttachment == false) { this.hasSendAttachment = true this.errorUploadingAttachment = false this.temporaryData = {} alert('to send') this.WsChatService.send({roomId:this.rid, msg: this.msg, attachments: this.attachments, file: this.file, requestId: this.localReference}).then(({message, requestId}) => { alert('receive11') console.log('message', message) let ChatMessage = message.result if (environment.chatOffline) { this.redefinedMessage(ChatMessage) this.offline = false } return new Promise((resolve, reject)=>{ resolve(ChatMessage) }) }) } else if(this.WsChatService.isLogin == false) { this.WsChatService.registerCallback({ type: 'reConnect', funx: async ()=> { return await this.send() } }) } else if(uploadSuccessfully == false) { this.errorUploadingAttachment = true return new Promise((resolve, reject)=>{ reject(false) }) } } } redefinedMessage(ChatMessage) { ChatMessage = this.NfService.fix_updatedAt(ChatMessage) this.setData(ChatMessage) } async downloadFileMsg() { const result = await this.NfService.beforeSendAttachment(this) if(result) { } } private calDateDuration(date = null) { this.duration = showDateDuration(date || this._updatedAt); } }