diff --git a/android/app/google-services.json b/android/app/google-services.json deleted file mode 100644 index 0a455bcff..000000000 --- a/android/app/google-services.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "project_info": { - "project_number": "800733765231", - "firebase_url": "https://gabinete-digital-2020.firebaseio.com", - "project_id": "gabinete-digital-2020", - "storage_bucket": "gabinete-digital-2020.appspot.com" - }, - "client": [ - { - "client_info": { - "mobilesdk_app_id": "1:800733765231:android:e7ffc0b310037d9f13779a", - "android_client_info": { - "package_name": "com.gpr.gabinetedigital" - } - }, - "oauth_client": [ - { - "client_id": "800733765231-92oa7ib62ob0pkouphb5i5sp01vkalid.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyD0pfW45DLoW6mqvZRklJdbfSTskW22Fok" - } - ], - "services": { - "appinvite_service": { - "other_platform_oauth_client": [ - { - "client_id": "800733765231-92oa7ib62ob0pkouphb5i5sp01vkalid.apps.googleusercontent.com", - "client_type": 3 - } - ] - } - } - } - ], - "configuration_version": "1" -} \ No newline at end of file diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index 8e8816e52..000000000 --- a/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/android/app/src/main/res/drawable-land-hdpi/splash.png b/android/app/src/main/res/drawable-land-hdpi/splash.png deleted file mode 100644 index a105429d0..000000000 Binary files a/android/app/src/main/res/drawable-land-hdpi/splash.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-land-ldpi/splash.png b/android/app/src/main/res/drawable-land-ldpi/splash.png deleted file mode 100644 index 8c2997fd8..000000000 Binary files a/android/app/src/main/res/drawable-land-ldpi/splash.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-land-mdpi/splash.png b/android/app/src/main/res/drawable-land-mdpi/splash.png deleted file mode 100644 index fd8d26789..000000000 Binary files a/android/app/src/main/res/drawable-land-mdpi/splash.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-land-xhdpi/splash.png b/android/app/src/main/res/drawable-land-xhdpi/splash.png deleted file mode 100644 index c3f403ace..000000000 Binary files a/android/app/src/main/res/drawable-land-xhdpi/splash.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-land-xxhdpi/splash.png b/android/app/src/main/res/drawable-land-xxhdpi/splash.png deleted file mode 100644 index d408970a1..000000000 Binary files a/android/app/src/main/res/drawable-land-xxhdpi/splash.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-land-xxxhdpi/splash.png b/android/app/src/main/res/drawable-land-xxxhdpi/splash.png deleted file mode 100644 index 92dfe6789..000000000 Binary files a/android/app/src/main/res/drawable-land-xxxhdpi/splash.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-port-hdpi/splash.png b/android/app/src/main/res/drawable-port-hdpi/splash.png deleted file mode 100644 index bcf2c145d..000000000 Binary files a/android/app/src/main/res/drawable-port-hdpi/splash.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-port-ldpi/splash.png b/android/app/src/main/res/drawable-port-ldpi/splash.png deleted file mode 100644 index 343fc73b6..000000000 Binary files a/android/app/src/main/res/drawable-port-ldpi/splash.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-port-mdpi/splash.png b/android/app/src/main/res/drawable-port-mdpi/splash.png deleted file mode 100644 index f1e215eb3..000000000 Binary files a/android/app/src/main/res/drawable-port-mdpi/splash.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-port-xhdpi/splash.png b/android/app/src/main/res/drawable-port-xhdpi/splash.png deleted file mode 100644 index 6294ba453..000000000 Binary files a/android/app/src/main/res/drawable-port-xhdpi/splash.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-port-xxhdpi/splash.png b/android/app/src/main/res/drawable-port-xxhdpi/splash.png deleted file mode 100644 index 172eaf57e..000000000 Binary files a/android/app/src/main/res/drawable-port-xxhdpi/splash.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-port-xxxhdpi/splash.png b/android/app/src/main/res/drawable-port-xxxhdpi/splash.png deleted file mode 100644 index cccd3bdfe..000000000 Binary files a/android/app/src/main/res/drawable-port-xxxhdpi/splash.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index ddb26ad77..000000000 --- a/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - diff --git a/android/app/src/main/res/drawable/ic_launcher_background.xml b/android/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 3a37cf6d0..000000000 --- a/android/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/android/app/src/main/res/drawable/splash.png b/android/app/src/main/res/drawable/splash.png deleted file mode 100644 index f7a64923e..000000000 Binary files a/android/app/src/main/res/drawable/splash.png and /dev/null differ diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100644 index 67820c56d..000000000 --- a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml deleted file mode 100644 index 67820c56d..000000000 --- a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index 15eaf4714..000000000 Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png deleted file mode 100644 index d4f266cb4..000000000 Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png deleted file mode 100644 index a7f8349ab..000000000 Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png and /dev/null differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index b33700dc4..000000000 Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png deleted file mode 100644 index fb3f61a63..000000000 Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png deleted file mode 100644 index 479ef13f4..000000000 Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png and /dev/null differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 69befbc66..000000000 Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png deleted file mode 100644 index 0fb92a171..000000000 Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png deleted file mode 100644 index ec4b159b5..000000000 Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png and /dev/null differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index f8163688b..000000000 Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png deleted file mode 100644 index 2a97c3ef8..000000000 Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png deleted file mode 100644 index 8b0453118..000000000 Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png and /dev/null differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 7842539af..000000000 Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png deleted file mode 100644 index 3359e927c..000000000 Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png deleted file mode 100644 index 018996568..000000000 Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png and /dev/null differ diff --git a/src/app/core/chat/entity/message.ts b/src/app/core/chat/entity/message.ts index aa3326611..235839a51 100644 --- a/src/app/core/chat/entity/message.ts +++ b/src/app/core/chat/entity/message.ts @@ -95,9 +95,11 @@ export class MessageEntity { constructor() {} - get messageStatus() { + get messageHasId() { if(this.id) { - return 'send' + return true + } else { + return false } } diff --git a/src/app/core/chat/usecase/message/message-create-use-case.service copy.ts b/src/app/core/chat/usecase/message/message-create-use-case.service copy.ts new file mode 100644 index 000000000..aa9552a52 --- /dev/null +++ b/src/app/core/chat/usecase/message/message-create-use-case.service copy.ts @@ -0,0 +1,236 @@ +import { Injectable } from '@angular/core'; +import { IMessage, MessageAttachmentSource, MessageEntity, MessageEntitySchema, } from '../../entity/message'; +import { z } from 'zod'; +import { v4 as uuidv4 } from 'uuid'; +import { InstanceId } from '../../../../module/chat/domain/chat-service.service'; +import { createBlobFromBase64, createDataURL } from 'src/app/utils/ToBase64'; +import { zodSafeValidation } from 'src/app/utils/zodValidation'; +import { Logger } from 'src/app/services/logger/main/service'; +import { err, Result } from 'neverthrow'; +import { MessageMapper } from '../../mapper/messageMapper'; +import { RoomType } from "src/app/core/chat/entity/group"; +import { TracingType, XTracerAsync } from 'src/app/services/monitoring/opentelemetry/tracer'; +import { MessageTable } from 'src/app/infra/database/dexie/instance/chat/schema/message'; +import { MessageAttachmentFileType, MessageOutPutDataDTO } from 'src/app/core/chat/repository/dto/messageOutputDTO'; +import { IMessageLocalRepository } from 'src/app/core/chat/repository/message/message-local-repository'; +import { IMessageSocketRepository } from 'src/app/core/chat/repository/message/message-socket-repository'; +import { IMemberLocalRepository } from 'src/app/core/chat/repository/member/member-local-repository'; +import { IAttachmentLocalRepository } from 'src/app/core/chat/repository/typing/typing-local-repository'; +import { base64Schema } from 'src/app/utils/zod'; + + +export const MessageInputDTOSchema = z.object({ + roomId: z.string().uuid().optional(), + receiverId: z.number().optional(), + senderId: z.number(), + message: z.string().nullable().optional(), + messageType: z.number(), + canEdit: z.boolean(), + oneShot: z.boolean(), + requireUnlock: z.boolean(), + requestId: z.string(), + attachment: z.object({ + fileType: z.nativeEnum(MessageAttachmentFileType), + source: z.nativeEnum(MessageAttachmentSource), + file: base64Schema.optional(), + fileName: z.string().optional(), + applicationId: z.number().optional(), + docId: z.number().optional(), + mimeType: z.string().nullable().optional(), + description: z.string().optional() + }).optional() +}); +export type MessageInputDTO = z.infer + + + +export const MessageCreatePutDataDTOSchema = z.object({ + id: z.string(), + roomId: z.string(), + sender: z.object({ + wxUserId: z.number(), + wxFullName: z.string(), + wxeMail: z.string(), + userPhoto: z.string().optional() + }), + message: z.string().nullable().optional(), + messageType: z.number(), + sentAt: z.string(), + canEdit: z.boolean(), + oneShot: z.boolean(), + requireUnlock: z.boolean(), + requestId: z.string().optional().nullable(), + reactions: z.object({ + id: z.string(), + reactedAt: z.string(), + reaction: z.string(), + sender: z.object({}), + }).array(), + info: z.array(z.object({ + memberId: z.number(), + readAt: z.string().nullable(), + deliverAt: z.string().nullable() + })), + attachments: z.array(z.object({ + fileType: z.nativeEnum(MessageAttachmentFileType), + source: z.nativeEnum(MessageAttachmentSource), + file: z.string().optional(), + fileName: z.string().optional(), + applicationId: z.number().optional(), + docId: z.number().optional(), + id: z.string().optional() + })) +}); + +export type MessageCreateOutPutDataDTO = z.infer + +@Injectable({ + providedIn: 'root' +}) +export class MessageCreateUseCaseService { + + constructor( + private AttachmentLocalRepositoryService: IAttachmentLocalRepository, + private messageLocalDataSourceService: IMessageLocalRepository, + private messageSocketRepositoryService: IMessageSocketRepository, + private MemberListLocalRepository: IMemberLocalRepository + ) { } + + + @XTracerAsync({name:'MessageCreateUseCaseService', module:'chat', bugPrint: true, waitNThrow: 5000}) + async execute(message: IMessage, messageEnum: RoomType, tracing?: TracingType) { + + const validation = zodSafeValidation(MessageEntitySchema, message) + + if(validation.isOk()) { + message.sendAttemp++; + + message.requestId = InstanceId +'@'+ uuidv4(); + message.sending = true; + + const createMessageLocally = this.messageLocalDataSourceService.insert(message) + + createMessageLocally.then(async (value) => { + if(value.isOk()) { + + const localId = value.value + message.$id = localId + + if(message.hasAttachment) { + + for (const attachment of message.attachments) { + + if(attachment.source != MessageAttachmentSource.Webtrix) { + + this.AttachmentLocalRepositoryService.insert({ + $messageId: localId, + file: createBlobFromBase64(attachment.file, attachment.mimeType), + fileType: attachment.fileType, + source: attachment.source, + fileName: attachment.fileName, + applicationId: attachment.applicationId, + docId: attachment.docId, + mimeType: attachment.mimeType, + base64: createDataURL(attachment.file, attachment.mimeType) + }).then((e) => { + if(e.isErr()) { + Logger.error('failed to create attachment locally on send message', { + error: e.error, + data: createDataURL(attachment.file, attachment.mimeType).slice(0, 100) +'...' + }) + } + + }) + + attachment.safeFile = createDataURL(attachment.file, attachment.mimeType) + } + } + + } + + + } else { + Logger.error('failed to insert locally', { + error: value.error.message + }) + } + + }).catch((error) => { + Logger.error('failed to insert catch', { + //error: createMessageLocally.error.message + }) + }) + + + let sendMessageResult: Result + + if(messageEnum == RoomType.Group) { + const DTO = MessageMapper.fromDomain(message, message.requestId) + message.sending = true + sendMessageResult = await this.messageSocketRepositoryService.sendGroupMessage(DTO) + } else { + const DTO = MessageMapper.fromDomain(message, message.requestId) + delete DTO.roomId + message.sending = true + sendMessageResult = await this.messageSocketRepositoryService.sendDirectMessage(DTO) + } + + // return this sendMessageResult + + if(sendMessageResult.isOk()) { + + message.id = sendMessageResult.value.id + + console.log('sendMessageResult', sendMessageResult.value.id) + + if(sendMessageResult.value.sender == undefined || sendMessageResult.value.sender == null) { + + delete sendMessageResult.value.sender + } + + let clone: MessageTable = { + ...sendMessageResult.value, + id: sendMessageResult.value.id, + $id : message.$id + } + + createMessageLocally.then(() => { + this.messageLocalDataSourceService.update(message.$id, {...clone, sending: false, roomId: clone.roomId}).then((data)=> { + if(data.isOk()) { + + } else { + tracing.hasError('failed to update send message') + console.log(sendMessageResult) + console.log(data.error) + } + }) + }) + + return sendMessageResult + } else { + Logger.error('failed to send message to the server', { + error: sendMessageResult.error + }) + await this.messageLocalDataSourceService.update(message.$id, {sending: false, $id: message.$id}) + return err('no connection') + } + + + } else { + + if(validation.error.formErrors.fieldErrors.attachments) { + Logger.error('failed to send message doe to invalid attachment', { + zodErrorList: validation.error.errors, + data: message.attachments + }) + } else { + Logger.error('failed to send message, validation failed', { + zodErrorList: validation.error.errors, + data: message + }) + } + + } + + } +} diff --git a/src/app/core/notification/use-case/notification-delete-all-use-case.service.ts b/src/app/core/notification/use-case/notification-delete-all-use-case.service.ts index 9ea406b45..3ab7b4954 100644 --- a/src/app/core/notification/use-case/notification-delete-all-use-case.service.ts +++ b/src/app/core/notification/use-case/notification-delete-all-use-case.service.ts @@ -1,5 +1,6 @@ import { Injectable } from '@angular/core'; import { RemoteNotificationService } from 'src/app/module/notification/data/datasource/remote-notification.service'; +import { SessionStore } from 'src/app/store/session.service'; import { z } from 'zod'; const NotificationDeleteAllByUserIdSchema = z.any() @@ -14,8 +15,7 @@ export class NotificationDeleteAllServiceUseCase { private RemoteNotificationService:RemoteNotificationService ) { } - async execute(userId: INotificationDeleteAllByUserId) { - - return this.RemoteNotificationService.notificationDeleteAll(userId) + async execute() { + return this.RemoteNotificationService.notificationDeleteAll(SessionStore.user.UserId) } } diff --git a/src/app/index/index-routing.module.ts b/src/app/index/index-routing.module.ts index d3b578966..68b3e2c9e 100644 --- a/src/app/index/index-routing.module.ts +++ b/src/app/index/index-routing.module.ts @@ -7,12 +7,7 @@ const routes: Routes = [ { path: '', component: IndexPage, - /* canActivate: [IndexGuard], */ children: [ - /*{ - path: '', - loadChildren: ()=> import('../pages/welcome/welcome.module').then(m => m.WelcomePageModule) - }, */ { path: '', loadChildren: ()=> import('../pages/login/login.module').then(m => m.LoginPageModule), diff --git a/src/app/infra/database/dexie/instance/chat/service.ts b/src/app/infra/database/dexie/instance/chat/service.ts index c1d15c3d4..c6c3e321c 100644 --- a/src/app/infra/database/dexie/instance/chat/service.ts +++ b/src/app/infra/database/dexie/instance/chat/service.ts @@ -1,22 +1,22 @@ import { Dexie } from 'Dexie'; -import { DexieMessageTable, messageTableColumn, MessageTable } from 'src/app/infra/database/dexie/instance/chat/schema/message'; +import { DexieMessageTable, messageTableColumn } from 'src/app/infra/database/dexie/instance/chat/schema/message'; import { DexieMembersTableSchema, MemberTableColumn } from 'src/app/infra/database/dexie/instance/chat/schema/members'; import { DexieRoomsTable, RoomTableColumn } from 'src/app/infra/database/dexie/instance/chat/schema/room'; import { DexieTypingsTable, TypingTableColumn } from 'src/app/infra/database/dexie/instance/chat/schema/typing'; import { MessageEntity } from 'src/app/core/chat/entity/message'; import { AttachmentTableColumn, DexieAttachmentsTableSchema } from 'src/app/infra/database/dexie/instance/chat/schema/attachment'; -import { DexieDistributionTable, DistributionTable, DistributionTableColumn } from './schema/destribution'; +import { DexieDistributionTable, DistributionTableColumn } from './schema/destribution'; import { BoldTableColumn, DexieBoldTable } from './schema/bold'; -import { DexieUserPhotoTable, UserPhotoTable, UserPhotoTableColumn } from './schema/user-foto'; -// import FDBFactory from 'fake-indexeddb/lib/FDBFactory'; -// import FDBKeyRange from 'fake-indexeddb/lib/FDBKeyRange'; +import { DexieUserPhotoTable, UserPhotoTableColumn } from './schema/user-foto'; +import FDBFactory from 'fake-indexeddb/lib/FDBFactory'; +import FDBKeyRange from 'fake-indexeddb/lib/FDBKeyRange'; // Database declaration (move this to its own module also) export const chatDatabase = new Dexie('chat-database-v4',{ -// indexedDB: new FDBFactory, -// IDBKeyRange: FDBKeyRange, // Mocking IDBKeyRange + //indexedDB: new FDBFactory, + //IDBKeyRange: FDBKeyRange, // Mocking IDBKeyRange }) as Dexie & { message: DexieMessageTable, members: DexieMembersTableSchema, diff --git a/src/app/modals/profile/profile.page.html b/src/app/modals/profile/profile.page.html index 71b1cbc25..808c0bd54 100644 --- a/src/app/modals/profile/profile.page.html +++ b/src/app/modals/profile/profile.page.html @@ -85,19 +85,23 @@
+ + +
-
-
+
diff --git a/src/app/modals/profile/profile.page.scss b/src/app/modals/profile/profile.page.scss index 4a31f6f60..4cbc5d718 100644 --- a/src/app/modals/profile/profile.page.scss +++ b/src/app/modals/profile/profile.page.scss @@ -77,6 +77,7 @@ } .profile-content { padding: 20px 20px; + padding-bottom: 5px; //color: var(--profile-text-color) !important; } diff --git a/src/app/modals/profile/profile.page.ts b/src/app/modals/profile/profile.page.ts index 1b783e8af..b1d06caa8 100644 --- a/src/app/modals/profile/profile.page.ts +++ b/src/app/modals/profile/profile.page.ts @@ -4,7 +4,6 @@ import { AnimationController, ModalController } from '@ionic/angular'; import { AuthService } from 'src/app/services/auth.service'; import { EditProfilePage } from './edit-profile/edit-profile.page'; import { StorageService } from '../../services/storage.service'; -import { NotificationsService } from '../../services/notifications.service'; import { SessionStore } from 'src/app/store/session.service'; import { ThemeService } from 'src/app/services/theme.service' import { environment } from 'src/environments/environment'; @@ -20,7 +19,7 @@ import { isHttpError } from 'src/app/services/http.service'; import { UserRepositoryService } from 'src/app/module/user/data/user-repository.service'; import { UserProfilePicture } from 'src/app/module/user/data/datasource/user-local-repository.service'; import { UserService } from 'src/app/module/user/domain/user.service' - +import { NotificationService } from 'src/app/module/notification/domain/notification.service' @Component({ selector: 'app-profile', @@ -63,7 +62,7 @@ export class ProfilePage implements OnInit { private router: Router, private zone: NgZone, public ThemeService: ThemeService, - private notificationService: NotificationsService, + private NotificationService: NotificationService, private processesService: ProcessesService, private storageService: StorageService, public NotificationHolderService: NotificationHolderService, @@ -72,7 +71,7 @@ export class ProfilePage implements OnInit { private toastService: ToastService, private notificationRepositoryService: NotificationRepositoryService, private UserRepositoryService: UserRepositoryService, - private UserService:UserService + private UserService:UserService, ) { this.profilePictureSubject = this.UserRepositoryService.getProfilePictureLive() as any @@ -417,4 +416,11 @@ export class ProfilePage implements OnInit { this.deleteNotification(item); } + + async deleteAllNotification() { + console.log('nice job') + await this.NotificationService.deleteAllNotificationByUserId() + this.notificationRepositoryService.init() + + } } diff --git a/src/app/module/notification/data/async/changes/notificationListChange.ts b/src/app/module/notification/data/async/changes/notificationListChange.ts index f6570a74a..503740c16 100644 --- a/src/app/module/notification/data/async/changes/notificationListChange.ts +++ b/src/app/module/notification/data/async/changes/notificationListChange.ts @@ -21,7 +21,7 @@ export function NotificationListChanges( const localItem = localMap.get(id); if (!localItem) { changes.insert.push(serverItem); - } else if (localItem.status !== serverItem.status) { + } else if (localItem.viewDate !== serverItem.viewDate) { changes.update.push(serverItem); } } diff --git a/src/app/module/notification/data/datasource/local-notification.service.ts b/src/app/module/notification/data/datasource/local-notification.service.ts index db6b21873..ccf2514ce 100644 --- a/src/app/module/notification/data/datasource/local-notification.service.ts +++ b/src/app/module/notification/data/datasource/local-notification.service.ts @@ -122,7 +122,7 @@ export class LocalNotificationService { return from(liveQuery( () => { return NotificationDataSource.notification.orderBy('createdAt').reverse().toArray() .then(notifications => { - return notifications.filter(notification => notification.status === false) + return notifications.filter(notification => notification.viewDate == null) }) })) } @@ -132,7 +132,7 @@ export class LocalNotificationService { return NotificationDataSource.notification .toArray() .then(notifications => { - return notifications.filter(notification => notification.status === false).length + return notifications.filter(notification => notification.viewDate == null).length }) })) } diff --git a/src/app/module/notification/data/datasource/remote-notification.service.ts b/src/app/module/notification/data/datasource/remote-notification.service.ts index d68c340bf..71e165be6 100644 --- a/src/app/module/notification/data/datasource/remote-notification.service.ts +++ b/src/app/module/notification/data/datasource/remote-notification.service.ts @@ -22,7 +22,7 @@ export class RemoteNotificationService { } - async notificationStatus(id: string) { + async notificationStatus(id: number) { return await this.httpService.patch(`${this.baseUrl}/Notifications/${id}/status`); } @@ -30,5 +30,4 @@ export class RemoteNotificationService { async notificationDeleteAll(userId: any) { return await this.httpService.delete(`${this.baseUrl}/Notifications/${userId}`); } - } diff --git a/src/app/module/notification/data/dto/NotificationOutputDTO.ts b/src/app/module/notification/data/dto/NotificationOutputDTO.ts index 834aa2b54..40b594ddd 100644 --- a/src/app/module/notification/data/dto/NotificationOutputDTO.ts +++ b/src/app/module/notification/data/dto/NotificationOutputDTO.ts @@ -8,7 +8,7 @@ export const NotificationOutputDTOSchema = z.object({ total: z.number(), result: z.array( z.object({ - id: z.string(), + id: z.number(), service: z.string(), title: z.string(), body: z.string(), @@ -17,7 +17,6 @@ export const NotificationOutputDTOSchema = z.object({ folderId: z.string().nullable(), createdAt: z.string(), viewDate: z.string().nullable(), - status: z.boolean(), startDate: z.string().nullable(), endDate: z.string().nullable(), bodyEvent: z.string().nullable(), diff --git a/src/app/module/notification/data/infra/db/notification.db.ts b/src/app/module/notification/data/infra/db/notification.db.ts index 965bea4cc..b7f71624d 100644 --- a/src/app/module/notification/data/infra/db/notification.db.ts +++ b/src/app/module/notification/data/infra/db/notification.db.ts @@ -2,16 +2,16 @@ import { Dexie, EntityTable, liveQuery } from 'Dexie'; import { z } from 'zod'; export const NotificationTableSchema = z.object({ - notificationId: z.string().nullable(), + notificationId: z.number().nullable(), title: z.string().optional().nullable(), service: z.string().nullable(), object: z.string().optional().nullable(), idObject: z.string().nullable(), + viewDate: z.string().nullable(), folderId: z.string().optional().nullable(), dateInit: z.string().optional().nullable(), dateEnd: z.string().optional().nullable(), location: z.string().optional().nullable(), - status: z.boolean().optional(), notificationBody: z.any().optional() }) export type NotificationTable = z.infer diff --git a/src/app/module/notification/data/notification-repository.service.ts b/src/app/module/notification/data/notification-repository.service.ts index b75d5a560..b1b87cf49 100644 --- a/src/app/module/notification/data/notification-repository.service.ts +++ b/src/app/module/notification/data/notification-repository.service.ts @@ -83,7 +83,7 @@ export class NotificationRepositoryService { async notificationStatus(item: NotificationTable) { await this.RemoteNotificationService.notificationStatus(item.notificationId) - item.status = true + item.viewDate = new Date().toUTCString() this.LocalNotificationService.updateNotification(item) this this.init() @@ -93,14 +93,14 @@ export class NotificationRepositoryService { async RemoveNotificationStatus(item: NotificationTable) { await this.RemoteNotificationService.notificationStatus(item.notificationId) - item.status = true + item.viewDate = new Date().toUTCString() this.LocalNotificationService.updateNotification(item) this.init() return } async localNotificationStatus(item: NotificationTable) { - item.status = true + item.viewDate = new Date().toUTCString() this.LocalNotificationService.updateNotification(item) this.init() return diff --git a/src/app/module/notification/domain/mapper/notificationListMapper.ts b/src/app/module/notification/domain/mapper/notificationListMapper.ts index e453aecec..4bbf98247 100644 --- a/src/app/module/notification/domain/mapper/notificationListMapper.ts +++ b/src/app/module/notification/domain/mapper/notificationListMapper.ts @@ -14,9 +14,9 @@ export function NotificationListMapper(NotificationOutputDTO: NotificationOutput dateInit: e.startDate, dateEnd: e.endDate, createdAt: e.createdAt, - status: e.status, location: e.location, - notificationBody: e.body + notificationBody: e.body, + viewDate: e.viewDate } )) } diff --git a/src/app/module/notification/domain/notification.service.ts b/src/app/module/notification/domain/notification.service.ts index fc7cde440..6a1b3d86a 100644 --- a/src/app/module/notification/domain/notification.service.ts +++ b/src/app/module/notification/domain/notification.service.ts @@ -11,8 +11,8 @@ export class NotificationService { ) { } - deleteAllNotificationByUserId(userId: INotificationDeleteAllByUserId) { - this.NotificationDeleteAllServiceUseCase.execute(userId) + deleteAllNotificationByUserId() { + return this.NotificationDeleteAllServiceUseCase.execute() } diff --git a/src/app/pages/gabinete-digital/despachos/despacho/despacho.page.ts b/src/app/pages/gabinete-digital/despachos/despacho/despacho.page.ts index 9146540ee..ad756f797 100644 --- a/src/app/pages/gabinete-digital/despachos/despacho/despacho.page.ts +++ b/src/app/pages/gabinete-digital/despachos/despacho/despacho.page.ts @@ -3,7 +3,7 @@ import { ProcessesService } from 'src/app/services/processes.service'; import { ActivatedRoute } from '@angular/router'; import { Event } from '../../../../models/event.model'; import { MenuController, ModalController, PopoverController } from '@ionic/angular'; -import { momentG } from 'src/plugin/momentG' +import { momentG } from 'src/plugin/momentG'; import { DiscartExpedientModalPage } from '../../discart-expedient-modal/discart-expedient-modal.page'; import { BookMeetingModalPage } from '../../expediente/book-meeting-modal/book-meeting-modal.page'; import { CreateProcessPage } from 'src/app/modals/create-process/create-process.page'; 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 b5322213d..8810af88e 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 @@ -189,40 +189,38 @@ export class GroupContactsPage implements OnInit { async deleteMember(user: UserContacts) { - this.showLoader = true; - // this.chatServiceService.removeMember({ - // roomId: this.roomId, - // members: [ user.wxUserId] - // }) + // if(this.currentMembers.length >= 3) { + this.showLoader = true; - // this.currentMembers = this.currentMembers.filter( e => e.wxUserId != user.wxUserId) + const result = await this.chatServiceService.removeMemberToRoom({ + id: this.roomId, + members: [ user.wxUserId] + }) - const result = await this.chatServiceService.removeMemberToRoom({ - id: this.roomId, - members: [ user.wxUserId] - }) + if(result.isOk()) { + this.currentMembers = this.currentMembers.filter( e => e.wxUserId != user.wxUserId) - if(result.isOk()) { - this.currentMembers = this.currentMembers.filter( e => e.wxUserId != user.wxUserId) + const firstLetter = user.wxFullName.charAt(0) - const firstLetter = user.wxFullName.charAt(0) + if(!this.userContainer[firstLetter]) { + user['isChecked'] = false + this.userContainer[firstLetter] = [user as any] + } else { + user['isChecked'] = false + this.userContainer[firstLetter].push(user as any) + } - if(!this.userContainer[firstLetter]) { - user['isChecked'] = false - this.userContainer[firstLetter] = [user as any] - } else { - user['isChecked'] = false - this.userContainer[firstLetter].push(user as any) + } else if(result.error instanceof HttpRequest) { + this.httpErrorHandle.httpStatusHandle(result.error) + } else if(result.error instanceof ZodError) { + console.log(result.error.issues) } - } else if(result.error instanceof HttpRequest) { - this.httpErrorHandle.httpStatusHandle(result.error) - } else if(result.error instanceof ZodError) { - console.log(result.error.issues) - } - - this.showLoader = false; + this.showLoader = false; + //} else { + // alert('---') + //} } diff --git a/src/app/ui/chat/component/messages/messages.page.html b/src/app/ui/chat/component/messages/messages.page.html index 959ae212e..56dbac4c3 100644 --- a/src/app/ui/chat/component/messages/messages.page.html +++ b/src/app/ui/chat/component/messages/messages.page.html @@ -59,6 +59,11 @@
+
+ + {{ message.sender.wxFullName }} + +
@@ -125,8 +130,8 @@
- - + +
diff --git a/src/app/ui/chat/component/messages/messages.page.ts b/src/app/ui/chat/component/messages/messages.page.ts index 1f44c0123..f93650169 100644 --- a/src/app/ui/chat/component/messages/messages.page.ts +++ b/src/app/ui/chat/component/messages/messages.page.ts @@ -300,7 +300,7 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy return 'allViewed' } else if(this.allReceived(message)) { return 'allReceived' - } else if (message.messageStatus == 'send') { + } else if (message.messageHasId) { return 'enviado' } else { return 'enviar' diff --git a/src/app/ui/chat/modal/chat-popover/chat-popover.page.ts b/src/app/ui/chat/modal/chat-popover/chat-popover.page.ts index f3d5ecff8..226f1536f 100644 --- a/src/app/ui/chat/modal/chat-popover/chat-popover.page.ts +++ b/src/app/ui/chat/modal/chat-popover/chat-popover.page.ts @@ -5,12 +5,17 @@ import { ThemeService } from 'src/app/services/theme.service' import { SetRoomOwnerPage } from 'src/app/ui/chat/modal/set-room-owner/set-room-owner.page'; import { SessionStore } from 'src/app/store/session.service'; import { ZodError } from 'zod'; - +import { MemberListLocalRepository } from 'src/app/module/chat/data/repository/member/member-list-local-repository.service' import { ChatServiceService } from 'src/app/module/chat/domain/chat-service.service' import { RoomInfoPage } from '../room-info/room-info.page'; import { RoomType } from 'src/app/core/chat/entity/group'; import { isHttpResponse } from 'src/app/infra/http/http.service'; + +interface ISetRoomOwner { + addAdminBeforeLeave: null | boolean +} + @Component({ selector: 'app-chat-popover', templateUrl: './chat-popover.page.html', @@ -31,7 +36,8 @@ export class ChatPopoverPage implements OnInit { private navParams: NavParams, private toastService: ToastService, public ThemeService: ThemeService, - private ChatServiceService: ChatServiceService + private ChatServiceService: ChatServiceService, + private MemberListLocalRepository: MemberListLocalRepository ) { this.roomId = this.navParams.get('roomId'); this.isAdmin = this.navParams.get('isAdmin'); @@ -55,7 +61,7 @@ export class ChatPopoverPage implements OnInit { //Top menu options //Close - async setRoomOwner() { + async setRoomOwner({addAdminBeforeLeave = null}: ISetRoomOwner) { let classs; if (window.innerWidth < 701) { classs = 'modal modal-desktop' @@ -68,26 +74,36 @@ export class ChatPopoverPage implements OnInit { backdropDismiss: true, componentProps: { roomId: this.roomId, - isAdmin: this.isAdmin + isAdmin: this.isAdmin, + addAdminBeforeLeave } }); await modal.present(); - modal.onDidDismiss().then((res)=>{ + modal.onDidDismiss().then((res) => { if(res.data == 'success'){ this.leaveGroup(); //this.ChatSystemService.hidingRoom(this.roomId); } }); - } + } - setAdmin() { - this.setRoomOwner(); + setAdmin(data:ISetRoomOwner) { + this.setRoomOwner(data); } async leaveGroup() { - //this.setRoomOwner(); + if(this.isAdmin) { + const currentMemberToMap = await this.MemberListLocalRepository.getRoomMemberById(this.roomId) + const adminCount = currentMemberToMap.filter(e => e.isAdmin); + this.toastService._badRequest("É necessário adicionar um administrador"); + if(adminCount.length <= 1) { + this.setAdmin({addAdminBeforeLeave: true}); + return; + } + } + this.showLoader = true const result = await this.ChatServiceService.leaveRoom({ id: this.roomId, diff --git a/src/app/ui/chat/modal/messages/messages.page.html b/src/app/ui/chat/modal/messages/messages.page.html index a9881d328..513ce1627 100644 --- a/src/app/ui/chat/modal/messages/messages.page.html +++ b/src/app/ui/chat/modal/messages/messages.page.html @@ -68,6 +68,11 @@
+
+ + {{ message.sender.wxFullName }} + +
@@ -142,8 +147,8 @@
- - + +
diff --git a/src/app/ui/chat/modal/messages/messages.page.ts b/src/app/ui/chat/modal/messages/messages.page.ts index 5bc8b9d9a..0fc749fbe 100644 --- a/src/app/ui/chat/modal/messages/messages.page.ts +++ b/src/app/ui/chat/modal/messages/messages.page.ts @@ -149,7 +149,7 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { return 'allViewed' } else if(this.allReceived(message)) { return 'allReceived' - } else if (message.messageStatus == 'send') { + } else if (message.messageHasId) { return 'enviado' } else { return 'enviar' 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 bf70e4708..944759163 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,6 +19,7 @@ export class SetRoomOwnerPage implements OnInit { textSearch:string = ""; roomId:any; members:any; + addAdminBeforeLeave: boolean | null; roomMembers$!: DexieObservable constructor( @@ -31,6 +32,7 @@ export class SetRoomOwnerPage implements OnInit { ) { this.roomId = this.navParams.get('roomId'); this.members = this.navParams.get('members'); + this.addAdminBeforeLeave = this.navParams.get('addAdminBeforeLeave'); } ngOnInit() { @@ -68,8 +70,10 @@ export class SetRoomOwnerPage implements OnInit { }); if(result.isOk()) { - this.chatServiceService.getRoomById(this.roomId); - // this.modalController.dismiss('success'); + await this.chatServiceService.getRoomById(this.roomId); + if(this.addAdminBeforeLeave) { + this.modalController.dismiss('success'); + } } else { this.toastService._badRequest('Não foi possível completar a ação, por favor tente novamente.'); } diff --git a/src/app/ui/chat/store/model/message.ts b/src/app/ui/chat/store/model/message.ts index f2d00ce06..47f898815 100644 --- a/src/app/ui/chat/store/model/message.ts +++ b/src/app/ui/chat/store/model/message.ts @@ -99,9 +99,11 @@ export class MessageViewModal { } - get messageStatus() { + get messageHasId() { if(this.id) { - return 'send' + return true + } else { + return false } } diff --git a/version/git-version.ts b/version/git-version.ts index 5b0a3b391..1f0a648e5 100644 --- a/version/git-version.ts +++ b/version/git-version.ts @@ -1,11 +1,11 @@ export let versionData = { - "shortSHA": "5a1bbe610", - "SHA": "5a1bbe6103c983534e6a66d69a7344a8520d67f5", + "shortSHA": "aef73625f", + "SHA": "aef73625f081830c368591d90bc09f12a31d7fef", "branch": "feature/login-v2", "lastCommitAuthor": "'Peter Maquiran'", - "lastCommitTime": "'Thu Dec 5 19:14:11 2024 +0100'", - "lastCommitMessage": "fix issues", - "lastCommitNumber": "6134", - "changeStatus": "On branch feature/login-v2\nYour branch is ahead of 'origin/feature/login-v2' by 1 commit.\n (use \"git push\" to publish your local commits)\n\nChanges to be committed:\n (use \"git restore --staged ...\" to unstage)\n\tnew file: src/app/core/notification/repository/notification-remote-repository.ts\n\tnew file: src/app/core/notification/use-case/notification-delete-all-use-case.service.ts\n\tmodified: src/app/module/notification/data/datasource/remote-notification.service.ts\n\tdeleted: src/app/module/notification/data/notification-repository.service.spec.ts\n\tnew file: src/app/module/notification/domain/notification.service.ts\n\tnew file: src/app/module/notification/notification.module.ts\n\tmodified: src/app/pages/gabinete-digital/gabinete-digital.page.html\n\tmodified: src/app/ui/chat/chat.page.ts\n\tmodified: src/environments/suport/dev.ts\n\tmodified: version/git-version.ts", + "lastCommitTime": "'Fri Dec 6 11:21:32 2024 +0100'", + "lastCommitMessage": "fix errors", + "lastCommitNumber": "6135", + "changeStatus": "On branch feature/login-v2\nYour branch is up to date with 'origin/feature/login-v2'.\n\nChanges to be committed:\n (use \"git restore --staged ...\" to unstage)\n\tdeleted: android/app/google-services.json\n\tdeleted: android/app/src/main/AndroidManifest.xml\n\tdeleted: android/app/src/main/res/drawable-land-hdpi/splash.png\n\tdeleted: android/app/src/main/res/drawable-land-ldpi/splash.png\n\tdeleted: android/app/src/main/res/drawable-land-mdpi/splash.png\n\tdeleted: android/app/src/main/res/drawable-land-xhdpi/splash.png\n\tdeleted: android/app/src/main/res/drawable-land-xxhdpi/splash.png\n\tdeleted: android/app/src/main/res/drawable-land-xxxhdpi/splash.png\n\tdeleted: android/app/src/main/res/drawable-port-hdpi/splash.png\n\tdeleted: android/app/src/main/res/drawable-port-ldpi/splash.png\n\tdeleted: android/app/src/main/res/drawable-port-mdpi/splash.png\n\tdeleted: android/app/src/main/res/drawable-port-xhdpi/splash.png\n\tdeleted: android/app/src/main/res/drawable-port-xxhdpi/splash.png\n\tdeleted: android/app/src/main/res/drawable-port-xxxhdpi/splash.png\n\tdeleted: android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml\n\tdeleted: android/app/src/main/res/drawable/ic_launcher_background.xml\n\tdeleted: android/app/src/main/res/drawable/splash.png\n\tdeleted: android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml\n\tdeleted: android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml\n\tdeleted: android/app/src/main/res/mipmap-hdpi/ic_launcher.png\n\tdeleted: android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png\n\tdeleted: android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png\n\tdeleted: android/app/src/main/res/mipmap-mdpi/ic_launcher.png\n\tdeleted: android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png\n\tdeleted: android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png\n\tdeleted: android/app/src/main/res/mipmap-xhdpi/ic_launcher.png\n\tdeleted: android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png\n\tdeleted: android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png\n\tdeleted: android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png\n\tdeleted: android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png\n\tdeleted: android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png\n\tdeleted: android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png\n\tdeleted: android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png\n\tdeleted: android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png\n\tmodified: src/app/core/chat/entity/message.ts\n\tnew file: src/app/core/chat/usecase/message/message-create-use-case.service copy.ts\n\tmodified: src/app/core/notification/use-case/notification-delete-all-use-case.service.ts\n\tmodified: src/app/index/index-routing.module.ts\n\tmodified: src/app/infra/database/dexie/instance/chat/service.ts\n\tmodified: src/app/modals/profile/profile.page.html\n\tmodified: src/app/modals/profile/profile.page.scss\n\tmodified: src/app/modals/profile/profile.page.ts\n\tmodified: src/app/module/notification/data/async/changes/notificationListChange.ts\n\tmodified: src/app/module/notification/data/datasource/local-notification.service.ts\n\tmodified: src/app/module/notification/data/datasource/remote-notification.service.ts\n\tmodified: src/app/module/notification/data/dto/NotificationOutputDTO.ts\n\tmodified: src/app/module/notification/data/infra/db/notification.db.ts\n\tmodified: src/app/module/notification/data/notification-repository.service.ts\n\tmodified: src/app/module/notification/domain/mapper/notificationListMapper.ts\n\tmodified: src/app/module/notification/domain/notification.service.ts\n\tmodified: src/app/pages/gabinete-digital/despachos/despacho/despacho.page.ts\n\tmodified: src/app/ui/chat/component/group-contacts/group-contacts.page.ts\n\tmodified: src/app/ui/chat/component/messages/messages.page.html\n\tmodified: src/app/ui/chat/component/messages/messages.page.ts\n\tmodified: src/app/ui/chat/modal/chat-popover/chat-popover.page.ts\n\tmodified: src/app/ui/chat/modal/messages/messages.page.html\n\tmodified: src/app/ui/chat/modal/messages/messages.page.ts\n\tmodified: src/app/ui/chat/modal/set-room-owner/set-room-owner.page.ts\n\tmodified: src/app/ui/chat/store/model/message.ts", "changeAuthor": "peter.maquiran" } \ No newline at end of file