set last message fix

This commit is contained in:
Peter Maquiran
2024-09-10 21:45:46 +01:00
parent 3f4a19c205
commit ec9f388b14
8 changed files with 112 additions and 62 deletions
@@ -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(),
@@ -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(),
@@ -19,14 +19,17 @@ export class RoomLocalRepository extends DexieRepository<RoomTable, RoomTable> i
// }
// });
// chatDatabase.room.hook('updating', (modifications, primKey, obj, transaction) => {
chatDatabase.room.hook('updating', (modifications, primKey, oldValue, transaction) => {
// if((modifications as Partial<RoomTable>).messages?.[0].attachments?.[0]) {
// delete (modifications as Partial<RoomTable>).messages[0].attachments[0].file
// }
if((modifications as Partial<RoomTable>).messages?.[0].requestId == oldValue.messages?.[0].requestId) {
(modifications as Partial<RoomTable>).messages[0].sentAt = oldValue.messages?.[0]?.sentAt;
} else if ((modifications as Partial<RoomTable>).messages?.[0].id == oldValue.messages?.[0].id) {
(modifications as Partial<RoomTable>).messages[0].sentAt = oldValue.messages?.[0]?.sentAt
}
return modifications
});
// return modifications
// });
}
getItemsLive() {
@@ -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'
@@ -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]
})
}
}
@@ -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
})
}
});
}
@@ -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() {
@@ -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
})
}
});
}