diff --git a/src/app/core/chat/repository/message/message-socket-repository.ts b/src/app/core/chat/repository/message/message-socket-repository.ts index 150990c48..d6c5e5480 100644 --- a/src/app/core/chat/repository/message/message-socket-repository.ts +++ b/src/app/core/chat/repository/message/message-socket-repository.ts @@ -19,7 +19,7 @@ export abstract class IMessageSocketRepository { abstract sendReadAt(data: MessageMarkAsReadInput): Promise> abstract sendDelete(data: MessageDeleteInputDTO): Promise> - abstract listenToMessages(): Observable + abstract listenToMessages(): Observable> abstract listenToDeleteMessages(): Observable abstract listenToUpdateMessages(): Observable diff --git a/src/app/infra/repository/adapter.ts b/src/app/infra/repository/adapter.ts index 3444b1133..fcf696492 100644 --- a/src/app/infra/repository/adapter.ts +++ b/src/app/infra/repository/adapter.ts @@ -20,7 +20,7 @@ export abstract class IDexieRepository> { abstract find(filter: Partial): Promise> - abstract findOne(filter: Partial): Promise> + abstract findOne(filter: Partial): Promise | undefined, T>> abstract findAll(): Promise> @@ -29,7 +29,7 @@ export abstract class IDexieRepository> { abstract clear(): Promise> } -export abstract class ILocalModel{ - abstract save() +export abstract class ILocalModel>{ + abstract save() : Promise> abstract delete() } diff --git a/src/app/infra/repository/dexie/dexie-repository.service.ts b/src/app/infra/repository/dexie/dexie-repository.service.ts index 69fa338af..d9600f6c4 100644 --- a/src/app/infra/repository/dexie/dexie-repository.service.ts +++ b/src/app/infra/repository/dexie/dexie-repository.service.ts @@ -218,9 +218,14 @@ export class DexieRepository> implements IDexieR } } - async findOne(filter: Partial): Promise> { + async findOne(filter: Partial): Promise | undefined, T>> { try { const document = await this.table.where(filter).first(); + + if(document) { + return ok(Object.assign(new LocalModel(this.table, this, this.db), document)); + } + return ok(document); } catch (_error) { const error: IDexieError = _error @@ -232,7 +237,7 @@ export class DexieRepository> implements IDexieR } } - async findAll(): Promise> { + async findAll(): Promise)[], T>> { try { const documents = await this.table.toArray() return ok(documents); @@ -270,7 +275,7 @@ export class DexieRepository> implements IDexieR } } -export class LocalModel> implements ILocalModel { +export class LocalModel implements ILocalModel { constructor( private table: EntityTable, @@ -279,13 +284,15 @@ export class LocalModel> implements ILocalModel ) {} save() { - const primaryKey = this.db[this.table.name].schema.primKey.name - return this.repository.update(primaryKey, this as any) + const primaryKey = this.table.schema.primKey.name + const idValue = this[primaryKey] + return this.repository.update(idValue, this as any) } delete() { - const primaryKey = this.db[this.table.name].schema.primKey.name - return this.repository.delete(primaryKey) + const primaryKey = this.table.schema.primKey.name + const idValue = this[primaryKey] + return this.repository.delete(idValue) } } diff --git a/src/app/infra/socket/signalR/signal-r.service.ts b/src/app/infra/socket/signalR/signal-r.service.ts index 1d3c2eb26..b5213e6c1 100644 --- a/src/app/infra/socket/signalR/signal-r.service.ts +++ b/src/app/infra/socket/signalR/signal-r.service.ts @@ -6,7 +6,7 @@ import { Plugins } from '@capacitor/core'; import { switchMap } from 'rxjs/operators'; import { err, Result } from 'neverthrow'; import { HubConnection } from '@microsoft/signalr'; -import { ISignalRInput } from '../type'; +import { ISignalRInput, ISignalROutput } from '../type'; const { App } = Plugins; @@ -16,7 +16,7 @@ const { App } = Plugins; export class SignalRService { private connection!: SignalRConnection; private connectingSubject: BehaviorSubject = new BehaviorSubject(null); - private sendDataSubject: BehaviorSubject<{method: string, data: any}> = new BehaviorSubject<{method: string, data: any}>(null); + private sendDataSubject: Subject = new Subject(); private deadConnectionBackGround: Subject; @@ -94,7 +94,7 @@ export class SignalRService { } getData() { - return this.sendDataSubject.asObservable() as BehaviorSubject<{method: string, data: T}> + return this.sendDataSubject.asObservable() } public getConnectionState(): Observable { diff --git a/src/app/infra/socket/signalR/signalR.ts b/src/app/infra/socket/signalR/signalR.ts index bdb3f3c13..b77524268 100644 --- a/src/app/infra/socket/signalR/signalR.ts +++ b/src/app/infra/socket/signalR/signalR.ts @@ -4,12 +4,13 @@ import { ok, Result, err } from 'neverthrow'; import { SessionStore } from 'src/app/store/session.service'; import { filter, first, map } from 'rxjs/operators'; import { v4 as uuidv4 } from 'uuid' -import { ISignalRInput } from '../type'; +import { ISignalRInput, ISignalROutput } from '../type'; import { MessageOutPutDataDTO } from 'src/app/core/chat/repository/dto/messageOutputDTO'; import { Subject } from 'rxjs'; -export interface SocketMessage { +export interface SocketMessage { method: string, - data: T + data: T, + payload: I } export enum EnumSocketError { @@ -26,10 +27,11 @@ export class SignalRConnection { private sendLaterSubject: BehaviorSubject = new BehaviorSubject(false); private reconnect = true - private sendDataSubject: BehaviorSubject<{method: string, data: any}> = new BehaviorSubject<{method: string, data: any}>(null); + private sendDataSubject: Subject = new Subject(); private pendingRequests: Map = new Map(); url: string private hasConnectOnce = false + private payload = {} constructor({url}) { this.url = url @@ -125,6 +127,8 @@ export class SignalRConnection { this.hubConnection.invoke(input.method, input.data) + this.payload[input.data.requestId] = input.data + this.sendDataSubject.pipe( filter((message) => { return input.data.requestId == message?.data.requestId || @@ -163,7 +167,8 @@ export class SignalRConnection { this.hubConnection.on(method, (message: any) => { this.sendDataSubject.next({ method: method, - data: message + data: message, + payload: this.payload[message?.requestId] }) }); } diff --git a/src/app/infra/socket/type.ts b/src/app/infra/socket/type.ts index f8f7e35e3..f0d7dc0b3 100644 --- a/src/app/infra/socket/type.ts +++ b/src/app/infra/socket/type.ts @@ -8,3 +8,23 @@ const SignalRInputSchema = z.object({ }) export type ISignalRInput = z.infer; + + + +const SignalROutOutSchema = z.object({ + method: z.string(), + data: z.object({ + requestId: z.string(), + }).catchall(z.unknown()), // Allows any additional properties with unknown values + payload: z.object({ + // requestId: z.string(), + }).catchall(z.unknown()), +}) + +export interface ISignalROutput { + method: string; + data: T; + payload: { + [key: string]: unknown; // Allows any additional properties with unknown values + }; +} diff --git a/src/app/module/chat/data/repository/message/message-live-signalr-data-source.service.ts b/src/app/module/chat/data/repository/message/message-live-signalr-data-source.service.ts index 98080eb9c..a2766d106 100644 --- a/src/app/module/chat/data/repository/message/message-live-signalr-data-source.service.ts +++ b/src/app/module/chat/data/repository/message/message-live-signalr-data-source.service.ts @@ -105,9 +105,7 @@ export class MessageSocketRepositoryService implements IMessageSocketRepository listenToMessages() { return this.socket.getData().pipe( - filter((e) : e is SocketMessage=> e?.method == 'ReceiveMessage' - ), - map((e)=> e.data) + filter((e) : e is SocketMessage=> e?.method == 'ReceiveMessage') ) } 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 1c7b5b2f0..aed030588 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 @@ -41,6 +41,8 @@ export class RoomLocalRepository extends DexieRepository i // (modifications as Partial).messages[0].sentAt = oldValue.messages?.[0]?.sentAt // } + console.log({modifications, oldValue}) + if((modifications as Partial).id || oldValue.id) { (modifications as Partial).local = IDBoolean.false } else { diff --git a/src/app/module/chat/domain/chat-service.service.ts b/src/app/module/chat/domain/chat-service.service.ts index 6e6b9d588..83d813fa0 100644 --- a/src/app/module/chat/domain/chat-service.service.ts +++ b/src/app/module/chat/domain/chat-service.service.ts @@ -28,7 +28,7 @@ import { SocketConnectUseCaseService } from './use-case/socket-connect-use-case. import { MessageMarkAsReadUseCaseService } from './use-case/message/message-mark-as-read-use-case.service' import { MessageMarkAllMessageAsReadByRoomIdInputSchema, MessageMarkAllMessageAsReadByRoomIdService } from './use-case/message/message-mark-all-message-as-read-by-room-id.service' import { GetRoomListUseCaseService } from 'src/app/module/chat/domain/use-case/room/room-get-list-use-case.service'; -import { filter } from 'rxjs/operators'; +import { filter, map } from 'rxjs/operators'; import { v4 as uuidv4 } from 'uuid' import { IMessage, MessageEntity } from '../../../core/chat/entity/message'; import { MessageAttachmentByMessageIdInput, MessageAttachmentByMessageIdUseCase } from './use-case/message/message-attachment-by-message-id.service'; @@ -138,6 +138,7 @@ export class ChatServiceService { }) this.MessageSocketRepositoryService.listenToMessages().pipe( + map(message => message.data), filter((message) => { if(!message?.requestId?.startsWith(InstanceId) == false) { // console.log('exclude my message---') diff --git a/src/app/module/chat/domain/service/room-last-message.service.ts b/src/app/module/chat/domain/service/room-last-message.service.ts index 04144070b..9b20e9cb8 100644 --- a/src/app/module/chat/domain/service/room-last-message.service.ts +++ b/src/app/module/chat/domain/service/room-last-message.service.ts @@ -19,6 +19,7 @@ export class RoomLastMessageService { listenToIncomingMessage() { return this.MessageSocketRepositoryService.listenToMessages().pipe( + map(message => message.data), filter((message) => !message?.requestId?.startsWith(InstanceId)), map(message => Object.assign(new MessageEntity(), message)) ).subscribe(async (message) => { diff --git a/src/app/module/chat/domain/use-case/message/listen-message-by-roomId.service.ts b/src/app/module/chat/domain/use-case/message/listen-message-by-roomId.service.ts index 281970a2c..f2a79f822 100644 --- a/src/app/module/chat/domain/use-case/message/listen-message-by-roomId.service.ts +++ b/src/app/module/chat/domain/use-case/message/listen-message-by-roomId.service.ts @@ -24,6 +24,7 @@ export class ListenMessageByRoomIdNewUseCase { execute(data: ListenMessageByRoomIdNewInputDTO) { return this.MessageSocketRepositoryService.listenToMessages().pipe( + map(message => message.data), filter((message) => !message?.requestId?.startsWith(InstanceId) && message?.roomId == data.roomId), map(message => Object.assign(new MessageEntity(), message)) ) diff --git a/src/app/module/chat/domain/use-case/message/listen-send-message.service.ts b/src/app/module/chat/domain/use-case/message/listen-send-message.service.ts index c49e4a8ed..69d860032 100644 --- a/src/app/module/chat/domain/use-case/message/listen-send-message.service.ts +++ b/src/app/module/chat/domain/use-case/message/listen-send-message.service.ts @@ -23,6 +23,7 @@ export class ListenSendMessageUseCase { execute({roomId}: {roomId: string}) { return this.MessageSocketRepositoryService.listenToMessages().pipe( + map(message => message.data), filter((message) => { return message?.requestId?.startsWith(InstanceId) && message?.roomId == roomId diff --git a/src/app/module/chat/domain/use-case/room/room-bold-sync-use-case.service.ts b/src/app/module/chat/domain/use-case/room/room-bold-sync-use-case.service.ts index 71ac61676..8c9c82d4a 100644 --- a/src/app/module/chat/domain/use-case/room/room-bold-sync-use-case.service.ts +++ b/src/app/module/chat/domain/use-case/room/room-bold-sync-use-case.service.ts @@ -39,6 +39,7 @@ export class RoomBoldSyncUseCaseService { */ private listenToIncomingMessage() { return this.MessageSocketRepositoryService.listenToMessages().pipe( + map(message => message.data), filter((message) => !message?.requestId?.startsWith(InstanceId)), map(message => Object.assign(new MessageEntity(), message)), filter((message) => !message.meSender()) 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 7ebe5d540..6a87bb86e 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 @@ -9,6 +9,7 @@ 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'; import { messageListDetermineChanges } from '../../../data/async/list/rooms/messageListChangedetector'; +import { IDBoolean } from 'src/app/infra/database/dexie/type'; @Injectable({ providedIn: 'root' @@ -80,9 +81,10 @@ export class RoomSetLastMessageService { } private listenToIncomingMessage() { - return this.messageSocketRepository.listenToMessages().pipe( - map(message => Object.assign(new MessageEntity(), message)) - ).subscribe(async (message) => { + return this.messageSocketRepository.listenToMessages() + .subscribe(async (e) => { + + const message = Object.assign(new MessageEntity(), e.data) if(message?.roomId) { console.log('listenToIncomingMessage', message.roomId) @@ -100,6 +102,18 @@ export class RoomSetLastMessageService { } else { console.log('set last message') } + } else if (findRoom.isOk() && !findRoom.value && e.payload.receiverId) { + // console.log('new room', e) + const findLocalDirectRoom = await this.roomLocalRepository.findOne({ + receiverId: e.payload.receiverId + }) + + if(findLocalDirectRoom.isOk() && findLocalDirectRoom.value) { + findLocalDirectRoom.value.id = message.roomId + findLocalDirectRoom.value.local = IDBoolean.false + findLocalDirectRoom.value.messages = [message]; + await findLocalDirectRoom.value.save() + } } } }); diff --git a/src/app/ui/chat/chat-routing.module.ts b/src/app/ui/chat/chat-routing.module.ts index 518ec0011..5ca5141af 100644 --- a/src/app/ui/chat/chat-routing.module.ts +++ b/src/app/ui/chat/chat-routing.module.ts @@ -51,6 +51,9 @@ const routes: Routes = [ { path: 'edit-message', loadChildren: () => import('./modal/edit-message/edit-message.module').then( m => m.EditMessagePageModule) + }, { + path: 'chat-popover', + loadChildren: () => import('./modal/chat-popover/chat-popover.module').then( m => m.ChatPopoverPageModule) } ]; diff --git a/src/app/ui/chat/component/group-contacts/group-contacts.page.html b/src/app/ui/chat/component/group-contacts/group-contacts.page.html index fafe6169d..7018ebf59 100644 --- a/src/app/ui/chat/component/group-contacts/group-contacts.page.html +++ b/src/app/ui/chat/component/group-contacts/group-contacts.page.html @@ -42,7 +42,7 @@

{{user.wxFullName }}

- diff --git a/src/app/ui/chat/component/messages/messages.page.html b/src/app/ui/chat/component/messages/messages.page.html index d0fc4bd4f..86e516368 100644 --- a/src/app/ui/chat/component/messages/messages.page.html +++ b/src/app/ui/chat/component/messages/messages.page.html @@ -7,7 +7,7 @@ -
+