diff --git a/package-lock.json b/package-lock.json index 320307dee..8f698c4e9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -248,7 +248,7 @@ "protractor": "~7.0.0", "ts-node": "~8.3.0", "tslint": "^6.1.3", - "typescript": "4.6", + "typescript": "^4.3.5", "uk.co.workingedge.cordova.plugin.sqliteporter": "^1.1.1" } }, @@ -1010,19 +1010,6 @@ "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", "dev": true }, - "node_modules/@angular-devkit/build-optimizer/node_modules/typescript": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz", - "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, "node_modules/@angular-devkit/build-webpack": { "version": "0.1202.18", "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1202.18.tgz", @@ -41970,9 +41957,9 @@ } }, "node_modules/typescript": { - "version": "4.6.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz", - "integrity": "sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz", + "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -44971,12 +44958,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", "dev": true - }, - "typescript": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz", - "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==", - "dev": true } } }, @@ -76476,9 +76457,9 @@ } }, "typescript": { - "version": "4.6.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz", - "integrity": "sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==" + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz", + "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==" }, "ua-parser-js": { "version": "0.7.31", diff --git a/package.json b/package.json index af1ad9c7a..969326f30 100644 --- a/package.json +++ b/package.json @@ -265,7 +265,7 @@ "protractor": "~7.0.0", "ts-node": "~8.3.0", "tslint": "^6.1.3", - "typescript": "4.6", + "typescript": "^4.3.5", "uk.co.workingedge.cordova.plugin.sqliteporter": "^1.1.1" }, "description": "An Ionic project", diff --git a/src/app/module/chat/chat.module.ts b/src/app/module/chat/chat.module.ts index 2562f3f0d..eb8d07fc3 100644 --- a/src/app/module/chat/chat.module.ts +++ b/src/app/module/chat/chat.module.ts @@ -3,6 +3,8 @@ import { SignalRService } from 'src/app/module/chat/infra/socket/signal-r.servic import { SyncMessageRepositoryService } from './data/service/sync-repository/sync-message-repository.service'; import { UserTypingAsyncService } from 'src/app/module/chat/data/async/socket/user-typing-async.service' import { ChatServiceService } from 'src/app/module/chat/domain/chat-service.service' +import { skip } from 'rxjs/operators'; +import { SessionStore } from 'src/app/store/session.service'; @NgModule({ imports: [ @@ -21,21 +23,36 @@ export class ChatModule { private message: SyncMessageRepositoryService, private SignalRService: SignalRService, private UserTypingAsyncService: UserTypingAsyncService, - private ChatServiceService: ChatServiceService + private ChatServiceService: ChatServiceService ) { - this.triggerToSendOfflineMessages() + this.syncMessage() } - triggerToSendOfflineMessages() { - const result = this.SignalRService.getConnectionState() + syncMessage() { + const connection = this.SignalRService.getConnectionState() - result.subscribe((value) => { + connection.pipe( + skip(1) // Skip the first value + ).subscribe((value)=> { if(value) { + // on reconnect this.ChatServiceService.asyncAllRoomMessage(); + } + }); + + connection.subscribe((value) => { + if(value) { + // on connect + console.log('send local image') this.message.sendLocalMessages() } }) + + // on page reload sync + if(!(!SessionStore.user.Inactivity || !SessionStore.exist)) { + this.ChatServiceService.asyncAllRoomMessage(); + } } } diff --git a/src/app/module/chat/data/data-source/message/message-local-data-source.service.ts b/src/app/module/chat/data/data-source/message/message-local-data-source.service.ts index e72401f3c..1ae2adf8a 100644 --- a/src/app/module/chat/data/data-source/message/message-local-data-source.service.ts +++ b/src/app/module/chat/data/data-source/message/message-local-data-source.service.ts @@ -18,6 +18,8 @@ export class MessageLocalDataSourceService extends DexieRepository constructor() { super(chatDatabase.message, MessageTableSchema) + + this.setAllSenderToFalse(); } async setAllSenderToFalse() { @@ -195,6 +197,10 @@ export class MessageLocalDataSourceService extends DexieRepository .filter(msg => typeof msg.id !== 'string' && msg.sending == false) .toArray(); + + console.log("======================================================================") + console.log({localMessage:allMessages}) + return allMessages as MessageEntity[]; } catch (error) { console.error('Error fetching messages:', error); diff --git a/src/app/module/chat/data/data-source/message/message-remote-data-source.service.ts b/src/app/module/chat/data/data-source/message/message-remote-data-source.service.ts index f658385fb..f03ab14b9 100644 --- a/src/app/module/chat/data/data-source/message/message-remote-data-source.service.ts +++ b/src/app/module/chat/data/data-source/message/message-remote-data-source.service.ts @@ -26,7 +26,7 @@ export class MessageRemoteDataSourceService { } - @APIReturn(MessageOutPutDTOSchema, 'get/Messages') + // @APIReturn(MessageOutPutDTOSchema, 'get/Messages') async getMessagesFromRoom(id: string): DataSourceReturn { return await this.httpService.get(`${this.baseUrl}/Room/${id}/Messages`); } diff --git a/src/app/module/chat/data/service/sync-repository/sync-message-repository.service.ts b/src/app/module/chat/data/service/sync-repository/sync-message-repository.service.ts index a5e92b457..a8b953f88 100644 --- a/src/app/module/chat/data/service/sync-repository/sync-message-repository.service.ts +++ b/src/app/module/chat/data/service/sync-repository/sync-message-repository.service.ts @@ -51,8 +51,12 @@ export class SyncMessageRepositoryService { $id : message.$id } + console.log('send message local') + this.messageLocalDataSourceService.update(message.$id, {...clone, sending: false, roomId: message.roomId}) } else { + + console.log('erro send message') this.messageLocalDataSourceService.update(message.$id, {sending: false}) } } diff --git a/src/app/module/chat/domain/use-case/sync-all-room-messages.service.ts b/src/app/module/chat/domain/use-case/sync-all-room-messages.service.ts index e94f0e628..12d542c3a 100644 --- a/src/app/module/chat/domain/use-case/sync-all-room-messages.service.ts +++ b/src/app/module/chat/domain/use-case/sync-all-room-messages.service.ts @@ -14,10 +14,12 @@ export class SyncAllRoomMessagesService { ) { } async execute() { - + + await this.RoomRepositoryService.list() const allRooms: RoomTable[] = await this.RoomRepositoryService.getRoomList() if(allRooms) { + console.log('allRooms', allRooms) for(const room of allRooms) { this.MessageRepositoryService.listAllMessagesByRoomId(room.id) } diff --git a/src/app/module/chat/infra/socket/signalR.ts b/src/app/module/chat/infra/socket/signalR.ts index 55048d80c..507f7477e 100644 --- a/src/app/module/chat/infra/socket/signalR.ts +++ b/src/app/module/chat/infra/socket/signalR.ts @@ -45,10 +45,10 @@ export class SignalRConnection { hubConnection .start() .then(() => { + this.hubConnection = hubConnection this.hasConnectOnce = true console.log('Connection started'); this.connectionStateSubject.next(true); - this.hubConnection = hubConnection this.join() this.addMessageListener() resolve(ok(hubConnection)) diff --git a/src/app/pages/chat/messages/messages.page.ts b/src/app/pages/chat/messages/messages.page.ts index 683166f15..037e60322 100644 --- a/src/app/pages/chat/messages/messages.page.ts +++ b/src/app/pages/chat/messages/messages.page.ts @@ -107,6 +107,8 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { downloadFile: any; files: any[] = []; @ViewChild('filechooser') fileChooserElementRef: ElementRef; + @ViewChild('array') myInputRef!: ElementRef; + //items: File[] = []; fileSelected?: Blob; pdfUrl?: string; @@ -172,6 +174,7 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { this.roomData$ = this.roomRepositoryService.getItemByIdLive(this.roomId) + this.getMessages(); this.listenToIncomingMessage(); this.listenToDeleteMessage(); this.listenToUpdateMessage(); @@ -206,15 +209,52 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { }) - //this.userTyping$ = this.userTypingMemoryDataSource.select(state => state) as any + this.userTypingServiceRepository.getUserTypingLive().subscribe((e) => { + const arrayNames = e.map(e => e.userName) + this.userTyping$ = e as any - // let a = this.userTypingMemoryDataSource.select(state => state).subscribe((e) => { - // this.userTyping$ = e as any - // }) + const uniqueArray = [...new Set(arrayNames)]; + + (this.myInputRef.nativeElement as HTMLDivElement).innerHTML = '::'+ uniqueArray + }) } + async getMessages() { + + // dont remove this line + this.messages1[this.roomId] = [] + let messages = await this.messageRepositoryService.getItems(this.roomId) + + this.messages1[this.roomId] = [] + this.messages1[this.roomId] = messages + this.loadAttachment() + setTimeout(() => { + this.scrollToBottomClicked() + }, 100) + + } + + async loadAttachment() { + for(const message of this.messages1[this.roomId]) { + if(message.hasAttachment) { + + const result = await this.chatServiceService.getMessageAttachmentByMessageId({ + $messageId: message.$id, + id: message.attachments[0].id + }) + + if(result.isOk()) { + + message.attachments[0].safeFile = result.value + + } + } + + } + + } ngOnInit() { try { @@ -830,10 +870,11 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { } message.attachments = [{ - file: compressedImage.value, + file: compressedImage.value.split(',')[1], fileName: "foto", source: MessageAttachmentSource.Device, - fileType: MessageAttachmentFileType.Image + fileType: MessageAttachmentFileType.Image, + mimeType: 'image/'+picture.value.format }] this.chatServiceService.sendMessage(message) diff --git a/src/app/pages/login/login.page.ts b/src/app/pages/login/login.page.ts index f7d143e84..8dbf57d8d 100644 --- a/src/app/pages/login/login.page.ts +++ b/src/app/pages/login/login.page.ts @@ -11,7 +11,6 @@ import { ClearStoreService } from 'src/app/services/clear-store.service'; import { ChangeProfileService } from 'src/app/services/change-profile.service'; import { ThemeService } from 'src/app/services/theme.service'; import { PermissionService } from 'src/app/services/permission.service'; -import { ChatService } from 'src/app/services/chat.service'; import { NotificationHolderService } from 'src/app/store/notification-holder.service'; import { Platform } from '@ionic/angular'; import { Storage } from '@ionic/storage'; @@ -51,7 +50,6 @@ export class LoginPage implements OnInit { public ThemeService: ThemeService, public p: PermissionService, // public ChatSystemService: ChatSystemService, - private ChatService: ChatService, private platform: Platform, private storage: Storage, private storageService: StorageService, @@ -137,20 +135,6 @@ export class LoginPage implements OnInit { await this.authService.SetSession(attempt, this.userattempt); this.changeProfileService.run(); - if (attempt.ChatData) { - - try { - this.NotificationHolderService.clear() - await this.authService.loginToChatWs(); - this.ChatService.setheader() - - } catch(error) { - console.log("faild to clear chat") - } - - } - - this.changeProfileService.runLogin(); this.ChatServiceService.asyncAllRoomMessage() this.getToken(); @@ -172,12 +156,6 @@ export class LoginPage implements OnInit { await this.authService.SetSession(attempt, this.userattempt); this.changeProfileService.run(); - - - if (attempt.ChatData) { - await this.authService.loginToChatWs(); - this.ChatService.setheader(); - } this.storageService.remove("Notifications") this.ChatServiceService.asyncAllRoomMessage() diff --git a/src/app/shared/chat/messages/messages.page.ts b/src/app/shared/chat/messages/messages.page.ts index 536d04391..bffc7a2ce 100644 --- a/src/app/shared/chat/messages/messages.page.ts +++ b/src/app/shared/chat/messages/messages.page.ts @@ -166,12 +166,14 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy } ngOnChanges(changes: SimpleChanges): void { + + this.roomData$ = this.roomRepositoryService.getItemByIdLive(this.roomId) this.getMessages(); this.listenToIncomingMessage(); this.listenToDeleteMessage(); this.listenToUpdateMessage(); - this.listenToSendMessage(); + this.listenToSendMessage() this.roomMessage$ = this.messageRepositoryService.getItemsLive(this.roomId) this.roomMembers$ = this.roomRepositoryService.getRoomMemberByIdLive(this.roomId) as any @@ -193,17 +195,17 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy async getMessages() { + // dont remove this line + this.messages1[this.roomId] = [] let messages = await this.messageRepositoryService.getItems(this.roomId) - + + this.messages1[this.roomId] = [] this.messages1[this.roomId] = messages - - this.messages1[this.roomId] = this.sortBySentAt(this.messages1[this.roomId]) - this.loadAttachment() setTimeout(() => { this.scrollToBottomClicked() - }, 100) + }, 200) } @@ -217,14 +219,12 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy }) if(result.isOk()) { - message.attachments[0].safeFile = result.value } } } - } // Sorting function @@ -818,11 +818,11 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy message.sentAt = new Date().toISOString() message.attachments = [{ - file: compressedImage.value, + file: compressedImage.value.split(',')[1], fileName: "foto", source: MessageAttachmentSource.Device, fileType: MessageAttachmentFileType.Image, - mimeType: picture.value.format + mimeType: 'image/'+picture.value.format }] this.messages1[this.roomId].push(message)