mirror of
https://code.equilibrium.co.ao/ITO/doneit-web.git
synced 2026-04-18 20:47:54 +00:00
set last message fix
This commit is contained in:
@@ -13,6 +13,7 @@ export const MessageGetAllByRoomIdUseCaseOutputSchema = z.object({
|
|||||||
data: z.object({
|
data: z.object({
|
||||||
id: z.string(),
|
id: z.string(),
|
||||||
roomId: z.string(),
|
roomId: z.string(),
|
||||||
|
isDeleted: z.boolean(),
|
||||||
sender: z.object({
|
sender: z.object({
|
||||||
wxUserId: z.number(),
|
wxUserId: z.number(),
|
||||||
wxFullName: z.string(),
|
wxFullName: z.string(),
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ export const MessageTableSchema = z.object({
|
|||||||
id: z.string().uuid().optional(),
|
id: z.string().uuid().optional(),
|
||||||
roomId: z.string().uuid().optional(),
|
roomId: z.string().uuid().optional(),
|
||||||
message: z.string().nullable().optional(),
|
message: z.string().nullable().optional(),
|
||||||
|
requestId: z.string().nullable().optional(),
|
||||||
messageType: z.number(),
|
messageType: z.number(),
|
||||||
canEdit: z.boolean(),
|
canEdit: z.boolean(),
|
||||||
oneShot: 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]) {
|
if((modifications as Partial<RoomTable>).messages?.[0].requestId == oldValue.messages?.[0].requestId) {
|
||||||
// delete (modifications as Partial<RoomTable>).messages[0].attachments[0].file
|
(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() {
|
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 { 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 { 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'
|
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({
|
@Injectable({
|
||||||
providedIn: 'root'
|
providedIn: 'root'
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
import { Injectable } from '@angular/core';
|
import { Injectable } from '@angular/core';
|
||||||
import { IMessageSocketRepository } from 'src/app/core/chat/repository/message/message-socket-repository';
|
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 { IRoomLocalRepository } from 'src/app/core/chat/repository/room/room-local-repository';
|
||||||
import { filter, map } from 'rxjs/operators';
|
import { filter, map, tap } from 'rxjs/operators';
|
||||||
import { InstanceId } from '../../chat-service.service';
|
|
||||||
import { MessageEntity } from 'src/app/core/chat/entity/message';
|
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 { HttpAdapter } from 'src/app/infra/http/adapter';
|
||||||
import { IMessageGetAllByRoomIdOutPut } from 'src/app/core/chat/usecase/message/message-get-all-by-room-Id';
|
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 { 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({
|
@Injectable({
|
||||||
providedIn: 'root'
|
providedIn: 'root'
|
||||||
@@ -17,22 +17,56 @@ export class RoomSetLastMessageService {
|
|||||||
constructor(
|
constructor(
|
||||||
private roomLocalRepository: IRoomLocalRepository,
|
private roomLocalRepository: IRoomLocalRepository,
|
||||||
private messageSocketRepository: IMessageSocketRepository,
|
private messageSocketRepository: IMessageSocketRepository,
|
||||||
|
private messageLocalRepository: IMessageLocalRepository,
|
||||||
private http: HttpAdapter,
|
private http: HttpAdapter,
|
||||||
) {
|
) {
|
||||||
this.listenToIncomingMessage()
|
this.listenToIncomingMessage()
|
||||||
this.listenToOnSendDataToSocket()
|
this.listenToOnSendDataToSocket()
|
||||||
this.loadHistory()
|
this.loadHistory()
|
||||||
this.listenToUpdateMessage()
|
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() {
|
private listenToIncomingMessage() {
|
||||||
return this.messageSocketRepository.listenToMessages().pipe(
|
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))
|
map(message => Object.assign(new MessageEntity(), message))
|
||||||
).subscribe(async (message) => {
|
).subscribe(async (message) => {
|
||||||
|
if(message?.roomId) {
|
||||||
const result = await this.roomLocalRepository.update(message.roomId, {
|
const result = await this.roomLocalRepository.update(message.roomId, {
|
||||||
messages: [message]
|
messages: [message]
|
||||||
})
|
})
|
||||||
@@ -42,36 +76,22 @@ export class RoomSetLastMessageService {
|
|||||||
} else {
|
} else {
|
||||||
console.log('set last message')
|
console.log('set last message')
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private listenToOnSendDataToSocket() {
|
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)
|
setTimeout(async() => {
|
||||||
|
const result = await this.roomLocalRepository.update(message.roomId, {
|
||||||
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]
|
messages: [message]
|
||||||
})
|
})
|
||||||
|
}, 100)
|
||||||
if(result.isErr()) {
|
|
||||||
console.log(result.error)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
})
|
})
|
||||||
@@ -103,14 +123,18 @@ export class RoomSetLastMessageService {
|
|||||||
const localLastMessageDate = new Date(room.value.messages[0].sentAt).getTime()
|
const localLastMessageDate = new Date(room.value.messages[0].sentAt).getTime()
|
||||||
const loadHistoryLastMessageDate = new Date(loadHistoryFirstMessage.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, {
|
await this.roomLocalRepository.update(loadHistoryFirstMessage.roomId, {
|
||||||
messages: [loadHistoryFirstMessage]
|
messages: [loadHistoryFirstMessage]
|
||||||
})
|
})
|
||||||
} else if(loadHistoryLastMessageDate == localLastMessageDate) {
|
} else if(loadHistoryLastMessageDate == localLastMessageDate) {
|
||||||
// console.log('same', loadHistoryFirstMessage, roomEntity)
|
// do nothing
|
||||||
} else {
|
} else if(room.value.messages[0].isDeleted != loadHistoryFirstMessage.isDeleted) {
|
||||||
// console.log('bug!', loadHistoryFirstMessage, roomEntity)
|
await this.roomLocalRepository.update(loadHistoryFirstMessage.roomId, {
|
||||||
|
messages: [loadHistoryFirstMessage]
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -573,6 +573,7 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy
|
|||||||
|
|
||||||
return modal.onDidDismiss().then((res) => {
|
return modal.onDidDismiss().then((res) => {
|
||||||
|
|
||||||
|
if(res.data) {
|
||||||
this.chatServiceService.updateMessage({
|
this.chatServiceService.updateMessage({
|
||||||
memberId: SessionStore.user.UserId,
|
memberId: SessionStore.user.UserId,
|
||||||
message: res.data.message,
|
message: res.data.message,
|
||||||
@@ -580,6 +581,8 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy
|
|||||||
requestId: '',
|
requestId: '',
|
||||||
roomId: this.roomId
|
roomId: this.roomId
|
||||||
})
|
})
|
||||||
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ export class EditMessagePage implements OnInit {
|
|||||||
}
|
}
|
||||||
ngAfterViewInit() {
|
ngAfterViewInit() {
|
||||||
// Focus the textarea once the view has been initialized
|
// Focus the textarea once the view has been initialized
|
||||||
this.messageInput.nativeElement.focus();
|
// this.messageInput.nativeElement.focus();
|
||||||
}
|
}
|
||||||
|
|
||||||
dismiss() {
|
dismiss() {
|
||||||
|
|||||||
@@ -1451,6 +1451,7 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy {
|
|||||||
|
|
||||||
return modal.onDidDismiss().then((res) => {
|
return modal.onDidDismiss().then((res) => {
|
||||||
|
|
||||||
|
if(res.data) {
|
||||||
this.chatServiceService.updateMessage({
|
this.chatServiceService.updateMessage({
|
||||||
memberId: SessionStore.user.UserId,
|
memberId: SessionStore.user.UserId,
|
||||||
message: res.data.message,
|
message: res.data.message,
|
||||||
@@ -1458,6 +1459,8 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy {
|
|||||||
requestId: '',
|
requestId: '',
|
||||||
roomId: this.roomId
|
roomId: this.roomId
|
||||||
})
|
})
|
||||||
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user