send direct message

This commit is contained in:
Peter Maquiran
2024-08-20 16:34:47 +01:00
parent 4fb24f7875
commit 59fc19879f
41 changed files with 912 additions and 308 deletions
@@ -29,7 +29,6 @@
</ion-refresher>
<div class="main-content">
------
<ion-progress-bar class="position-absolute" type="indeterminate" *ngIf="loading"></ion-progress-bar>
<ion-virtual-scroll [items]="userList" approxItemHeight="70px" [headerFn]="separateLetter">
@@ -67,11 +67,12 @@
</div>
<div *ngIf="attachment.fileType == MessageAttachmentFileType.Image">
<img
[src]="attachment.safeFile"
(load)="onImageLoad(message, messageIndex)"
(error)="onImageError()">
</div>
<img
*ngIf="attachment.oneShot != true"
[src]="attachment.safeFile"
(load)="onImageLoad(message, messageIndex)"
(error)="onImageError()">
</div>
<div *ngIf="attachment.fileType == MessageAttachmentFileType.Audio">
<audio [src]="attachment.safeFile|safehtml" preload="metadata" class="flex-grow-1" controls controlsList="nodownload noplaybackrate"></audio>
@@ -92,7 +93,6 @@
<ion-label>{{ attachment.fileName}}</ion-label>
</div>
</div>
</div>
@@ -112,8 +112,19 @@
</div>
<div style="text-align: end;">
<div *ngIf="message.messageStatus != 'send'" style="font-size: .6875rem;">A enviar</div>
<div *ngIf="message.messageStatus == 'send'" style="font-size: .6875rem;">Enviado</div>
<!-- <div *ngIf="messageStatus(message) == 'enviar'" style="font-size: .6875rem;">A enviar</div>
<div *ngIf="messageStatus(message) == 'enviado'" style="font-size: .6875rem;">Enviado</div>
<div *ngIf="messageStatus(message) == 'allReceived'" style="font-size: .6875rem;">allReceived</div>
<div *ngIf="messageStatus(message) == 'allViewed'" style="font-size: .6875rem;">allViewed</div>
-->
<div *ngIf="totalMembers != 0">
<ion-icon *ngIf="messageStatus(message) == 'enviar'" src="assets/images/clock-regular.svg"></ion-icon>
<ion-icon *ngIf="messageStatus(message) == 'enviado'" src="assets/images/check-solid.svg"></ion-icon>
<ion-icon *ngIf="messageStatus(message) == 'allReceived'" src="assets/images/check-double-solid.svg"></ion-icon>
<ion-icon *ngIf="messageStatus(message) == 'allViewed'" src="assets/images/check-double-solid -viewed.svg"></ion-icon>
</div>
</div>
@@ -147,7 +158,7 @@
<!-- <ion-footer (click)="ChatSystemService.getDmRoom(roomId).sendReadMessage()"> -->
<ion-footer >
<ion-footer (click)="sendReadMessage()">
<!-- <div class="typing" *ngIf="ChatSystemService.getDmRoom(roomId).otherUserType == true" >
<ngx-letters-avatar *ngIf="showAvatar"
@@ -464,3 +464,26 @@ ion-footer {
cursor: pointer;
margin: 2px;
}
.modal {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
background: rgba(0, 0, 0, 0.5);
}
.modal img {
max-width: 90%;
max-height: 90%;
}
.modal button {
margin-top: 10px;
}
@@ -1,4 +1,4 @@
import { AfterViewInit, Component, ElementRef, EventEmitter, Input, OnChanges, OnDestroy, OnInit, Output, SimpleChanges, ViewChild } from '@angular/core';
import { AfterViewInit, Component, ElementRef, EventEmitter, Input, OnChanges, OnDestroy, OnInit, Output, SimpleChanges, TemplateRef, ViewChild } from '@angular/core';
import { AnimationController, GestureController, IonRange, ModalController, PopoverController } from '@ionic/angular';
import { ToastService } from 'src/app/services/toast.service';
import { ContactsPage } from '../contacts/contacts.page';
@@ -21,11 +21,10 @@ import { Howl } from 'howler';
import { ViewMediaPage } from 'src/app/modals/view-media/view-media.page';
import { PermissionService } from 'src/app/services/permission.service';
import { Observable as DexieObservable } from 'Dexie';
import { Subscription } from 'rxjs';
import { Observable, Subscription } from 'rxjs';
import { RoomLocalRepository } from 'src/app/module/chat/data/repository/room-local-repository.service'
import { MemberListLocalRepository } from 'src/app/module/chat/data/repository/member-list-local-repository.service'
import { MessageTable } from 'src/app/module/chat/infra/database/dexie/schema/message';
import { RoomListItemOutPutDTO } from 'src/app/module/chat/data/dto/room/roomListOutputDTO';
import { ChatServiceService } from 'src/app/module/chat/domain/chat-service.service';
import { EditMessagePage } from 'src/app/modals/edit-message/edit-message.page';
import { MessageEntity } from 'src/app/module/chat/domain/entity/message';
@@ -44,10 +43,10 @@ import { LastMessage } from '../../utils/lastMessage';
import { UserTypingLocalRepository } from 'src/app/module/chat/data/repository/user-typing-local-data-source.service';
import { UserTypingRemoteRepositoryService } from 'src/app/module/chat/data/repository/user-typing-live-data-source.service';
import { MessageLocalDataSourceService } from 'src/app/module/chat/data/repository/message/message-local-data-source.service';
import { MessageRemoteDataSourceService } from 'src/app/module/chat/data/repository/message/message-remote-data-source.service';
import { MessageEnum } from 'src/app/module/chat/domain/use-case/message-create-use-case.service';
import { RoomType } from "src/app/module/chat/domain/entity/group";
import { RoomTable } from 'src/app/module/chat/infra/database/dexie/schema/room';
import { Logger } from 'src/app/services/logger/main/service';
import { tap } from 'rxjs/operators';
@Component({
@@ -121,7 +120,7 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy
roomData$: DexieObservable<RoomTable | undefined>
roomStatus$: DexieObservable<Boolean >
roomMessage$: DexieObservable<MessageTable[]>
roomMembers$: DexieObservable<MemberTable[] | undefined>
roomMembers$: Observable<MemberTable[] | undefined>
//userTyping$: DexieObservable<TypingTable[] | undefined>
userTyping$: TypingTable[] | undefined
newMessagesStream!: Subscription
@@ -142,6 +141,9 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy
MessageAttachmentFileType = MessageAttachmentFileType
MessageAttachmentFileSource = MessageAttachmentSource
@ViewChild('imageModal') imageModal: TemplateRef<any>;
totalMembers = 0
constructor(
public popoverController: PopoverController,
private modalController: ModalController,
@@ -166,7 +168,6 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy
private userTypingLocalRepository: UserTypingLocalRepository,
private UserTypingRemoteRepositoryService: UserTypingRemoteRepositoryService,
private messageLocalDataSourceService: MessageLocalDataSourceService,
private MessageRemoteDataSourceService: MessageRemoteDataSourceService
) {
// update
this.checkAudioPermission()
@@ -178,21 +179,26 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy
this.roomData$ = this.RoomLocalRepository.getRoomByIdLive(this.roomId)
this.roomData$.subscribe(e => {
console.log(e)
// console.log(e)
if(e) {
this.roomType = e.roomType
}
})
this.getMessages();
this.listenToIncomingMessage();
this.listenToDeleteMessage();
this.listenToUpdateMessage();
this.listenToSendMessage()
this.listenToSendMessage();
// this.roomMessage$ = this.messageRepositoryService.getItemsLive(this.roomId)
this.roomMembers$ = this.MemberListLocalRepository.getRoomMemberByIdLive(this.roomId) as any
this.roomMembers$ = this.MemberListLocalRepository.getRoomMemberByIdLive(this.roomId).pipe(
tap((members) => {
this.totalMembers = members.length
})
)
this.roomStatus$ = this.MemberListLocalRepository.allMemberOnline(this.roomId)
this.chatServiceService.getRoomById(this.roomId)
@@ -206,6 +212,25 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy
})
}
messageStatus(message: MessageEntity) {
if(this.allViewed(message)) {
return 'allViewed'
} else if(this.allReceived(message)) {
return 'allReceived'
} else if (message.messageStatus == 'send') {
return 'enviado'
} else {
return 'enviar'
}
}
allReceived(message: MessageEntity) {
return message.info.filter(e => typeof e.deliverAt == 'string').length == this.totalMembers
}
allViewed(message: MessageEntity) {
return message.info.filter(e => typeof e.readAt == 'string').length == this.totalMembers
}
async getMessages() {
// dont remove this line
@@ -226,7 +251,6 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy
if(message.hasAttachment) {
if(message.$id) {
console.log('message.$id', message.$id)
this.chatServiceService.getMessageAttachmentByMessageId(message).then((result)=> {
if(result.isOk()) {
message.attachments[0].safeFile = result.value
@@ -253,6 +277,26 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy
async onImageError() {}
sendReadMessage() {
Logger.info('send read at')
for(const message of this.messages1[this.roomId]) {
const me = message.info.find(e => e.memberId == SessionStore.user.UserId && typeof e.readAt == 'string')
if(!me) {
this.chatServiceService.sendReadAt({
memberId: SessionStore.user.UserId,
messageId: message.id,
requestId: '',
roomId: this.roomId
})
}
}
}
listenToIncomingMessage() {
this.messageReceiveSubject?.unsubscribe();
this.messageReceiveSubject = this.chatServiceService.listenToIncomingMessage(this.roomId).subscribe(async (message) => {
@@ -302,7 +346,7 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy
const index = this.messages1[this.roomId].findIndex(e => e?.id === updateMessage.id); // Use triple equals for comparison
if (index !== -1) { // Check if the item was found
console.log('update ==')
this.messages1[this.roomId][index].info = updateMessage.info
this.messages1[this.roomId][index].message = updateMessage.message
this.messages1[this.roomId][index].reactions = updateMessage.reactions
} else {
@@ -316,19 +360,18 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy
this.messageSendSubject?.unsubscribe();
this.messageSendSubject = this.chatServiceService.listenToSendMessage(this.roomId).subscribe((updateMessage) => {
console.log('update message', updateMessage);
const index = this.messages1[this.roomId].findIndex(e => e?.requestId === updateMessage.requestId); // Use triple equals for comparison
if (index !== -1) { // Check if the item was found
console.log('update ==')
this.messages1[this.roomId][index].id = updateMessage.id
this.messages1[this.roomId][index].info = updateMessage.info
let attachmentIndex = 0;
for(const message of updateMessage.attachments) {
console.log('set attachmen id', message)
this.messages1[this.roomId][index].attachments[attachmentIndex].id = message.id
attachmentIndex++;
}
@@ -365,9 +408,9 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy
sendReadAt() {
this.chatServiceService.messageMarkAsRead({roomId: this.roomId}).then((e) => {
console.log(e)
})
// this.chatServiceService.messageMarkAsRead({roomId: this.roomId}).then((e) => {
// console.log(e)
// })
}
sendTyping() {
@@ -1240,6 +1283,11 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy
}, 1000)
}
closeModal(a: any) {
}
}