Files
doneit-web/src/app/services/chat/message.service.ts
T

338 lines
8.5 KiB
TypeScript
Raw Normal View History

2022-01-10 23:52:33 +01:00
import { Injectable } from '@angular/core';
2022-01-13 10:52:03 +01:00
import { Message } from 'src/app/models/chatMethod';
2022-01-28 15:28:21 +01:00
import { Storage } from '@ionic/storage';
2022-02-03 21:01:53 +01:00
import { SessionStore } from 'src/app/store/session.service';
import { capitalizeTxt } from 'src/plugin/text'
2022-02-07 17:55:00 +01:00
import { NfService } from 'src/app/services/chat/nf.service'
2022-02-07 20:18:48 +01:00
import { WsChatService } from 'src/app/services/chat/ws-chat.service';
2022-02-10 15:50:11 +01:00
import { showDateDuration } from 'src/plugin/showDateDuration';
2022-03-03 22:57:33 +01:00
import { ChatStorageService } from './chat-storage.service'
2022-03-04 14:20:39 +01:00
import { ChatMethodsService } from './chat-methods.service'
2022-05-27 13:36:37 +01:00
import { MessageModel } from '../../models/beast-orm'
2022-03-10 23:08:29 +01:00
import { AESEncrypt } from '../aesencrypt.service'
2022-05-27 13:36:37 +01:00
import { HttpEventType } from '@angular/common/http';
2022-03-22 16:11:30 +01:00
import { AttachmentsService } from 'src/app/services/attachments.service';
2022-03-29 16:48:24 +01:00
import { NetworkServiceService , ConnectionStatus} from 'src/app/services/network-service.service';
2022-03-03 22:57:33 +01:00
2022-01-10 23:52:33 +01:00
@Injectable({
providedIn: 'root'
})
export class MessageService {
2022-01-13 21:24:43 +01:00
customFields
2022-01-11 15:43:09 +01:00
channels = []
mentions = []
msg = ''
rid = ''
2022-01-11 16:07:54 +01:00
ts = {}
2022-03-27 15:18:54 +01:00
u = {
name: '',
username: '',
2022-02-16 15:52:59 +01:00
_id: ""
}
t = ''
2022-03-03 22:57:33 +01:00
_id = ''
2022-03-10 23:08:29 +01:00
id = '' // table id
2022-02-03 21:01:53 +01:00
_updatedAt
2022-01-13 10:52:03 +01:00
file
attachments
2022-02-03 21:01:53 +01:00
offline = true
2022-02-04 00:22:35 +01:00
displayType = ''
2022-02-07 17:55:00 +01:00
temporaryData: any = {}
hasFile = false
hasSendAttachment = false
2022-02-08 17:44:15 +01:00
sendAttempt = 0
uploadingFile = false
errorUploadingAttachment = false
2022-02-10 14:07:16 +01:00
loadHistory = false
2022-02-10 15:50:11 +01:00
duration = ''
2022-02-10 18:07:06 +01:00
localReference = null
2022-02-16 15:52:59 +01:00
viewed = []
received = []
2022-03-10 23:08:29 +01:00
addToDb = false
2022-01-11 16:07:54 +01:00
2022-03-03 22:57:33 +01:00
messageSend = false
2022-03-15 15:49:59 +01:00
delate = false
delateRequest = false
2022-08-04 16:13:11 +01:00
downloadLoader: boolean = false
2022-03-03 22:57:33 +01:00
2022-02-07 17:55:00 +01:00
constructor(private storage: Storage,
2022-02-07 20:18:48 +01:00
private NfService: NfService,
2022-03-03 22:57:33 +01:00
private WsChatService: WsChatService,
2022-03-04 14:20:39 +01:00
private ChatStorageService: ChatStorageService,
2022-03-10 23:08:29 +01:00
private ChatMethodsService: ChatMethodsService,
2022-03-22 16:11:30 +01:00
private AESEncrypt: AESEncrypt,
2022-03-29 16:48:24 +01:00
private AttachmentsService: AttachmentsService,
private NetworkServiceService: NetworkServiceService) {
2022-02-03 21:01:53 +01:00
}
2022-01-11 16:07:54 +01:00
2022-03-15 15:49:59 +01:00
setData({customFields = {}, channels, mentions, msg ,rid ,ts, u, t, _id, id, _updatedAt, file, attachments, temporaryData, localReference , viewed = [], received = [], delate = false, delateRequest =false, }:Message) {
2022-03-03 22:57:33 +01:00
2022-02-03 21:01:53 +01:00
this.channels = channels || []
this.mentions = mentions || []
2022-03-23 23:08:49 +01:00
this.msg = msg || ""
2022-01-11 16:07:54 +01:00
this.rid = rid
this.ts = ts
2022-04-19 16:03:59 +01:00
this.u = u || { name: this.usernameToDisplayName(SessionStore.user.UserName), username: SessionStore.user.UserName, _id: ""}
this.t = t
2022-07-22 17:15:32 +01:00
this._id = _id || ""
2022-02-03 21:01:53 +01:00
this._updatedAt = _updatedAt || new Date().getTime()
2022-01-13 10:52:03 +01:00
this.file = file
2022-02-07 20:18:48 +01:00
this.temporaryData = temporaryData
2022-02-10 18:07:06 +01:00
this.localReference = localReference || null
2022-03-10 23:08:29 +01:00
this.id = id
2022-03-15 15:49:59 +01:00
this.delate = delate
this.delateRequest = delateRequest
2022-01-28 15:28:21 +01:00
2022-03-25 17:39:51 +01:00
if(this.attachments?.length >= 1 && attachments?.length >= 1) {
this.attachments[0] = Object.assign(this.attachments[0], attachments[0])
} else {
this.attachments = attachments
}
2022-03-03 22:57:33 +01:00
this.viewed = [...new Set([...viewed,...this.viewed])];
this.received = [...new Set([...received,...this.received])];
2022-02-03 21:01:53 +01:00
if(!this.ts) {
this.offline = true
2022-03-03 22:57:33 +01:00
this.messageSend = false
2022-02-03 21:01:53 +01:00
} else {
2022-03-03 22:57:33 +01:00
this.messageSend = true
2022-02-03 21:01:53 +01:00
this.offline = false
}
2022-01-28 15:28:21 +01:00
if (this.file) {
2022-02-04 00:22:35 +01:00
if(this.file.type) {
2022-02-07 17:55:00 +01:00
if(typeof(this.file.type) == 'string') {
this.hasFile = true
2022-02-04 00:22:35 +01:00
}
2022-01-28 15:28:21 +01:00
}
}
2022-02-02 20:16:12 +01:00
2022-02-07 17:55:00 +01:00
if(this.hasFile) {
if(this.file.type != 'application/webtrix') {
this.displayType = this.file.type.replace('application/','').toUpperCase()
}
}
2022-02-10 15:50:11 +01:00
this.calDateDuration()
2022-01-11 16:07:54 +01:00
}
2022-02-03 21:01:53 +01:00
private usernameToDisplayName(username) {
const firstName = capitalizeTxt(username.split('.')[0])
const lastName = capitalizeTxt(username.split('.')[1])
return firstName + ' ' + lastName
2022-02-09 18:18:27 +01:00
}
2022-02-03 21:01:53 +01:00
2022-02-10 14:56:06 +01:00
async send(): Promise<any> {
2022-02-08 17:44:15 +01:00
this.sendAttempt++;
if(!this.hasFile) {
2022-03-03 22:57:33 +01:00
2022-05-27 13:36:37 +01:00
const params = {
roomId:this.rid,
msg:this.msg,
localReference: this.localReference
}
2022-03-27 15:18:54 +01:00
2022-03-14 14:16:23 +01:00
await this.sendRequest(params)
2022-02-10 14:07:16 +01:00
2022-02-07 20:18:48 +01:00
} else {
2022-02-08 17:44:15 +01:00
this.uploadingFile = true
let uploadSuccessfully = false
if(this.hasSendAttachment == false) {
uploadSuccessfully = await this.NfService.beforeSendAttachment(this)
}
2022-02-09 18:18:27 +01:00
2022-02-08 17:44:15 +01:00
this.uploadingFile = false
2022-02-07 20:18:48 +01:00
2022-03-25 14:32:15 +01:00
if(uploadSuccessfully) {
2022-02-07 20:18:48 +01:00
this.hasSendAttachment = true
2022-02-08 17:44:15 +01:00
this.errorUploadingAttachment = false
this.temporaryData = {}
2022-02-09 18:18:27 +01:00
2022-03-04 14:20:39 +01:00
const params = {roomId:this.rid, msg: this.msg, attachments: this.attachments, file: this.file, localReference: this.localReference}
2022-03-14 14:16:23 +01:00
await this.sendRequest(params)
2022-02-10 14:56:06 +01:00
2022-02-08 17:44:15 +01:00
} else if(this.WsChatService.isLogin == false) {
this.WsChatService.registerCallback({
type: 'reConnect',
2022-02-10 14:56:06 +01:00
funx: async ()=> {
2022-03-04 14:20:39 +01:00
this.send()
return true
2022-02-08 17:44:15 +01:00
}
2022-02-07 20:18:48 +01:00
})
2022-02-08 17:44:15 +01:00
} else if(uploadSuccessfully == false) {
this.errorUploadingAttachment = true
2022-02-10 19:07:38 +01:00
2022-04-26 14:34:52 +01:00
return new Promise((resolve, reject) => {
2022-02-10 18:07:06 +01:00
reject(false)
})
2022-03-27 15:18:54 +01:00
2022-02-07 20:18:48 +01:00
}
2022-02-09 18:18:27 +01:00
2022-02-07 20:18:48 +01:00
}
2022-02-18 15:08:13 +01:00
2022-02-07 20:18:48 +01:00
}
2022-03-14 14:16:23 +01:00
async sendRequest(params) {
2022-04-26 14:34:52 +01:00
2022-04-13 21:54:31 +01:00
if(params?.attachments) {
if(params?.attachments[0]?.image_url) {
delete params?.attachments[0]?.image_url
}
2022-03-22 16:11:30 +01:00
}
2022-03-29 16:48:24 +01:00
if(this.NetworkServiceService.getCurrentNetworkStatus() == ConnectionStatus.Online) {
this.WsChatService.send(params).then(
(ChatMessage: any) => {
ChatMessage = ChatMessage.message.result
this.messageSend = true
this.redefinedMessage(ChatMessage)
}
)
} else {
this.WsChatService.registerCallback({
type: 'reConnect',
funx: async ()=> {
this.send()
return true
}
})
}
2022-03-14 14:16:23 +01:00
}
2022-03-03 22:57:33 +01:00
async redefinedMessage(ChatMessage , update = true) {
2022-02-10 18:07:06 +01:00
ChatMessage = this.NfService.fix_updatedAt(ChatMessage)
2022-03-27 15:18:54 +01:00
2022-03-03 22:57:33 +01:00
const message = this.getChatObj()
ChatMessage = Object.assign(message, ChatMessage)
2022-02-07 20:18:48 +01:00
this.setData(ChatMessage)
2022-03-10 23:08:29 +01:00
await this.save()
2022-02-07 15:51:21 +01:00
}
2022-03-22 16:11:30 +01:00
downloadFileMsg() {
2022-02-08 17:44:15 +01:00
this.downloadLoader = true;
2022-03-22 16:11:30 +01:00
let downloadFile = "";
this.AttachmentsService.downloadFile(this.file.guid).subscribe(async (event) => {
if (event.type === HttpEventType.DownloadProgress) {
} else if (event.type === HttpEventType.Response) {
if (this.file.type == "application/img") {
downloadFile = 'data:image/jpeg;base64,' + btoa(new Uint8Array(event.body).reduce((data, byte) => data + String.fromCharCode(byte), ''));
} else if (this.file.type != "application/img") {
2022-03-22 16:11:30 +01:00
downloadFile = new Uint8Array(event.body).reduce((data, byte) => data + String.fromCharCode(byte), '');
2022-04-28 09:32:27 +01:00
2022-05-27 13:36:37 +01:00
}
2022-03-22 16:11:30 +01:00
this.attachments[0] = {
image_url: downloadFile,
name: this.attachments[0].name,
title: this.attachments[0].title,
title_link: downloadFile,
title_link_download: this.attachments[0].title_link_download,
ts: this.attachments[0].ts
}
2022-03-27 15:18:54 +01:00
2022-03-22 16:11:30 +01:00
// save the changes to the storage
this.save()
this.downloadLoader = false;
2022-03-22 16:11:30 +01:00
}
});
2022-02-08 17:44:15 +01:00
}
2022-02-10 15:50:11 +01:00
private calDateDuration(date = null) {
this.duration = showDateDuration(date || this._updatedAt);
}
2022-03-10 23:08:29 +01:00
2022-03-18 12:32:21 +01:00
async delateStatusFalse() {
2022-03-15 15:49:59 +01:00
this.delate = true
this.save()
2022-03-03 22:57:33 +01:00
}
2022-02-16 15:52:59 +01:00
2022-03-18 12:32:21 +01:00
async delateDB() {
2022-03-27 15:18:54 +01:00
2022-03-18 12:32:21 +01:00
const message = await MessageModel.get({_id: this._id})
await message.delete()
}
2022-03-15 15:49:59 +01:00
2022-03-03 22:57:33 +01:00
isSenderIsNotMe(ChatMessage) {
2022-04-19 16:03:59 +01:00
return SessionStore.user.UserName != ChatMessage.u.username
2022-03-03 22:57:33 +01:00
}
messageOwnerById(id) {
2022-04-19 16:03:59 +01:00
return SessionStore.user.UserName != this.u.username
2022-03-03 22:57:33 +01:00
}
private getChatObj() {
return {
channels: this.channels,
mentions: this.mentions,
2022-04-19 16:03:59 +01:00
//msg: this.AESEncrypt.encrypt(this.msg, SessionStore.user.UserName),
2022-03-27 15:18:54 +01:00
msg:this.msg,
2022-03-03 22:57:33 +01:00
rid: this.rid,
ts: this.ts,
u: this.u,
_id: this._id,
2022-03-10 23:08:29 +01:00
id: this.id,
2022-03-03 22:57:33 +01:00
_updatedAt: this._updatedAt,
messageSend: this.messageSend,
offline: this.offline,
viewed: this.viewed,
received: this.received,
2022-03-10 23:08:29 +01:00
localReference: this.localReference,
attachments: this.attachments,
2022-03-15 15:49:59 +01:00
file: this.file,
delate: this.delate
2022-02-16 15:52:59 +01:00
}
2022-03-03 22:57:33 +01:00
}
async addMessageDB() {
2022-03-10 23:08:29 +01:00
if(!this.addToDb) {
2022-07-25 14:48:28 +01:00
this.addToDb = true
2022-03-10 23:08:29 +01:00
const message = this.getChatObj()
2022-03-03 22:57:33 +01:00
2022-03-10 23:08:29 +01:00
delete message.id
const createdMessage = await MessageModel.create(message)
2022-02-16 15:52:59 +01:00
2022-03-10 23:08:29 +01:00
this.id = createdMessage.id
}
2022-02-16 15:52:59 +01:00
}
2022-03-03 22:57:33 +01:00
async save() {
const message = this.getChatObj()
2022-04-28 09:32:27 +01:00
2022-03-03 22:57:33 +01:00
2022-03-10 23:08:29 +01:00
await MessageModel.update(message)
2022-02-16 15:52:59 +01:00
}
2022-02-10 18:07:06 +01:00
2022-03-10 23:08:29 +01:00
decryptMessage() {
try {
2022-04-19 16:03:59 +01:00
// this.msg = this.AESEncrypt.decrypt(this.msg, SessionStore.user.UserName)
2022-03-10 23:08:29 +01:00
} catch (error) {}
}
2022-01-10 23:52:33 +01:00
}