From 09a8693ea9a2cc0e4ee338d545c3ebc47f89a24e Mon Sep 17 00:00:00 2001 From: Peter Maquiran Date: Thu, 22 Aug 2024 12:27:57 +0100 Subject: [PATCH] direct message --- .../room/room-socket-repository.service.ts | 2 +- src/app/module/chat/domain/entity/message.ts | 14 +- .../message-read-at-by-id-use-case.service.ts | 5 +- .../use-case/socket-join-use-case.service.ts | 5 +- .../chat/infra/socket/signal-r.service.ts | 53 +++----- src/app/module/chat/infra/socket/signalR.ts | 128 ++---------------- src/app/module/chat/tsconfig.json | 10 ++ src/app/ui/chat/chat-routing.module.ts | 4 + .../component/messages/messages.module.ts | 2 + .../component/messages/messages.page.html | 21 ++- .../component/messages/messages.page.scss | 8 ++ .../chat/component/messages/messages.page.ts | 61 ++++++++- .../set-room-owner/set-room-owner.page.ts | 6 +- .../view-onces/view-onces-routing.module.ts | 17 +++ .../modal/view-onces/view-onces.module.ts | 20 +++ .../modal/view-onces/view-onces.page.html | 16 +++ .../modal/view-onces/view-onces.page.scss | 0 .../modal/view-onces/view-onces.page.spec.ts | 24 ++++ .../chat/modal/view-onces/view-onces.page.ts | 40 ++++++ src/app/ui/chat/store/model/message.ts | 12 +- src/app/utils/zodValidation.ts | 2 +- 21 files changed, 278 insertions(+), 172 deletions(-) create mode 100644 src/app/module/chat/tsconfig.json create mode 100644 src/app/ui/chat/modal/view-onces/view-onces-routing.module.ts create mode 100644 src/app/ui/chat/modal/view-onces/view-onces.module.ts create mode 100644 src/app/ui/chat/modal/view-onces/view-onces.page.html create mode 100644 src/app/ui/chat/modal/view-onces/view-onces.page.scss create mode 100644 src/app/ui/chat/modal/view-onces/view-onces.page.spec.ts create mode 100644 src/app/ui/chat/modal/view-onces/view-onces.page.ts diff --git a/src/app/module/chat/data/repository/room/room-socket-repository.service.ts b/src/app/module/chat/data/repository/room/room-socket-repository.service.ts index 4f217d85a..4c30f1264 100644 --- a/src/app/module/chat/data/repository/room/room-socket-repository.service.ts +++ b/src/app/module/chat/data/repository/room/room-socket-repository.service.ts @@ -21,7 +21,7 @@ export class RoomSocketRepositoryService { listenToCreateRoom() { return this.socket.getData().pipe( - filter((data) => data.method == 'UserAddGroup') + filter((data) => data?.method == 'UserAddGroup') ) } diff --git a/src/app/module/chat/domain/entity/message.ts b/src/app/module/chat/domain/entity/message.ts index bc8280ac4..103b51b89 100644 --- a/src/app/module/chat/domain/entity/message.ts +++ b/src/app/module/chat/domain/entity/message.ts @@ -41,24 +41,24 @@ export const MessageEntitySchema = z.object({ type Message = z.infer; -export class MessageEntity implements Message { +export class MessageEntity { - $id: number - id: string + $id?: number + id?: string roomId?: string receiverId?: number - message: string + message?: string messageType: number = 0 canEdit: boolean = false oneShot: boolean = false - sentAt: string + sentAt?: string requireUnlock: boolean = false info: { memberId?: number readAt?: string, deliverAt?: string }[] = [] - sender: { + sender!: { wxUserId: number, wxFullName: string, wxeMail: string, @@ -82,7 +82,7 @@ export class MessageEntity implements Message { reactions = [] - requestId: string + requestId!: string constructor() {} diff --git a/src/app/module/chat/domain/use-case/message-read-at-by-id-use-case.service.ts b/src/app/module/chat/domain/use-case/message-read-at-by-id-use-case.service.ts index c208bd4a0..7976e969d 100644 --- a/src/app/module/chat/domain/use-case/message-read-at-by-id-use-case.service.ts +++ b/src/app/module/chat/domain/use-case/message-read-at-by-id-use-case.service.ts @@ -2,6 +2,7 @@ import { Injectable } from '@angular/core'; import { err, ok } from 'neverthrow'; import { SessionStore } from 'src/app/store/session.service'; import { MessageLocalDataSourceService } from '../../data/repository/message/message-local-data-source.service'; +import { MessageSocketRepositoryService } from '../../data/repository/message/message-live-signalr-data-source.service'; import { MessageRemoteDataSourceService } from '../../data/repository/message/message-remote-data-source.service'; import { SignalRService } from '../../infra/socket/signal-r.service'; @@ -11,7 +12,7 @@ import { SignalRService } from '../../infra/socket/signal-r.service'; export class MessageReadAtByIdUseCaseService { constructor( - private messageRemoteDataSourceService: MessageRemoteDataSourceService, + private MessageSocketRepositoryService: MessageSocketRepositoryService, private messageLiveSignalRDataSourceService: SignalRService, private messageLocalDataSourceService: MessageLocalDataSourceService, ) { } @@ -21,7 +22,7 @@ export class MessageReadAtByIdUseCaseService { if(result.isOk()) { if(result.value) { - return await this.messageLiveSignalRDataSourceService.sendReadAt({roomId, memberId: SessionStore.user.UserId, chatMessageId: result.value.id}) + return await this.MessageSocketRepositoryService.sendReadAt({roomId, memberId: SessionStore.user.UserId, messageId: result.value.id, requestId: ''}) } return ok(true) } diff --git a/src/app/module/chat/domain/use-case/socket-join-use-case.service.ts b/src/app/module/chat/domain/use-case/socket-join-use-case.service.ts index 6af5ddd29..32accb991 100644 --- a/src/app/module/chat/domain/use-case/socket-join-use-case.service.ts +++ b/src/app/module/chat/domain/use-case/socket-join-use-case.service.ts @@ -12,5 +12,8 @@ export class SocketJoinUseCaseService { ) { } - execute() {} + execute() { + + this.MessageSocketRepositoryService.sendDirectMessage + } } diff --git a/src/app/module/chat/infra/socket/signal-r.service.ts b/src/app/module/chat/infra/socket/signal-r.service.ts index 310b77c14..f7342d068 100644 --- a/src/app/module/chat/infra/socket/signal-r.service.ts +++ b/src/app/module/chat/infra/socket/signal-r.service.ts @@ -1,13 +1,13 @@ import { Injectable } from '@angular/core'; import { BehaviorSubject, Observable, Subject, timer } from 'rxjs'; import { Platform } from '@ionic/angular'; -import { SignalRConnection } from './signalR'; +import { SignalRConnection, SocketMessage } from './signalR'; import { Plugins } from '@capacitor/core'; import { UserTypingDTO } from '../../data/dto/typing/typingInputDTO'; import { MessageOutPutDataDTO } from '../../data/dto/message/messageOutputDTO'; import { MessageDeleteInputDTO } from '../../data/dto/message/messageDeleteInputDTO'; import { z } from 'zod'; -import { switchMap } from 'rxjs/operators'; +import { filter, map, switchMap } from 'rxjs/operators'; import { Result } from 'neverthrow'; import { HubConnection } from '@microsoft/signalr'; @@ -28,11 +28,7 @@ export type ISignalRInput = z.infer; }) export class SignalRService { private connection: SignalRConnection; - private messageSubject: BehaviorSubject = new BehaviorSubject(null); - private typingSubject: BehaviorSubject = new BehaviorSubject(null); private connectingSubject: BehaviorSubject = new BehaviorSubject(null); - private messageDelete: BehaviorSubject = new BehaviorSubject(null); - private messageUpdateSubject: BehaviorSubject = new BehaviorSubject(null); private sendDataSubject: BehaviorSubject<{method: string, data: any}> = new BehaviorSubject<{method: string, data: any}>(null); private deadConnectionBackGround: Subject; @@ -80,24 +76,6 @@ export class SignalRService { this.connection?.closeConnection() this.connection = connection - this.connection.getSendLater().subscribe(data => { - - }) - - this.connection.getMessages().subscribe((data) => { - this.messageSubject.next(data) - }) - this.connection.getTyping().subscribe((data) => { - this.typingSubject.next(data) - }) - - this.connection.getMessageDelete().subscribe((data) => { - this.messageDelete.next(data) - }) - - this.connection.getMessageUpdateSubject().subscribe((data) => { - this.messageUpdateSubject.next(data) - }) this.connection.getData().subscribe((data) => { this.sendDataSubject.next(data) @@ -123,20 +101,36 @@ export class SignalRService { getMessage() { - return this.messageSubject.asObservable() + return this.getData().pipe( + filter((e) : e is SocketMessage=> e?.method == 'ReceiveMessage' + ), + map((e)=> e.data) + ) } getTyping() { - return this.typingSubject.asObservable().pipe() + return this.getData().pipe( + filter((e) : e is SocketMessage=> e?.method == 'TypingMessage' + ), + map((e)=> e.data) + ) } getMessageDelete() { - return this.messageDelete.asObservable() + return this.getData().pipe( + filter((e) : e is SocketMessage=> e?.method == 'DeleteMessage' + ), + map((e)=> e.data) + ) } getMessageUpdate() { - return this.messageUpdateSubject.asObservable() + return this.getData().pipe( + filter((e) : e is SocketMessage=> e?.method == 'UpdateMessage' + ), + map((e)=> e.data) + ) } sendData(input: ISignalRInput) { @@ -159,9 +153,6 @@ export class SignalRService { } - async sendReadAt({ roomId, memberId, chatMessageId}) { - return await this.connection.sendReadAt({ roomId, memberId, chatMessageId}) - } } diff --git a/src/app/module/chat/infra/socket/signalR.ts b/src/app/module/chat/infra/socket/signalR.ts index a6be6322c..6f1676de2 100644 --- a/src/app/module/chat/infra/socket/signalR.ts +++ b/src/app/module/chat/infra/socket/signalR.ts @@ -20,10 +20,6 @@ export class SignalRConnection { private hubConnection: signalR.HubConnection; private messageSubject: BehaviorSubject = new BehaviorSubject(null); - private messageDelete: BehaviorSubject = new BehaviorSubject(null); - private messageUPdateSubject: BehaviorSubject = new BehaviorSubject(null); - private typingSubject: BehaviorSubject = new BehaviorSubject(null); - private readAtSubject: BehaviorSubject = new BehaviorSubject(null); private connectionStateSubject: BehaviorSubject = new BehaviorSubject(false); private disconnectSubject: BehaviorSubject = new BehaviorSubject(false); private reconnectSubject: BehaviorSubject = new BehaviorSubject(false); @@ -111,36 +107,6 @@ export class SignalRConnection { } - public async sendReadAt(data: Object & { roomId, memberId, chatMessageId}):Promise> { - return new Promise((resolve, reject) => { - - const requestId = uuidv4() - if(this.connectionStateSubject.value == true) { - - try { - this.hubConnection.invoke("ReadAt", { roomId: data.roomId, memberId: data.memberId, requestId, messageId: data.chatMessageId} as any) - - } catch (error) {} - - this.readAtSubject.pipe( - filter((message: any) => { - return requestId == message?.requestId - }), - first() - ).subscribe(value => { - resolve(ok(value)); - }); - - } else { - this.sendLaterSubject.next({method: 'SendMessage', args: data}) - return reject(err(false)) - } - - - }) - } - - sendData(input: ISignalRInput): Promise> { return new Promise((resolve, reject) => { @@ -165,88 +131,26 @@ export class SignalRConnection { } private addMessageListener(): void { - console.log('listening') - this.hubConnection.on('ReceiveMessage', (message: MessageOutPutDataDTO) => { - console.log('ReceiveMessage', message) - this.messageSubject.next(message); - this.sendDataSubject.next({ - method: 'ReceiveMessage', - data: message - }) - }); + + const methods = ['ReceiveMessage', 'TypingMessage', 'AvailableUsers', + 'ReadAt', 'DeleteMessage', 'UpdateMessage', 'GroupAddedMembers', + 'GroupDeletedMembers'] - this.hubConnection.on('TypingMessage', (_typing: UserTypingDTO) => { - this.typingSubject.next(_typing); - this.sendDataSubject.next({ - method: 'ReceiveMessage', - data: _typing - }) - }); - - this.hubConnection.on('AvailableUsers', (data: any) => { - this.typingSubject.next(data); - this.sendDataSubject.next({ - method: 'AvailableUsers', - data: data - }) - }); - - this.hubConnection.on('ReadAt', (_message) => { - console.log('ReadAt', _message) - this.readAtSubject.next(_message); - this.sendDataSubject.next({ - method: 'ReceiveMessage', - data: _message - }) - }); - - this.hubConnection.on('DeleteMessage', (_message) => { - console.log('DeleteMessage', _message) - this.messageDelete.next(_message); - this.sendDataSubject.next({ - method: 'DeleteMessage', - data: _message - }) - }); - - this.hubConnection.on('UpdateMessage', (_message) => { - console.log('UpdateMessage', _message) - this.messageUPdateSubject.next(_message); - this.sendDataSubject.next({ - method: 'ReceiveMessage', - data: _message - }) - }) - - - this.hubConnection.on('GroupAddedMembers', (_message) => { - console.log('GroupAddedMembers', _message) - this.sendDataSubject.next({ - method: 'GroupAddedMembers', - data: _message - }) - }) - - this.hubConnection.on('GroupDeletedMembers', (_message) => { - console.log('GroupDeletedMembers', _message) - this.sendDataSubject.next({ - method: 'GroupDeletedMembers', - data: _message - }) - }) - } - - public getMessageUpdateSubject() { - return this.messageUPdateSubject.asObservable() + for(const method of methods) { + this.hubConnection.on(method, (message: MessageOutPutDataDTO) => { + this.messageSubject.next(message); + this.sendDataSubject.next({ + method: method, + data: message + }) + }); + } } public getMessages() { return this.messageSubject.asObservable() } - public getTyping() { - return this.typingSubject.asObservable() - } public getConnectionState(): Observable { return this.connectionStateSubject.asObservable(); @@ -256,13 +160,7 @@ export class SignalRConnection { return this.disconnectSubject.asObservable(); } - public getSendLater() { - return this.sendLaterSubject.asObservable(); - } - public getMessageDelete() { - return this.messageDelete.asObservable() - } public getData() { return this.sendDataSubject.asObservable() diff --git a/src/app/module/chat/tsconfig.json b/src/app/module/chat/tsconfig.json new file mode 100644 index 000000000..f36dbb47c --- /dev/null +++ b/src/app/module/chat/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "strict": true, + "target": "ES2020", + "module": "CommonJS" + }, + "include": [ + "./**/*.ts" // Include all TypeScript files in the current directory and subdirectories + ] +} \ No newline at end of file diff --git a/src/app/ui/chat/chat-routing.module.ts b/src/app/ui/chat/chat-routing.module.ts index b00a5ab28..cdf0356e4 100644 --- a/src/app/ui/chat/chat-routing.module.ts +++ b/src/app/ui/chat/chat-routing.module.ts @@ -56,6 +56,10 @@ const routes: Routes = [ path: 'contacts', loadChildren: () => import('./component/contacts/contacts.module').then( m => m.ContactsPageModule) }, + { + path: 'view-onces', + loadChildren: () => import('./modal/view-onces/view-onces.module').then( m => m.ViewOncesPageModule) + }, ]; @NgModule({ diff --git a/src/app/ui/chat/component/messages/messages.module.ts b/src/app/ui/chat/component/messages/messages.module.ts index 6cec6a4e2..f7d6b2d09 100644 --- a/src/app/ui/chat/component/messages/messages.module.ts +++ b/src/app/ui/chat/component/messages/messages.module.ts @@ -14,6 +14,7 @@ import {MatMenuModule} from '@angular/material/menu'; import { LettersAvatarModule } from "ngx-letters-avatar"; import { PipesModule } from 'src/app/pipes/pipes.module'; import { SafehtmlPipe } from 'src/app/pipes/safehtml.pipe'; +import { ScrollingModule } from '@angular/cdk/scrolling'; @NgModule({ imports: [ @@ -26,6 +27,7 @@ import { SafehtmlPipe } from 'src/app/pipes/safehtml.pipe'; MatMenuModule, LettersAvatarModule, PipesModule, + ScrollingModule, ], exports: [MessagesPage], declarations: [MessagesPage] diff --git a/src/app/ui/chat/component/messages/messages.page.html b/src/app/ui/chat/component/messages/messages.page.html index ee9f72142..be438a18b 100644 --- a/src/app/ui/chat/component/messages/messages.page.html +++ b/src/app/ui/chat/component/messages/messages.page.html @@ -45,7 +45,7 @@
@@ -67,13 +67,28 @@
+ + (error)="onImageError()" + > + +
+ Mandou uma mensagen com visualização única
+ + +
+
+ Abrir a visualização única +
+
+ +
+
diff --git a/src/app/ui/chat/component/messages/messages.page.scss b/src/app/ui/chat/component/messages/messages.page.scss index 89211ae48..08085f02f 100644 --- a/src/app/ui/chat/component/messages/messages.page.scss +++ b/src/app/ui/chat/component/messages/messages.page.scss @@ -487,3 +487,11 @@ ion-footer { .modal button { margin-top: 10px; } + + +.view-file { + span {} + + img {} + +} \ No newline at end of file diff --git a/src/app/ui/chat/component/messages/messages.page.ts b/src/app/ui/chat/component/messages/messages.page.ts index 25a6fc9d5..772273f5b 100644 --- a/src/app/ui/chat/component/messages/messages.page.ts +++ b/src/app/ui/chat/component/messages/messages.page.ts @@ -47,7 +47,8 @@ import { RoomType } from "src/app/module/chat/domain/entity/group"; import { RoomTable } from 'src/app/module/chat/infra/database/dexie/schema/room'; import { Logger } from 'src/app/services/logger/main/service'; import { tap } from 'rxjs/operators'; - +import { AlertController } from '@ionic/angular'; +import { ViewOncesImagePage, ViewOncesImagePageInput } from '../../modal/view-onces/view-onces.page'; @Component({ selector: 'app-messages', @@ -99,7 +100,7 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy duration = 0; audioPermissionStatus: 'granted' | 'denied' | 'prompt' | null = null - sessionStore = SessionStore + SessionStore = SessionStore audioPlay: Howl = null; isPlaying = false; audioProgress = 0; @@ -168,6 +169,7 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy private userTypingLocalRepository: UserTypingLocalRepository, private UserTypingRemoteRepositoryService: UserTypingRemoteRepositoryService, private messageLocalDataSourceService: MessageLocalDataSourceService, + private alertController: AlertController ) { // update this.checkAudioPermission() @@ -279,6 +281,22 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy async onImageError() {} + async viewOnce(event: Event, message: MessageEntity, index:number) { + const params: ViewOncesImagePageInput = { + imageDataUrl: message.attachments[index].safeFile as any, + } + const modal = await this.modalController.create({ + component: ViewOncesImagePage, + cssClass: '', + componentProps: params + }); + + modal.present() + + return modal.onDidDismiss().then((res) => { + this.messageDelete(message) + }); + } sendReadMessage() { @@ -828,6 +846,8 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy async takePictureMobile() { + const oneShot = await this.askIfOneShot() + const picture = await this.CameraService.takePicture({ cameraResultType: CameraResultType.DataUrl, quality: 90 @@ -847,6 +867,7 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy const message = new MessageEntity(); message.roomId = this.roomId + message.oneShot = oneShot message.sender = { userPhoto: '', @@ -934,8 +955,43 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy await modal.present(); } + + + askIfOneShot(): Promise { + return new Promise(async (resolve, reject) => { + const alert = await this.alertController.create({ + header: 'Confirm', + message: 'Visualização unica?', + buttons: [ + { + text: 'não', + role: 'cancel', + handler: () => { + resolve(false) + console.log('User clicked No'); + // Handle No action here + } + }, + { + text: 'Sim', + handler: () => { + console.log('User clicked Yes'); + resolve(true) + // Handle Yes action here + } + } + ] + }); + + + await alert.present(); + }) + } + async pickPicture() { + const oneShot = await this.askIfOneShot() + const file = await this.FilePickerService.getPicture({ cameraResultType: CameraResultType.Base64 }) @@ -958,6 +1014,7 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy message.roomId = this.roomId message.sentAt = new Date().toISOString() + message.oneShot = oneShot message.sender = { userPhoto: '', diff --git a/src/app/ui/chat/modal/set-room-owner/set-room-owner.page.ts b/src/app/ui/chat/modal/set-room-owner/set-room-owner.page.ts index 9b93b2441..c2fe7c174 100644 --- a/src/app/ui/chat/modal/set-room-owner/set-room-owner.page.ts +++ b/src/app/ui/chat/modal/set-room-owner/set-room-owner.page.ts @@ -19,7 +19,7 @@ export class SetRoomOwnerPage implements OnInit { textSearch:string = ""; roomId:any; members:any; - roomMembers$: DexieObservable + roomMembers$!: DexieObservable constructor( private modalController: ModalController, @@ -42,11 +42,11 @@ export class SetRoomOwnerPage implements OnInit { this.modalController.dismiss(); } - onChange(event) { + onChange(event: any) { this.textSearch = event.detail.value; } - separateLetter(record:MemberTable, recordIndex, records:MemberTable[]) { + separateLetter(record:MemberTable, recordIndex: number, records:MemberTable[]) { if(recordIndex == 0){ return record.wxFullName[0]; } diff --git a/src/app/ui/chat/modal/view-onces/view-onces-routing.module.ts b/src/app/ui/chat/modal/view-onces/view-onces-routing.module.ts new file mode 100644 index 000000000..fb1fad422 --- /dev/null +++ b/src/app/ui/chat/modal/view-onces/view-onces-routing.module.ts @@ -0,0 +1,17 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; + +import { ViewOncesImagePage } from './view-onces.page'; + +const routes: Routes = [ + { + path: '', + component: ViewOncesImagePage + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class ViewOncesPageRoutingModule {} diff --git a/src/app/ui/chat/modal/view-onces/view-onces.module.ts b/src/app/ui/chat/modal/view-onces/view-onces.module.ts new file mode 100644 index 000000000..ecbdf9531 --- /dev/null +++ b/src/app/ui/chat/modal/view-onces/view-onces.module.ts @@ -0,0 +1,20 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import { IonicModule } from '@ionic/angular'; + +import { ViewOncesPageRoutingModule } from './view-onces-routing.module'; + +import { ViewOncesImagePage } from './view-onces.page'; + +@NgModule({ + imports: [ + CommonModule, + FormsModule, + IonicModule, + ViewOncesPageRoutingModule + ], + declarations: [ViewOncesImagePage] +}) +export class ViewOncesPageModule {} diff --git a/src/app/ui/chat/modal/view-onces/view-onces.page.html b/src/app/ui/chat/modal/view-onces/view-onces.page.html new file mode 100644 index 000000000..a336e8e1d --- /dev/null +++ b/src/app/ui/chat/modal/view-onces/view-onces.page.html @@ -0,0 +1,16 @@ + + + Vizualização única + + + + + + + + + +
+ +
+
diff --git a/src/app/ui/chat/modal/view-onces/view-onces.page.scss b/src/app/ui/chat/modal/view-onces/view-onces.page.scss new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/ui/chat/modal/view-onces/view-onces.page.spec.ts b/src/app/ui/chat/modal/view-onces/view-onces.page.spec.ts new file mode 100644 index 000000000..e58600e4b --- /dev/null +++ b/src/app/ui/chat/modal/view-onces/view-onces.page.spec.ts @@ -0,0 +1,24 @@ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { IonicModule } from '@ionic/angular'; + +import { ViewOncesPage } from './view-onces.page'; + +describe('ViewOncesPage', () => { + let component: ViewOncesPage; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ ViewOncesPage ], + imports: [IonicModule.forRoot()] + }).compileComponents(); + + fixture = TestBed.createComponent(ViewOncesPage); + component = fixture.componentInstance; + fixture.detectChanges(); + })); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/ui/chat/modal/view-onces/view-onces.page.ts b/src/app/ui/chat/modal/view-onces/view-onces.page.ts new file mode 100644 index 000000000..eb0d6d3a0 --- /dev/null +++ b/src/app/ui/chat/modal/view-onces/view-onces.page.ts @@ -0,0 +1,40 @@ +import { Component, OnInit } from '@angular/core'; +import { NavParams, ModalController } from '@ionic/angular'; +import { z } from 'zod'; + + +const ViewOncesImagePageInputSchema = z.object({ + // messageId: z.string(), + // attachmentIndex: z.number(), + imageDataUrl: z.string() +}) + +export type ViewOncesImagePageInput = z.infer + +@Component({ + selector: 'app-view-onces', + templateUrl: './view-onces.page.html', + styleUrls: ['./view-onces.page.scss'], +}) +export class ViewOncesImagePage implements OnInit { + + params: ViewOncesImagePageInput + + constructor( + private navParams: NavParams, + public modalController: ModalController, + ) { + this.params = this.navParams.data + } + + ngOnInit() { + + // console.log('niceddd') + // this.message = this.navParams.get('message'); + // console.log('this.message', this.message) + } + + closePage() { + this.modalController.dismiss({}) + } +} diff --git a/src/app/ui/chat/store/model/message.ts b/src/app/ui/chat/store/model/message.ts index b5157c518..32c335981 100644 --- a/src/app/ui/chat/store/model/message.ts +++ b/src/app/ui/chat/store/model/message.ts @@ -3,22 +3,22 @@ import { MessageAttachmentFileType, MessageAttachmentSource } from "src/app/modu import { MessageEntity } from "src/app/module/chat/domain/entity/message"; export class MessageViewModal { - $id: number - id: string + $id!: number + id!: string roomId?: string receiverId?: number - message: string + message!: string messageType: number = 0 canEdit: boolean = false oneShot: boolean = false - sentAt: string + sentAt!: string requireUnlock: boolean = false info: { memberId?: number readAt?: string, deliverAt?: string }[] = [] - sender: { + sender!: { wxUserId: number, wxFullName: string, wxeMail: string, @@ -41,7 +41,7 @@ export class MessageViewModal { }[] = [] reactions = [] - requestId: string + requestId!: string status = '' constructor(model: MessageEntity) { diff --git a/src/app/utils/zodValidation.ts b/src/app/utils/zodValidation.ts index 1188360f3..bd36275bc 100644 --- a/src/app/utils/zodValidation.ts +++ b/src/app/utils/zodValidation.ts @@ -1,6 +1,6 @@ import { err, ok } from 'neverthrow'; import { ZodError, ZodSchema, z } from 'zod'; -export function zodSafeValidation(schema: ZodSchema, data) { +export function zodSafeValidation(schema: ZodSchema, data: unknown) { const validation = (schema as ZodSchema).safeParse(data) if(validation.success) {