diff --git a/src/app/core/chat/usecase/message/message-get-all-by-room-Id.ts b/src/app/core/chat/usecase/message/message-get-all-by-room-Id.ts index 84052e170..479bc57c9 100644 --- a/src/app/core/chat/usecase/message/message-get-all-by-room-Id.ts +++ b/src/app/core/chat/usecase/message/message-get-all-by-room-Id.ts @@ -13,6 +13,7 @@ export const MessageGetAllByRoomIdUseCaseOutputSchema = z.object({ data: z.object({ id: z.string(), roomId: z.string(), + isDeleted: z.boolean(), sender: z.object({ wxUserId: z.number(), wxFullName: z.string(), diff --git a/src/app/infra/database/dexie/instance/chat/schema/message.ts b/src/app/infra/database/dexie/instance/chat/schema/message.ts index f2bb84edd..e85c6c7b8 100644 --- a/src/app/infra/database/dexie/instance/chat/schema/message.ts +++ b/src/app/infra/database/dexie/instance/chat/schema/message.ts @@ -8,6 +8,7 @@ export const MessageTableSchema = z.object({ id: z.string().uuid().optional(), roomId: z.string().uuid().optional(), message: z.string().nullable().optional(), + requestId: z.string().nullable().optional(), messageType: z.number(), canEdit: z.boolean(), oneShot: z.boolean(), diff --git a/src/app/module/chat/data/repository/room/room-local-repository.service.ts b/src/app/module/chat/data/repository/room/room-local-repository.service.ts index 01fa300b4..1b9f42c86 100644 --- a/src/app/module/chat/data/repository/room/room-local-repository.service.ts +++ b/src/app/module/chat/data/repository/room/room-local-repository.service.ts @@ -19,14 +19,17 @@ export class RoomLocalRepository extends DexieRepository i // } // }); - // chatDatabase.room.hook('updating', (modifications, primKey, obj, transaction) => { + chatDatabase.room.hook('updating', (modifications, primKey, oldValue, transaction) => { - // if((modifications as Partial).messages?.[0].attachments?.[0]) { - // delete (modifications as Partial).messages[0].attachments[0].file - // } + if((modifications as Partial).messages?.[0].requestId == oldValue.messages?.[0].requestId) { + (modifications as Partial).messages[0].sentAt = oldValue.messages?.[0]?.sentAt; + } else if ((modifications as Partial).messages?.[0].id == oldValue.messages?.[0].id) { + (modifications as Partial).messages[0].sentAt = oldValue.messages?.[0]?.sentAt + } + + return modifications + }); - // return modifications - // }); } getItemsLive() { diff --git a/src/app/module/chat/domain/chat-service.service.ts b/src/app/module/chat/domain/chat-service.service.ts index 36f3c8048..e810c02dc 100644 --- a/src/app/module/chat/domain/chat-service.service.ts +++ b/src/app/module/chat/domain/chat-service.service.ts @@ -43,7 +43,22 @@ import { MemberListHttpSyncUseCase } from 'src/app/module/chat/domain/use-case/m import { RoomBoldSyncUseCaseService } from 'src/app/module/chat/domain/use-case/room/room-bold-sync-use-case.service' import { RoomSetLastMessageService } from 'src/app/module/chat/domain/use-case/room/room-set-last-message.service'; import { IUserPhotoGetByIdInput, UserPhotoGetByIdUseCase } from 'src/app/module/chat/domain/use-case/user-photo/user-photo-get-by-id-use-case.service' -export const InstanceId = uuidv4(); + + +export const getInstanceId = (): string => { + const storageKey = 'instanceId'; // Key for localStorage + let instanceId = localStorage.getItem(storageKey); + + // If not found in localStorage, generate and set a new UUID + if (!instanceId) { + instanceId = uuidv4(); + localStorage.setItem(storageKey, instanceId); + } + + return instanceId; +}; + +export const InstanceId = getInstanceId(); @Injectable({ providedIn: 'root' diff --git a/src/app/module/chat/domain/use-case/room/room-set-last-message.service.ts b/src/app/module/chat/domain/use-case/room/room-set-last-message.service.ts index d5aca34c1..b6ead587c 100644 --- a/src/app/module/chat/domain/use-case/room/room-set-last-message.service.ts +++ b/src/app/module/chat/domain/use-case/room/room-set-last-message.service.ts @@ -1,13 +1,13 @@ import { Injectable } from '@angular/core'; import { IMessageSocketRepository } from 'src/app/core/chat/repository/message/message-socket-repository'; import { IRoomLocalRepository } from 'src/app/core/chat/repository/room/room-local-repository'; -import { filter, map } from 'rxjs/operators'; -import { InstanceId } from '../../chat-service.service'; +import { filter, map, tap } from 'rxjs/operators'; import { MessageEntity } from 'src/app/core/chat/entity/message'; -import { SessionStore } from 'src/app/store/session.service'; import { HttpAdapter } from 'src/app/infra/http/adapter'; import { IMessageGetAllByRoomIdOutPut } from 'src/app/core/chat/usecase/message/message-get-all-by-room-Id'; import { RoomEntity } from 'src/app/core/chat/entity/group'; +import { RoomTable } from 'src/app/infra/database/dexie/instance/chat/schema/room'; +import { IMessageLocalRepository } from 'src/app/core/chat/repository/message/message-local-repository'; @Injectable({ providedIn: 'root' @@ -17,61 +17,81 @@ export class RoomSetLastMessageService { constructor( private roomLocalRepository: IRoomLocalRepository, private messageSocketRepository: IMessageSocketRepository, + private messageLocalRepository: IMessageLocalRepository, private http: HttpAdapter, ) { this.listenToIncomingMessage() this.listenToOnSendDataToSocket() this.loadHistory() this.listenToUpdateMessage() - } - private listenToUpdateMessage() {} + private listenToUpdateMessage() { + let roomList: RoomTable[] = [] + this.roomLocalRepository.getItemsLive().pipe( + tap((_roomList) => { + + roomList = _roomList + + }) + ).subscribe(); + + this.messageSocketRepository.listenToUpdateMessages().subscribe(async(_message) => { + const message = {..._message} + + for(const room of roomList) { + if(room.messages?.[0]?.id == message.id) { + const result = await this.roomLocalRepository.update(message.roomId, { + messages: [message] + }) + } + } + }) + + this.messageSocketRepository.listenToDeleteMessages().subscribe(async(_message) => { + const message = {..._message} + + for(const room of roomList) { + if(room.messages?.[0]?.id == message.id) { + console.log({...room.messages?.[0],isDeleted: true}) + const result = await this.roomLocalRepository.update(message.roomId, { + messages: [{...room.messages?.[0],isDeleted: true}] + }) + } + } + }) + } private listenToIncomingMessage() { return this.messageSocketRepository.listenToMessages().pipe( - filter((message) => !message?.requestId?.startsWith(InstanceId)), // get all message not send by me map(message => Object.assign(new MessageEntity(), message)) ).subscribe(async (message) => { - const result = await this.roomLocalRepository.update(message.roomId, { - messages: [message] - }) + if(message?.roomId) { + const result = await this.roomLocalRepository.update(message.roomId, { + messages: [message] + }) - if(result.isErr()) { - console.log('failed to update last message') - } else { - console.log('set last message') + if(result.isErr()) { + console.log('failed to update last message') + } else { + console.log('set last message') + } } + }); } private listenToOnSendDataToSocket() { - this.messageSocketRepository.listenToSendMessage().subscribe(async (e) => { + this.messageLocalRepository.onCreateObservable().subscribe(async (message) => { + if(message?.roomId) { - const message = Object.assign(new MessageEntity(), e.data) - - message.sender = { - userPhoto: '', - wxeMail: SessionStore.user.Email, - wxFullName: SessionStore.user.FullName, - wxUserId: SessionStore.user.UserId - } - message.sentAt = new Date().toISOString() - - if(e.data.attachment?.fileType) { - message.attachments = [ e.data.attachment ] - } else { - message.attachments = [] - } - - const result = await this.roomLocalRepository.update(e.data.roomId, { - messages: [message] - }) - - if(result.isErr()) { - console.log(result.error) + setTimeout(async() => { + const result = await this.roomLocalRepository.update(message.roomId, { + messages: [message] + }) + }, 100) } }) @@ -103,14 +123,18 @@ export class RoomSetLastMessageService { const localLastMessageDate = new Date(room.value.messages[0].sentAt).getTime() const loadHistoryLastMessageDate = new Date(loadHistoryFirstMessage.sentAt).getTime() - if(loadHistoryLastMessageDate>localLastMessageDate) { + if(loadHistoryFirstMessage.id == room.value.messages?.[0]?.id) { + // do nothing + } else if(loadHistoryLastMessageDate>localLastMessageDate) { await this.roomLocalRepository.update(loadHistoryFirstMessage.roomId, { messages: [loadHistoryFirstMessage] }) } else if(loadHistoryLastMessageDate == localLastMessageDate) { - // console.log('same', loadHistoryFirstMessage, roomEntity) - } else { - // console.log('bug!', loadHistoryFirstMessage, roomEntity) + // do nothing + } else if(room.value.messages[0].isDeleted != loadHistoryFirstMessage.isDeleted) { + await this.roomLocalRepository.update(loadHistoryFirstMessage.roomId, { + messages: [loadHistoryFirstMessage] + }) } } diff --git a/src/app/ui/chat/component/messages/messages.page.ts b/src/app/ui/chat/component/messages/messages.page.ts index 778c9afd9..f023dfb0d 100644 --- a/src/app/ui/chat/component/messages/messages.page.ts +++ b/src/app/ui/chat/component/messages/messages.page.ts @@ -573,13 +573,16 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy return modal.onDidDismiss().then((res) => { - this.chatServiceService.updateMessage({ - memberId: SessionStore.user.UserId, - message: res.data.message, - messageId: message.id, - requestId: '', - roomId: this.roomId - }) + if(res.data) { + this.chatServiceService.updateMessage({ + memberId: SessionStore.user.UserId, + message: res.data.message, + messageId: message.id, + requestId: '', + roomId: this.roomId + }) + } + }); } diff --git a/src/app/ui/chat/modal/edit-message/edit-message.page.ts b/src/app/ui/chat/modal/edit-message/edit-message.page.ts index c770347aa..bf894bb8c 100644 --- a/src/app/ui/chat/modal/edit-message/edit-message.page.ts +++ b/src/app/ui/chat/modal/edit-message/edit-message.page.ts @@ -25,7 +25,7 @@ export class EditMessagePage implements OnInit { } ngAfterViewInit() { // Focus the textarea once the view has been initialized - this.messageInput.nativeElement.focus(); + // this.messageInput.nativeElement.focus(); } dismiss() { diff --git a/src/app/ui/chat/modal/messages/messages.page.ts b/src/app/ui/chat/modal/messages/messages.page.ts index 6d0987449..ff4bdcd44 100644 --- a/src/app/ui/chat/modal/messages/messages.page.ts +++ b/src/app/ui/chat/modal/messages/messages.page.ts @@ -1451,13 +1451,16 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { return modal.onDidDismiss().then((res) => { - this.chatServiceService.updateMessage({ - memberId: SessionStore.user.UserId, - message: res.data.message, - messageId: message.id, - requestId: '', - roomId: this.roomId - }) + if(res.data) { + this.chatServiceService.updateMessage({ + memberId: SessionStore.user.UserId, + message: res.data.message, + messageId: message.id, + requestId: '', + roomId: this.roomId + }) + } + }); }