diff --git a/gabinete-digital-fo.code-workspace b/gabinete-digital-fo.code-workspace index 10c377788..c94b494f7 100644 --- a/gabinete-digital-fo.code-workspace +++ b/gabinete-digital-fo.code-workspace @@ -6,9 +6,6 @@ }, { "path": "../sentium" - }, - { - "path": "../../../Desktop/contacts" } ], "settings": { diff --git a/src/app/core/chat/repository/member/member-socket-repository.ts b/src/app/core/chat/repository/member/member-socket-repository.ts new file mode 100644 index 000000000..2149e9aa5 --- /dev/null +++ b/src/app/core/chat/repository/member/member-socket-repository.ts @@ -0,0 +1,8 @@ +import { Observable } from 'rxjs'; +import { IRemoveRoomMemberOutput, RemoveRoomMemberInput } from 'src/app/module/chat/domain/use-case/member/member-remove-socket-use-case.service'; + +export abstract class IMemberSocketRepository { + abstract removeMember(input: RemoveRoomMemberInput): Promise + + abstract listenToRemoveMember(): Observable +} diff --git a/src/app/infra/socket/signalR/signalR.ts b/src/app/infra/socket/signalR/signalR.ts index b77524268..6050fa8b1 100644 --- a/src/app/infra/socket/signalR/signalR.ts +++ b/src/app/infra/socket/signalR/signalR.ts @@ -4,11 +4,11 @@ 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, ISignalROutput } from '../type'; +import { ISignalRInput, ISignalROutput, ISocketMethod } from '../type'; import { MessageOutPutDataDTO } from 'src/app/core/chat/repository/dto/messageOutputDTO'; import { Subject } from 'rxjs'; export interface SocketMessage { - method: string, + method: ISocketMethod, data: T, payload: I } @@ -166,7 +166,7 @@ export class SignalRConnection { for(const method of methods) { this.hubConnection.on(method, (message: any) => { this.sendDataSubject.next({ - method: method, + method: method as any, data: message, payload: this.payload[message?.requestId] }) diff --git a/src/app/infra/socket/type.ts b/src/app/infra/socket/type.ts index f0d7dc0b3..12805b0d2 100644 --- a/src/app/infra/socket/type.ts +++ b/src/app/infra/socket/type.ts @@ -1,7 +1,34 @@ import { z } from "zod"; +let socketMethodSchema = z.enum([ + 'ReceiveMessage', + 'TypingMessage', + 'AvailableUsers', + 'ReadAt', + 'DeleteMessage', + 'UpdateMessage', + 'GroupAddedMembers', + 'GroupDeletedMembers', + 'UserAddGroup', + 'RemoveRoomMember', + 'TypingMessage', + 'UserRemoveGroup', // no on the documentation + 'GroupUpdate', // not in the documentation + 'CreateGroup', // not on the documentation + 'Typing', + 'EditMessage', + 'ReactMessage', + 'AddRoomMember', + 'SendDirectMessage', + 'DeliverAt', + 'sendMessage' +]); + +export type ISocketMethod = z.infer + + const SignalRInputSchema = z.object({ - method: z.string(), + method: socketMethodSchema, data: z.object({ requestId: z.string(), }).catchall(z.unknown()), // Allows any additional properties with unknown values @@ -22,7 +49,7 @@ const SignalROutOutSchema = z.object({ }) export interface ISignalROutput { - method: string; + method: ISocketMethod; data: T; payload: { [key: string]: unknown; // Allows any additional properties with unknown values diff --git a/src/app/module/chat/chat.module.ts b/src/app/module/chat/chat.module.ts index 6d367bd11..fbefea718 100644 --- a/src/app/module/chat/chat.module.ts +++ b/src/app/module/chat/chat.module.ts @@ -40,6 +40,8 @@ import { IUserPhotoLocalRepository } from 'src/app/core/chat/repository/user-pho import { UserPhotoLocalRepository } from './data/repository/user-foto/user-photo-local-repository.service'; import { IUserPhotoRemoteRepository } from 'src/app/core/chat/repository/user-photo/user-photo-remote-repository'; import { UserPhotoRemoteRepositoryService } from './data/repository/user-foto/user-photo-remote-repository.service'; +import { IMemberSocketRepository } from 'src/app/core/chat/repository/member/member-socket-repository'; +import { MemberSocketRepositoryService } from './data/repository/member/member-socket-repository.service'; @NgModule({ imports: [HttpModule], providers: [ @@ -73,6 +75,10 @@ import { UserPhotoRemoteRepositoryService } from './data/repository/user-foto/us provide: IMemberRemoteRepository, useClass: MemberListRemoteRepository }, + { + provide: IMemberSocketRepository, + useClass: MemberSocketRepositoryService + }, // room repository { provide: IRoomLocalRepository, @@ -113,7 +119,8 @@ import { UserPhotoRemoteRepositoryService } from './data/repository/user-foto/us { provide: IUserPhotoRemoteRepository, useClass: UserPhotoRemoteRepositoryService - } + }, + ], declarations: [], schemas: [], diff --git a/src/app/module/chat/data/repository/member/member-socket-repository.service.ts b/src/app/module/chat/data/repository/member/member-socket-repository.service.ts new file mode 100644 index 000000000..417cd7e33 --- /dev/null +++ b/src/app/module/chat/data/repository/member/member-socket-repository.service.ts @@ -0,0 +1,40 @@ +import { Injectable } from '@angular/core'; +import { SignalRService } from 'src/app/infra/socket/signalR/signal-r.service'; +import { IMemberSocketRepository } from 'src/app/core/chat/repository/member/member-socket-repository'; +import { IRemoveRoomMemberOutput, RemoveRoomMemberInput } from '../../../domain/use-case/member/member-remove-socket-use-case.service'; +import { InstanceId } from '../../../domain/chat-service.service'; +import { v4 as uuidv4 } from 'uuid' +import { filter, map, tap } from 'rxjs/operators'; +import { SocketMessage } from 'src/app/infra/socket/signalR/signalR'; + +@Injectable({ + providedIn: 'root' +}) +export class MemberSocketRepositoryService implements IMemberSocketRepository { + + constructor( + private socket: SignalRService + ) { + // this.listenToRemoveMember() + } + async removeMember(data: RemoveRoomMemberInput) { + + const result = await this.socket.sendData({ + method: 'RemoveRoomMember', + data: { + ...data, + requestId: InstanceId +'@'+ uuidv4() + }, + }) + + return result; + } + + listenToRemoveMember() { + return this.socket.getData().pipe( + filter((e) : e is SocketMessage=> e?.method == 'GroupDeletedMembers'), + map((e)=> e.data), + ) + } + +} 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 aed030588..4f0dd9bd2 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 @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; import { liveQuery, Observable } from 'Dexie'; import { DexieRepository } from 'src/app/infra/repository/dexie/dexie-repository.service'; -import { BehaviorSubject, from } from 'rxjs'; +import { BehaviorSubject, from, Subject } from 'rxjs'; import { RoomTable, RoomTableSchema } from 'src/app/infra/database/dexie/instance/chat/schema/room'; import { chatDatabase } from 'src/app/infra/database/dexie/instance/chat/service'; import { IRoomLocalRepository } from 'src/app/core/chat/repository/room/room-local-repository'; @@ -13,7 +13,7 @@ import { RoomType } from 'src/app/core/chat/entity/group'; }) export class RoomLocalRepository extends DexieRepository implements IRoomLocalRepository { - private listenCreateSyncSubject : BehaviorSubject = new BehaviorSubject(null); + private listenCreateSyncSubject : Subject = new Subject(); constructor() { super(chatDatabase.room, RoomTableSchema) diff --git a/src/app/module/chat/domain/chat-service.service.ts b/src/app/module/chat/domain/chat-service.service.ts index 83d813fa0..f469af6af 100644 --- a/src/app/module/chat/domain/chat-service.service.ts +++ b/src/app/module/chat/domain/chat-service.service.ts @@ -23,6 +23,7 @@ import { ListenSendMessageUseCase } from './use-case/message/listen-send-message import { SendLocalMessagesUseCaseService } from './use-case/message/messages-send-offline-use-case.service' import { RemoveMemberUseCaseService } from './use-case/member/-use-case.service' import { AddMemberUseCaseService } from './use-case/member/member-add-use-case.service' +import { MemberRemoveSocketUseCaseService, RemoveRoomMemberInput } from './use-case/member/member-remove-socket-use-case.service' import { RoomUpdateInputDTO, UpdateRoomByIdUseCaseService } from './use-case/room/room-update-by-id-use-case.service' import { SocketConnectUseCaseService } from './use-case/socket-connect-use-case.service' import { MessageMarkAsReadUseCaseService } from './use-case/message/message-mark-as-read-use-case.service' @@ -117,7 +118,8 @@ export class ChatServiceService { private roomGetLocalByIdService: RoomGetLocalByIdService, private roomSetLocalToFalseByIdService: RoomSetLocalToFalseByIdService, private roomUpdateNameSyncService: RoomUpdateNameSyncService, - private RoomDirectOnSetIdUseCaseService: RoomDirectOnSetIdUseCaseService + private RoomDirectOnSetIdUseCaseService: RoomDirectOnSetIdUseCaseService, + private MemberRemoveSocketUseCaseService: MemberRemoveSocketUseCaseService ) { this.MessageSocketRepositoryService.listenToDeleteMessages() .pipe() @@ -272,6 +274,10 @@ export class ChatServiceService { return this.AddMemberUseCaseService.execute(data) } + removeMember(input: RemoveRoomMemberInput) { + return this.MemberRemoveSocketUseCaseService.execute(input) + } + updateRoomById(data: RoomUpdateInputDTO) { return this.UpdateRoomByIdUseCaseService.execute(data) } @@ -283,9 +289,6 @@ export class ChatServiceService { sendLocalMessages() { return this.SendLocalMessagesUseCaseService.execute() } - removeMember() { - - } sendReadAt(sendReadAt: MessageMarkAsReadInput) { return this.MessageMarkAsReadUseCaseService.execute(sendReadAt) diff --git a/src/app/module/chat/domain/use-case/member/-use-case.service.ts b/src/app/module/chat/domain/use-case/member/-use-case.service.ts index ff2f5bdbe..c0bbd23bf 100644 --- a/src/app/module/chat/domain/use-case/member/-use-case.service.ts +++ b/src/app/module/chat/domain/use-case/member/-use-case.service.ts @@ -1,6 +1,5 @@ import { Injectable } from '@angular/core'; import { captureAndReraiseAsync } from 'src/app/services/decorators/captureAndReraiseAsync'; -import { RoomRemoteDataSourceService } from '../../../data/repository/room/room-remote-repository.service'; import { MemberListRemoteRepository } from '../../../data/repository/member/member-list-remote-repository.service'; import { UserRemoveListInputDTO } from '../room/room-leave-by-id-use-case.service'; diff --git a/src/app/module/chat/domain/use-case/member/member-remove-socket-use-case.service.ts b/src/app/module/chat/domain/use-case/member/member-remove-socket-use-case.service.ts new file mode 100644 index 000000000..354006ac5 --- /dev/null +++ b/src/app/module/chat/domain/use-case/member/member-remove-socket-use-case.service.ts @@ -0,0 +1,36 @@ +import { Injectable } from '@angular/core'; +import { IMemberSocketRepository } from 'src/app/core/chat/repository/member/member-socket-repository'; +import { z } from 'zod'; + +export const RemoveRoomMemberInputSchema = z.object({ + roomId: z.string(), + members: z.number().array() +}) + +export type RemoveRoomMemberInput = z.infer + + + +export const RemoveRoomMemberOutputSchema = z.object({ + userPhoto: z.string().nullable(), + wxFullName: z.string().optional(), + wxUserId: z.number(), + wxeMail: z.string(), +}).array() + +export type IRemoveRoomMemberOutput = z.infer + +@Injectable({ + providedIn: 'root' +}) +export class MemberRemoveSocketUseCaseService { + + constructor( + private socketRepository: IMemberSocketRepository + ) { } + + async execute(input: RemoveRoomMemberInput) { + + return this.socketRepository.removeMember(input) + } +} diff --git a/src/app/module/chat/domain/use-case/message/message-local-get-by-id.service.ts b/src/app/module/chat/domain/use-case/message/message-local-get-by-id.service.ts index 2c00a0cf4..db4219bd1 100644 --- a/src/app/module/chat/domain/use-case/message/message-local-get-by-id.service.ts +++ b/src/app/module/chat/domain/use-case/message/message-local-get-by-id.service.ts @@ -27,7 +27,6 @@ export class MessageLocalGetByIdService { }) } else if(input.roomId) { - console.log('find(') return this.messageLocalRepository.find({roomId: input.roomId}) } else if (input.receiverId) { return this.messageLocalRepository.find({receiverId: parseInt(input.receiverId)}) diff --git a/src/app/ui/chat/component/group-contacts/group-contacts.page.ts b/src/app/ui/chat/component/group-contacts/group-contacts.page.ts index 69f473b18..5aaa76895 100644 --- a/src/app/ui/chat/component/group-contacts/group-contacts.page.ts +++ b/src/app/ui/chat/component/group-contacts/group-contacts.page.ts @@ -187,6 +187,13 @@ export class GroupContactsPage implements OnInit { async deleteMember(user: UserContacts) { this.showLoader = true; + // this.chatServiceService.removeMember({ + // roomId: this.roomId, + // members: [ user.wxUserId] + // }) + + // this.currentMembers = this.currentMembers.filter( e => e.wxUserId != user.wxUserId) + const result = await this.chatServiceService.removeMemberToRoom({ id: this.roomId, members: [ user.wxUserId] diff --git a/src/app/ui/chat/modal/chat-popover/chat-popover.page.html b/src/app/ui/chat/modal/chat-popover/chat-popover.page.html index 1cc2fb633..7401c5f55 100644 --- a/src/app/ui/chat/modal/chat-popover/chat-popover.page.html +++ b/src/app/ui/chat/modal/chat-popover/chat-popover.page.html @@ -19,14 +19,14 @@
- - - + + + - +
- - + + diff --git a/src/app/ui/chat/modal/messages/messages.page.scss b/src/app/ui/chat/modal/messages/messages.page.scss index 510ac30c5..04f08bb89 100644 --- a/src/app/ui/chat/modal/messages/messages.page.scss +++ b/src/app/ui/chat/modal/messages/messages.page.scss @@ -465,6 +465,7 @@ button::-moz-focus-inner { margin: 10px 20px 10px 75px; background: var(--chat-incoming-msg-color); border-radius: 10px; + max-width: 90%; } } diff --git a/version/git-version.ts b/version/git-version.ts index 8ea40cb73..0fbb51494 100644 --- a/version/git-version.ts +++ b/version/git-version.ts @@ -1,11 +1,11 @@ export let versionData = { - "shortSHA": "9c8ecc182", - "SHA": "9c8ecc182fd7f405aec5dbe5d0cbe5e29656ae09", + "shortSHA": "e626883b5", + "SHA": "e626883b5c0bb91a6fe9591eab1bf0b84a7c1d6b", "branch": "feature/chat-new-api-peter", "lastCommitAuthor": "'Peter Maquiran'", - "lastCommitTime": "'Tue Oct 8 13:16:01 2024 +0100'", - "lastCommitMessage": "fix chat", - "lastCommitNumber": "6088", - "changeStatus": "On branch feature/chat-new-api-peter\nYour branch is ahead of 'origin/feature/chat-new-api-peter' by 3 commits.\n (use \"git push\" to publish your local commits)\n\nChanges to be committed:\n (use \"git restore --staged ...\" to unstage)\n\tmodified: src/app/pages/gabinete-digital/despachos-pr/despacho-pr/despacho-pr.page.ts\n\tmodified: src/app/pages/gabinete-digital/despachos/despacho/despacho.page.ts\n\tmodified: src/app/pages/gabinete-digital/diplomas-assinar/diploma-assinar/diploma-assinar.page.ts\n\tmodified: src/app/pages/gabinete-digital/diplomas/diploma/diploma.page.ts\n\tmodified: src/app/ui/chat/chat.page.html\n\tmodified: src/app/ui/chat/store/model/room.ts\n\tnew file: src/assets/icon/icons-audio.png", + "lastCommitTime": "'Wed Oct 9 08:56:34 2024 +0100'", + "lastCommitMessage": "fix audio icon", + "lastCommitNumber": "6089", + "changeStatus": "On branch feature/chat-new-api-peter\nYour branch is ahead of 'origin/feature/chat-new-api-peter' by 4 commits.\n (use \"git push\" to publish your local commits)\n\nChanges to be committed:\n (use \"git restore --staged ...\" to unstage)\n\tmodified: gabinete-digital-fo.code-workspace\n\tnew file: src/app/core/chat/repository/member/member-socket-repository.ts\n\tmodified: src/app/infra/socket/signalR/signalR.ts\n\tmodified: src/app/infra/socket/type.ts\n\tmodified: src/app/module/chat/chat.module.ts\n\tnew file: src/app/module/chat/data/repository/member/member-socket-repository.service.ts\n\tmodified: src/app/module/chat/data/repository/room/room-local-repository.service.ts\n\tmodified: src/app/module/chat/domain/chat-service.service.ts\n\tmodified: src/app/module/chat/domain/use-case/member/-use-case.service.ts\n\tnew file: src/app/module/chat/domain/use-case/member/member-remove-socket-use-case.service.ts\n\tmodified: src/app/module/chat/domain/use-case/message/message-local-get-by-id.service.ts\n\tmodified: src/app/ui/chat/component/group-contacts/group-contacts.page.ts\n\tmodified: src/app/ui/chat/modal/chat-popover/chat-popover.page.html\n\tmodified: src/app/ui/chat/modal/messages/messages.page.scss\n\tmodified: version/git-version.ts", "changeAuthor": "peter.maquiran" } \ No newline at end of file