diff --git a/src/app/core/chat/entity/message.ts b/src/app/core/chat/entity/message.ts index c74aaf2f3..d0490935b 100644 --- a/src/app/core/chat/entity/message.ts +++ b/src/app/core/chat/entity/message.ts @@ -25,11 +25,11 @@ export const MessageEntityAttachmentSchema = z.object({ file: base64Schema.optional(), fileName: z.string().optional(), applicationId: z.number().optional(), - docId: z.string().optional(), - id: z.string().optional(), - mimeType: z.string().optional(), + docId: z.number().optional(), + id: z.string().optional().nullable(), + mimeType: z.string().nullable().optional(), safeFile: z.any().optional(), - description: z.string().nullable().optional() + description: z.string().nullable().optional(), }) export const MessageEntitySchema = z.object({ diff --git a/src/app/core/chat/repository/dto/messageOutputDTO.ts b/src/app/core/chat/repository/dto/messageOutputDTO.ts index cbaa8b21d..abaff3972 100644 --- a/src/app/core/chat/repository/dto/messageOutputDTO.ts +++ b/src/app/core/chat/repository/dto/messageOutputDTO.ts @@ -45,7 +45,7 @@ export const MessageOutPutDataDTOSchema = z.object({ file: z.string().optional(), fileName: z.string().optional(), applicationId: z.number().optional(), - docId: z.string().optional(), + docId: z.number().optional(), id: z.string().optional() })) }); diff --git a/src/app/core/chat/usecase/message/message-get-all-by-room-Id.ts b/src/app/core/chat/usecase/message/message-get-all-by-room-Id.ts index 9e772c5e0..84052e170 100644 --- a/src/app/core/chat/usecase/message/message-get-all-by-room-Id.ts +++ b/src/app/core/chat/usecase/message/message-get-all-by-room-Id.ts @@ -43,7 +43,7 @@ export const MessageGetAllByRoomIdUseCaseOutputSchema = z.object({ file: z.string().optional(), fileName: z.string().optional(), applicationId: z.number().optional(), - docId: z.string().optional(), + docId: z.number().optional(), id: z.string().optional() })) }).array() diff --git a/src/app/infra/database/dexie/instance/chat/schema/attachment.ts b/src/app/infra/database/dexie/instance/chat/schema/attachment.ts index afe432daa..f8e698704 100644 --- a/src/app/infra/database/dexie/instance/chat/schema/attachment.ts +++ b/src/app/infra/database/dexie/instance/chat/schema/attachment.ts @@ -14,8 +14,8 @@ export const AttachmentTableSchema = z.object({ source: z.nativeEnum(MessageAttachmentSource).optional(), fileName: z.string().optional(), applicationId: z.number().optional(), - docId: z.string().optional(), - mimeType: z.string().optional(), + docId: z.number().optional(), + mimeType: z.string().nullable().optional(), id: z.string().uuid().optional(), description: z.string().optional() }) diff --git a/src/app/infra/database/dexie/instance/chat/schema/message.ts b/src/app/infra/database/dexie/instance/chat/schema/message.ts index 817cb5abb..f2bb84edd 100644 --- a/src/app/infra/database/dexie/instance/chat/schema/message.ts +++ b/src/app/infra/database/dexie/instance/chat/schema/message.ts @@ -39,10 +39,10 @@ export const MessageTableSchema = z.object({ source: z.nativeEnum(MessageAttachmentSource), fileName: z.string().optional(), applicationId: z.number().optional(), - docId: z.string().optional(), + docId: z.number().optional(), id: z.string().optional(), description: z.string().nullable().optional(), - mimeType: z.string().optional() + mimeType: z.string().nullable().optional() })).optional(), origin: z.enum(['history', 'local', 'incoming']).optional() }) diff --git a/src/app/infra/database/dexie/instance/chat/schema/room.ts b/src/app/infra/database/dexie/instance/chat/schema/room.ts index 07b78729a..90c9ed896 100644 --- a/src/app/infra/database/dexie/instance/chat/schema/room.ts +++ b/src/app/infra/database/dexie/instance/chat/schema/room.ts @@ -2,6 +2,7 @@ import { z } from "zod"; import { EntityTable } from 'Dexie'; import { RoomType } from "src/app/core/chat/entity/group"; import { MessageEntity, MessageEntitySchema } from "src/app/core/chat/entity/message"; +import { MessageTableSchema } from "./message"; export const RoomTableSchema = z.object({ id: z.string().uuid(), @@ -15,7 +16,7 @@ export const RoomTableSchema = z.object({ createdAt: z.any(), expirationDate: z.any().nullable(), roomType: z.nativeEnum(RoomType), - messages: MessageEntitySchema.array().optional(), + messages: MessageTableSchema.array().optional(), bold: z.number().optional() }) 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 787b9d422..01fa300b4 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 @@ -13,6 +13,20 @@ export class RoomLocalRepository extends DexieRepository i constructor() { super(chatDatabase.room, RoomTableSchema) + // chatDatabase.room.hook('creating', (primaryKey, obj, transaction) => { + // if(obj.messages?.[0].attachments?.[0]) { + // delete obj.messages[0].attachments[0].file + // } + // }); + + // chatDatabase.room.hook('updating', (modifications, primKey, obj, transaction) => { + + // if((modifications as Partial).messages?.[0].attachments?.[0]) { + // delete (modifications as Partial).messages[0].attachments[0].file + // } + + // return modifications + // }); } getItemsLive() { diff --git a/src/app/module/chat/domain/use-case/message/message-create-use-case.service.ts b/src/app/module/chat/domain/use-case/message/message-create-use-case.service.ts index 553df0850..697c1334e 100644 --- a/src/app/module/chat/domain/use-case/message/message-create-use-case.service.ts +++ b/src/app/module/chat/domain/use-case/message/message-create-use-case.service.ts @@ -39,7 +39,7 @@ export const MessageInputDTOSchema = z.object({ fileName: z.string().optional(), applicationId: z.number().optional(), docId: z.number().optional(), - mimeType: z.string().optional(), + mimeType: z.string().nullable().optional(), description: z.string().optional() }).optional() }); @@ -80,7 +80,7 @@ export const MessageCreatePutDataDTOSchema = z.object({ file: z.string().optional(), fileName: z.string().optional(), applicationId: z.number().optional(), - docId: z.string().optional(), + docId: z.number().optional(), id: z.string().optional() })) }); @@ -181,6 +181,8 @@ export class MessageCreateUseCaseService { if(sendMessageResult.isOk()) { + message.id = sendMessageResult.value.id + console.log('sendMessageResult', sendMessageResult.value.id) if(sendMessageResult.value.sender == undefined || sendMessageResult.value.sender == null) { diff --git a/src/app/module/chat/domain/use-case/message/message-delete-by-id-live-use-case.service.ts b/src/app/module/chat/domain/use-case/message/message-delete-by-id-live-use-case.service.ts index 320fb33ba..94c82e4bd 100644 --- a/src/app/module/chat/domain/use-case/message/message-delete-by-id-live-use-case.service.ts +++ b/src/app/module/chat/domain/use-case/message/message-delete-by-id-live-use-case.service.ts @@ -20,7 +20,7 @@ export class MessageDeleteLiveUseCaseService { public repository: MessageSocketRepositoryService ) { } - @XTracerAsync({name:'MessageDeleteLiveUseCaseService', module:'chat', bugPrint: true, waitNThrow: 2000}) + @XTracerAsync({name:'MessageDeleteLiveUseCaseService', module:'chat', bugPrint: true, waitNThrow: 5000}) async execute(data: MessageDeleteInputDTO, tracing?: TracingType) { tracing.log('MessageDeleteLiveUseCaseService payload', { data: data 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 ddd453a34..d5aca34c1 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 @@ -22,8 +22,12 @@ export class RoomSetLastMessageService { this.listenToIncomingMessage() this.listenToOnSendDataToSocket() this.loadHistory() + this.listenToUpdateMessage() + } + private listenToUpdateMessage() {} + private listenToIncomingMessage() { return this.messageSocketRepository.listenToMessages().pipe( filter((message) => !message?.requestId?.startsWith(InstanceId)), // get all message not send by me @@ -46,15 +50,24 @@ export class RoomSetLastMessageService { private listenToOnSendDataToSocket() { this.messageSocketRepository.listenToSendMessage().subscribe(async (e) => { - e.data['sender'] = { + const message = Object.assign(new MessageEntity(), e.data) + + message.sender = { userPhoto: '', wxeMail: SessionStore.user.Email, wxFullName: SessionStore.user.FullName, wxUserId: SessionStore.user.UserId } - e.data['sentAt'] = new Date().toISOString() + 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: [e.data] + messages: [message] }) if(result.isErr()) { @@ -91,7 +104,6 @@ export class RoomSetLastMessageService { const loadHistoryLastMessageDate = new Date(loadHistoryFirstMessage.sentAt).getTime() if(loadHistoryLastMessageDate>localLastMessageDate) { - console.log('update by load history') await this.roomLocalRepository.update(loadHistoryFirstMessage.roomId, { messages: [loadHistoryFirstMessage] }) diff --git a/src/app/module/chat/domain/use-case/socket/socket-message-delete-use-case.service.ts b/src/app/module/chat/domain/use-case/socket/socket-message-delete-use-case.service.ts index 199458566..02a754994 100644 --- a/src/app/module/chat/domain/use-case/socket/socket-message-delete-use-case.service.ts +++ b/src/app/module/chat/domain/use-case/socket/socket-message-delete-use-case.service.ts @@ -39,7 +39,7 @@ export class SocketMessageDeleteUseCaseService { const result = await this.messageLocalDataSourceService.update(input.id, { isDeleted: true}) if(result.isOk()) { - + console.log('deleled', result.value) } else { console.log(result.error) } diff --git a/src/app/ui/chat/chat.page.html b/src/app/ui/chat/chat.page.html index b99f8d61c..29c13c8f8 100644 --- a/src/app/ui/chat/chat.page.html +++ b/src/app/ui/chat/chat.page.html @@ -60,33 +60,58 @@
-
-
- - -
-
- {{room.roomName}} -
-
+ (click)="openMessagesPage(room.id)" class="item-content flex-grow-1 cursor-pointer"> +
+
+ + +
+
+ {{room.roomName}} +
+
-
-
-
- {{ room.displayDate }} -
-
-
- - {{ expirationDate[room.id] !== null ? expirationDate[room.id] + ' seconds left' : '' }} -
-
-
{{room.messages[0].message}}
+ +
+
+ {{ room.displayDate }} +
+
+
+ + {{ expirationDate[room.id] !== null ? expirationDate[room.id] + ' seconds left' : '' }} +
+
+ + + +
{{room.messages[0].message}}
+ + +
+ + + + audio + + + {{ room.messages[0].attachments[0].description }} +
+ + +
+
+
Mensagem foi eliminada
+
+ + -
diff --git a/src/app/ui/chat/component/messages/messages.page.html b/src/app/ui/chat/component/messages/messages.page.html index 54d1a2610..55457e211 100644 --- a/src/app/ui/chat/component/messages/messages.page.html +++ b/src/app/ui/chat/component/messages/messages.page.html @@ -9,7 +9,7 @@
-
Editar Mensagem @@ -18,34 +17,33 @@ - -
-
-
{{ oldMessage }}
-
+
- -
- -
+
+
{{ oldMessage }}
- - - - - - - - - - - - - + + +
+
+ +
+ +
+ +
diff --git a/src/app/ui/chat/modal/edit-message/edit-message.page.scss b/src/app/ui/chat/modal/edit-message/edit-message.page.scss index 749a5adb9..5abb22ff7 100644 --- a/src/app/ui/chat/modal/edit-message/edit-message.page.scss +++ b/src/app/ui/chat/modal/edit-message/edit-message.page.scss @@ -64,14 +64,13 @@ overflow:auto; padding: 0 0 0 0; - + } - .type-message { + .type-message { display: flex; border: 1px solid #ebebeb; border-radius: 25px; - margin: 0 30px 0 30px; align-items: center; overflow: auto; } @@ -88,7 +87,3 @@ display: inline; padding: 10px 20px; } - -:host { - height: 400px; -} \ No newline at end of file diff --git a/src/app/ui/chat/modal/edit-message/edit-message.page.ts b/src/app/ui/chat/modal/edit-message/edit-message.page.ts index 06df4e7fb..c770347aa 100644 --- a/src/app/ui/chat/modal/edit-message/edit-message.page.ts +++ b/src/app/ui/chat/modal/edit-message/edit-message.page.ts @@ -1,5 +1,5 @@ import { Component, OnInit, Input, ViewChild, ElementRef } from '@angular/core'; -import { ModalController } from '@ionic/angular'; +import { ModalController, PopoverController } from '@ionic/angular'; import { ThemeService } from 'src/app/services/theme.service' @Component({ @@ -16,7 +16,7 @@ export class EditMessagePage implements OnInit { oldMessage: string constructor( - private modalController: ModalController, + public popoverController: PopoverController, public ThemeService: ThemeService, ) {} @@ -29,13 +29,11 @@ export class EditMessagePage implements OnInit { } dismiss() { - this.modalController.dismiss(); + this.popoverController.dismiss(); } save() { - // Implement your save logic here - console.log('Updated Message:', this.message); - this.modalController.dismiss({ + this.popoverController.dismiss({ 'message': this.message }); } diff --git a/src/app/ui/chat/modal/messages/messages.page.html b/src/app/ui/chat/modal/messages/messages.page.html index ce8f05938..1112debbc 100644 --- a/src/app/ui/chat/modal/messages/messages.page.html +++ b/src/app/ui/chat/modal/messages/messages.page.html @@ -60,6 +60,13 @@ }" > + +
+ + {{ emoji }} + +
+
@@ -132,7 +139,7 @@
- + @@ -151,12 +158,6 @@
- -
- - {{ emoji }} - -
diff --git a/src/app/ui/chat/modal/messages/messages.page.ts b/src/app/ui/chat/modal/messages/messages.page.ts index 266e2458a..6d01b955b 100644 --- a/src/app/ui/chat/modal/messages/messages.page.ts +++ b/src/app/ui/chat/modal/messages/messages.page.ts @@ -1,4 +1,4 @@ -import { AfterViewInit, Component, ElementRef, OnDestroy, OnInit, ViewChild } from '@angular/core'; +import { AfterViewInit, Component, ElementRef, HostListener, OnDestroy, OnInit, ViewChild } from '@angular/core'; import { GestureController, ModalController, NavParams, PopoverController, Platform } from '@ionic/angular'; import { ViewDocumentPage } from 'src/app/modals/view-document/view-document.page'; import { ExpedientTaskModalPageNavParamsTask } from 'src/app/models/ExpedientTaskModalPage'; @@ -144,7 +144,7 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { isAdmin = true RoomTypeEnum = RoomType IMessageType = IMessageType - + handleClickActive = true constructor( public popoverController: PopoverController, @@ -219,6 +219,17 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { this.chatServiceService.getRoomById(this.roomId) } + @HostListener('document:click', ['$event']) + handleClickOutside(event: Event) { + if (!this.handleClickActive) return; + + const clickedInside = (event.target as HTMLElement).closest('.mat-menu-content'); + if (!clickedInside) { + this.selectedMessage = null; + } + } + + async getMessages() { @@ -660,6 +671,7 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { ngOnDestroy() { window.removeEventListener('scroll', this.scrollChangeCallback, true); + this.handleClickActive = false; // Disable the listener before component destruction } async sendMessage() { @@ -901,7 +913,7 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { this.messages1[this.roomId].splice(index, 1); } } - + async takePictureMobile() { @@ -1131,7 +1143,8 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { file: result.value.files[0].data, fileName: result.value.files[0].name, source: MessageAttachmentSource.Device, - fileType: MessageAttachmentFileType.Doc + fileType: MessageAttachmentFileType.Doc, + description: result.value.files[0].name }] this.messages1[this.roomId].push(message) @@ -1425,9 +1438,9 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { async editMessage(message: any) { - const modal = await this.modalController.create({ + const modal = await this.popoverController.create({ component: EditMessagePage, - cssClass: '', + cssClass: 'edit-message', componentProps: { message: message.message, roomId: this.roomId, @@ -1448,11 +1461,11 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { }); } - toggleEmojiPicker(message: any) { + toggleEmojiPicker(message: MessageViewModal) { if (this.selectedMessage === message) { this.selectedMessage = null; // Close the picker if it's already open } else { - this.selectedMessage = message; // Open the picker for the selected message + this.selectedMessage = message; // Open the picker for the selected message } } diff --git a/src/app/ui/chat/store/model/room.ts b/src/app/ui/chat/store/model/room.ts index 8cc3f8c24..d397a59ba 100644 --- a/src/app/ui/chat/store/model/room.ts +++ b/src/app/ui/chat/store/model/room.ts @@ -1,4 +1,5 @@ import { IRoom, RoomEntitySchema } from "src/app/core/chat/entity/group"; +import { isDocument } from "src/app/utils/document-mimetype"; export class RoomViewModel implements IRoom { @@ -11,10 +12,19 @@ export class RoomViewModel implements IRoom { members: typeof RoomEntitySchema._input.members messages: typeof RoomEntitySchema._input.messages displayDate = '' + lastMessageImage = false + lastMessageDocument = false constructor(model: IRoom) { Object.assign(this, model) this.formatarData() + + if(this.messages?.[0]?.attachments[0]?.mimeType?.startsWith('image/') ) { + this.lastMessageImage = true + } else if (this.messages?.[0]?.attachments[0]?.mimeType && isDocument({mimeType: this.messages?.[0]?.attachments[0]?.mimeType})) { + this.lastMessageDocument = true + } + } formatarData() { @@ -53,8 +63,8 @@ export class RoomViewModel implements IRoom { // Se a mensagem foi enviada antes desta semana this.displayDate = dataMensagem.toLocaleDateString("pt-BR"); // Formato: DD/MM/AAAA return - } - } + + } diff --git a/src/app/utils/document-mimetype.ts b/src/app/utils/document-mimetype.ts new file mode 100644 index 000000000..27c1c0794 --- /dev/null +++ b/src/app/utils/document-mimetype.ts @@ -0,0 +1,14 @@ +export function isDocument({mimeType}) { + const documentMimeTypes = [ + 'application/pdf', + 'application/msword', + 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + 'application/vnd.ms-excel', + 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + 'application/vnd.ms-powerpoint', + 'application/vnd.openxmlformats-officedocument.presentationml.presentation', + 'text/plain' + ]; + + return documentMimeTypes.includes(mimeType); +} diff --git a/src/style/ios.scss b/src/style/ios.scss index c147f33e5..f521f18a3 100644 --- a/src/style/ios.scss +++ b/src/style/ios.scss @@ -229,3 +229,18 @@ ion-toolbar { .header-fix { padding-top: var(--ion-safe-area-top); } + +.edit-message::part(content) { + width: 600px !important; + height: auto !important; + // left: unset !important; + // right: unset !important; + // top: unset !important; +} + +/* Media query for mobile view */ +@media (max-width: 768px) { /* Adjust the max-width as per your mobile breakpoints */ + .edit-message::part(content) { + width: 360px !important; /* Set width to 300px for mobile screens */ + } +}