-
+
diff --git a/src/app/pages/login/login.page.ts b/src/app/pages/login/login.page.ts index 37a27b44f..9072eb405 100644 --- a/src/app/pages/login/login.page.ts +++ b/src/app/pages/login/login.page.ts @@ -12,6 +12,8 @@ import { ChangeProfileService } from 'src/app/services/change-profile.service'; import { ThemeService } from 'src/app/services/theme.service'; import { StorageService } from 'src/app/services/storage.service'; import { ChatService } from 'src/app/services/chat.service'; +import { PermissionService } from 'src/app/services/permission.service'; +import { PermissionList } from 'src/app/models/permissionList'; @Component({ selector: 'app-login', @@ -29,7 +31,8 @@ export class LoginPage implements OnInit { hasPin: boolean loginPreference: string - sessionStore = SessionStore + sessionStore = SessionStore; + permissionList = new PermissionList(); constructor( private notificatinsservice: NotificationsService, @@ -40,7 +43,8 @@ export class LoginPage implements OnInit { private clearStoreService: ClearStoreService, private changeProfileService: ChangeProfileService, public ThemeService: ThemeService, - private storageservice: StorageService + private storageservice: StorageService, + public permissionService: PermissionService, ) {} ngOnInit() { @@ -101,26 +105,29 @@ export class LoginPage implements OnInit { // login to API successfully if (attempt) { if (attempt.UserId == SessionStore.user.UserId) { + await this.authService.SetSession(attempt, this.userattempt); await this.authService.loginChat(); - await this.authService.loginToChatWs() + await this.authService.loginToChatWs(); this.getToken(); SessionStore.setInativity(true); - this.goback() + this.goback(); + } else { - this.clearStoreService.clear() - SessionStore.delete() + this.clearStoreService.clear(); + SessionStore.delete(); window.localStorage.clear(); await this.authService.SetSession(attempt, this.userattempt); - this.changeProfileService.run() + this.changeProfileService.run(); await this.authService.loginChat(); - await this.authService.loginToChatWs() + await this.authService.loginToChatWs(); this.getToken(); this.router.navigateByUrl('/pin', { replaceUrl: true }); + } } else{ @@ -141,7 +148,15 @@ export class LoginPage implements OnInit { if(pathName) { this.router.navigate([pathName]); } else { - this.router.navigate(['/home/events']); + if(this.permissionService.userPermission(this.permissionList.Agenda) || this.permissionService.userPermission(this.permissionList.Gabinete)){ + this.router.navigate(['/home/events']); + } + else if(this.permissionService.userPermission(this.permissionList.Chat)){ + this.router.navigate(['/home/chat']); + } + else if(this.permissionService.userPermission(this.permissionList.Actions)){ + this.router.navigate(['/home/publications']); + } } } diff --git a/src/app/services/auth.service.ts b/src/app/services/auth.service.ts index b2790df57..f4f015d41 100644 --- a/src/app/services/auth.service.ts +++ b/src/app/services/auth.service.ts @@ -131,7 +131,6 @@ export class AuthService { let responseChat = await this.httpService.post('login', postData).toPromise(); if(responseChat) { - console.log('Login to Rocket chat OK', responseChat); this.ValidatedUserChat = responseChat; localStorage.setItem('userChat', JSON.stringify(responseChat)); diff --git a/src/app/services/chat/chat-methods.service.ts b/src/app/services/chat/chat-methods.service.ts index 61e446163..379d048b5 100644 --- a/src/app/services/chat/chat-methods.service.ts +++ b/src/app/services/chat/chat-methods.service.ts @@ -47,13 +47,8 @@ export class ChatMethodsService { return this.chatService.sendMessage(body) } - deleteMessage(body) { return this.chatService.deleteMessage(body) } - - - - } \ No newline at end of file diff --git a/src/app/services/chat/message.service.ts b/src/app/services/chat/message.service.ts index 0cc33911f..de1e78de2 100644 --- a/src/app/services/chat/message.service.ts +++ b/src/app/services/chat/message.service.ts @@ -12,6 +12,7 @@ import { MessageModel, DeleteMessageModel } from '../../models/beast-orm' import { AESEncrypt } from '../aesencrypt.service' import { HttpClient, HttpEventType } from '@angular/common/http'; import { AttachmentsService } from 'src/app/services/attachments.service'; +import { NetworkServiceService , ConnectionStatus} from 'src/app/services/network-service.service'; @Injectable({ providedIn: 'root' @@ -62,7 +63,8 @@ export class MessageService { private ChatStorageService: ChatStorageService, private ChatMethodsService: ChatMethodsService, private AESEncrypt: AESEncrypt, - private AttachmentsService: AttachmentsService,) { + private AttachmentsService: AttachmentsService, + private NetworkServiceService: NetworkServiceService) { } setData({customFields = {}, channels, mentions, msg ,rid ,ts, u, t, _id, id, _updatedAt, file, attachments, temporaryData, localReference , viewed = [], received = [], delate = false, delateRequest =false, }:Message) { @@ -184,24 +186,30 @@ export class MessageService { delete params?.attachments?.image_url } - this.ChatMethodsService.send(params).subscribe( - (response: any) => { - const ChatMessage = response.message - this.messageSend = true - this.redefinedMessage(ChatMessage) - }, - (error) => { - this.WsChatService.registerCallback({ - type: 'reConnect', - funx: async ()=> { - - this.send() - return true - } - }) - } - ) + + if(this.NetworkServiceService.getCurrentNetworkStatus() == ConnectionStatus.Online) { + + this.WsChatService.send(params).then( + (ChatMessage: any) => { + ChatMessage = ChatMessage.message.result + + this.messageSend = true + this.redefinedMessage(ChatMessage) + } + ) + + } else { + this.WsChatService.registerCallback({ + type: 'reConnect', + funx: async ()=> { + + this.send() + return true + } + }) + } + } async redefinedMessage(ChatMessage , update = true) { @@ -222,7 +230,6 @@ export class MessageService { if (event.type === HttpEventType.DownloadProgress) { - console.log('FILE TYPE 33', this.file.type) } else if (event.type === HttpEventType.Response) { if (this.file.type == "application/img") { downloadFile = 'data:image/jpeg;base64,' + btoa(new Uint8Array(event.body).reduce((data, byte) => data + String.fromCharCode(byte), '')); @@ -242,7 +249,6 @@ export class MessageService { ts: this.attachments[0].ts } - console.log(this.attachments) // save the changes to the storage this.save() } @@ -262,7 +268,6 @@ export class MessageService { async delateDB() { - // alert('delete data') const message = await MessageModel.get({_id: this._id}) await message.delete() @@ -314,6 +319,7 @@ export class MessageService { async save() { const message = this.getChatObj() + console.log(message); await MessageModel.update(message) diff --git a/src/app/services/chat/room.service.ts b/src/app/services/chat/room.service.ts index 910c80f1e..80fcab564 100644 --- a/src/app/services/chat/room.service.ts +++ b/src/app/services/chat/room.service.ts @@ -22,6 +22,7 @@ import { DeleteMessageModel, MessageModel } from '../../models/beast-orm' import { AESEncrypt } from '../aesencrypt.service' import { IncomingChatMessage, ChatMessageInterface, falseTypingMethod } from 'src/app/models/message.model'; import { AttachmentsService } from 'src/app/services/attachments.service'; +import { ConnectionStatus, NetworkServiceService} from 'src/app/services/network-service.service'; @Injectable({ providedIn: 'root' @@ -77,18 +78,16 @@ export class RoomService { private ChatStorageService: ChatStorageService, private ChatMethodsService: ChatMethodsService, private AESEncrypt: AESEncrypt, - private AttachmentsService: AttachmentsService + private AttachmentsService: AttachmentsService, + private NetworkServiceService: NetworkServiceService ) { this.NativeNotificationService.askForPermission() - // this.restoreMessageFromDB() - this.WsChatService.getUserStatus((d) => { const userId = d.fields.args[0][0] const statusNum = d.fields.args[0][2] const statusText = this.statusNumberToText(statusNum) - // if(this.members?.map) { const membersIds = this.members.map((user)=> user._id) @@ -145,7 +144,7 @@ export class RoomService { } } - setData({members, u, customFields = {}, id, name, t, lastMessage = new MessageService(this.storage, this.NfService, this.WsChatService, this.ChatStorageService, this.ChatMethodsService, this.AESEncrypt, this.AttachmentsService), _updatedAt }) { + setData({members, u, customFields = {}, id, name, t, lastMessage = new MessageService(this.storage, this.NfService, this.WsChatService, this.ChatStorageService, this.ChatMethodsService, this.AESEncrypt, this.AttachmentsService, this.NetworkServiceService), _updatedAt }) { this.customFields = customFields this.id = id this.name = name @@ -343,7 +342,6 @@ export class RoomService { } - async receiveMessageDelete() { this.WsChatService.updateRoomEventss( @@ -372,14 +370,6 @@ export class RoomService { if(this.messages[i]?._id == id ) { - - //Get previous last message from room - const previousLastMessage = this.messages.slice(-1)[0]; - this.lastMessage = previousLastMessage; - - this.calDateDuration(previousLastMessage._updatedAt) - this.sortRoomList() - if (SessionStore.user.RochetChatUser == this.messages[i]?.u?.username) { const allMemberThatIsOffline = this.getAllMemberThatIsOffline() @@ -393,14 +383,18 @@ export class RoomService { } this.messages[i]?.delateDB() - - console.log(_id,'==',this.messages[i]?._id, true) this.messages.splice(i, 1) + //Get previous last message from room + const previousLastMessage = this.messages.slice(-1)[0]; + this.lastMessage = previousLastMessage; + this.calDateDuration(previousLastMessage._updatedAt) + this.sortRoomList() + return true } else { - console.log(_id,'==',this.messages[i]?._id, false) + // console.log(_id,'==',this.messages[i]?._id, false) } } @@ -429,39 +423,28 @@ export class RoomService { const message = this.messages.find((e)=>e._id == msgId) await message.delateStatusFalse() - this.ChatMethodsService.deleteMessage({_id:msgId, msgId:msgId, roomId:message.rid}).subscribe( - (response: any) => { - + if(this.NetworkServiceService.getCurrentNetworkStatus() == ConnectionStatus.Online) { + + this.WsChatService.deleteMessage(msgId).then(async() => { message.delateRequest = true - message.save() + await message.save() this.deleteMessage(msgId) + }) - }, - (response) => { - - if (response.error.error.startsWith('No message found with the id of')) { + } else { + this.WsChatService.registerCallback({ + type: 'reConnect', + funx: async ()=> { - this.deleteMessage(msgId) - message.delateRequest = true - - } else { - this.WsChatService.registerCallback({ - type: 'reConnect', - funx: async ()=> { - - this.sendDeleteRequest(msgId) - return true - } - }) + this.sendDeleteRequest(msgId) + return true } - - } - ) + }) + } } - /** * @description sen text message */ @@ -628,7 +611,7 @@ export class RoomService { await this.WsChatService.loadHistory(this.id, limit).then( async (chatHistory:chatHistory) => { - console.log('load chatHistory', JSON.stringify(chatHistory)) + // console.log('load chatHistory', JSON.stringify(chatHistory)) const messagesId = this.messages.map((message)=> message._id) @@ -684,7 +667,7 @@ export class RoomService { message = this.fix_updatedAt(message) - const wewMessage = new MessageService(this.storage, this.NfService, this.WsChatService, this.ChatStorageService, this.ChatMethodsService, this.AESEncrypt, this.AttachmentsService) + const wewMessage = new MessageService(this.storage, this.NfService, this.WsChatService, this.ChatStorageService, this.ChatMethodsService, this.AESEncrypt, this.AttachmentsService, this.NetworkServiceService) wewMessage.setData(message) wewMessage.loadHistory = this.hasLoadHistory @@ -741,7 +724,7 @@ export class RoomService { async prepareCreate({message, save = true}): Promise { message = this.fix_updatedAt(message) - const wewMessage = new MessageService(this.storage, this.NfService, this.WsChatService, this.ChatStorageService, this.ChatMethodsService, this.AESEncrypt, this.AttachmentsService) + const wewMessage = new MessageService(this.storage, this.NfService, this.WsChatService, this.ChatStorageService, this.ChatMethodsService, this.AESEncrypt, this.AttachmentsService, this.NetworkServiceService) wewMessage.setData(message) wewMessage.loadHistory = this.hasLoadHistory @@ -753,7 +736,7 @@ export class RoomService { simplePrepareMessage(message) { message = this.fix_updatedAt(message) - const wewMessage = new MessageService(this.storage, this.NfService, this.WsChatService, this.ChatStorageService, this.ChatMethodsService, this.AESEncrypt, this.AttachmentsService) + const wewMessage = new MessageService(this.storage, this.NfService, this.WsChatService, this.ChatStorageService, this.ChatMethodsService, this.AESEncrypt, this.AttachmentsService, this.NetworkServiceService) wewMessage.setData(message) wewMessage.loadHistory = this.hasLoadHistory diff --git a/src/app/services/chat/ws-chat-methods.service.ts b/src/app/services/chat/ws-chat-methods.service.ts index 8bf0bed1f..82dae5b98 100644 --- a/src/app/services/chat/ws-chat-methods.service.ts +++ b/src/app/services/chat/ws-chat-methods.service.ts @@ -20,6 +20,7 @@ import { ChatStorageService } from './chat-storage.service' import { ChatMethodsService } from './chat-methods.service' import { AESEncrypt } from '../aesencrypt.service' import { AttachmentsService } from 'src/app/services/attachments.service'; +import { NetworkServiceService} from 'src/app/services/network-service.service'; @Injectable({ providedIn: 'root' @@ -57,7 +58,8 @@ export class WsChatMethodsService { private ChatStorageService: ChatStorageService, private ChatMethodsService:ChatMethodsService, private AESEncrypt: AESEncrypt, - private AttachmentsService:AttachmentsService + private AttachmentsService:AttachmentsService, + private NetworkServiceService: NetworkServiceService ) { this.loggedUser = authService.ValidatedUserChat['data']; @@ -160,7 +162,10 @@ export class WsChatMethodsService { } catch(e){} - this.sortRoomList() + setTimeout(()=>{ + this.sortRoomList() + }, 1000) + } async getAllRooms () { @@ -204,7 +209,11 @@ export class WsChatMethodsService { console.log('save rooms', rooms) await this.storage.set('Rooms', rooms); - this.sortRoomList() + + setTimeout(()=>{ + this.sortRoomList() + }, 1000) + this.loadingWholeList = false } @@ -307,7 +316,7 @@ export class WsChatMethodsService { // create room if(!this.roomExist(roomId)) { - let room:RoomService = new RoomService(this.WsChatService, new MessageService(this.storage, this.NfService, this.WsChatService, this.ChatStorageService, this.ChatMethodsService, this.AESEncrypt, this.AttachmentsService), this.storage, this.platform, this.sqlservice, this.NativeNotificationService, this.sortService, this.ChatService, this.NfService , this.ChatStorageService, this.ChatMethodsService, this.AESEncrypt, this.AttachmentsService) + let room:RoomService = new RoomService(this.WsChatService, new MessageService(this.storage, this.NfService, this.WsChatService, this.ChatStorageService, this.ChatMethodsService, this.AESEncrypt, this.AttachmentsService, this.NetworkServiceService), this.storage, this.platform, this.sqlservice, this.NativeNotificationService, this.sortService, this.ChatService, this.NfService , this.ChatStorageService, this.ChatMethodsService, this.AESEncrypt, this.AttachmentsService, this.NetworkServiceService) room.setData(setData) room.receiveMessage() room.getAllUsers = this.getUsers diff --git a/src/app/services/network-service.service.spec.ts b/src/app/services/network-service.service.spec.ts new file mode 100644 index 000000000..987fc15ec --- /dev/null +++ b/src/app/services/network-service.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { NetworkServiceService } from './network-service.service'; + +describe('NetworkServiceService', () => { + let service: NetworkServiceService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(NetworkServiceService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/services/network-service.service.ts b/src/app/services/network-service.service.ts new file mode 100644 index 000000000..8e5e32d36 --- /dev/null +++ b/src/app/services/network-service.service.ts @@ -0,0 +1,62 @@ +import { Injectable } from '@angular/core'; +import { ToastController, Platform } from '@ionic/angular'; +import { BehaviorSubject, Observable } from 'rxjs'; +import { Network } from '@ionic-native/network/ngx' + + +export enum ConnectionStatus { + Online, + Offline +} + + +@Injectable({ + providedIn: 'root' +}) +export class NetworkServiceService { + private status: BehaviorSubject = new BehaviorSubject(ConnectionStatus.Offline); + + constructor(private network: Network, private toastController: ToastController, private plt: Platform) { + this.plt.ready().then(() => { + this.initializeNetworkEvents(); + let status = this.network.type !== 'none' ? ConnectionStatus.Online : ConnectionStatus.Offline; + this.status.next(status); + }); + + } + + public initializeNetworkEvents() { + + this.network.onDisconnect().subscribe(() => { + if (this.status.getValue() === ConnectionStatus.Online) { + this.updateNetworkStatus(ConnectionStatus.Offline); + } + }); + + this.network.onConnect().subscribe(() => { + if (this.status.getValue() === ConnectionStatus.Offline) { + this.updateNetworkStatus(ConnectionStatus.Online); + } + }); + } + + private async updateNetworkStatus(status: ConnectionStatus) { + this.status.next(status); + + let connection = status == ConnectionStatus.Offline ? 'Offline' : 'Online'; + let toast = this.toastController.create({ + message: `You are now ${connection}`, + duration: 3000, + position: 'bottom' + }); + toast.then(toast => toast.present()); + } + + public onNetworkChange(): Observable { + return this.status.asObservable(); + } + + public getCurrentNetworkStatus(): ConnectionStatus { + return this.status.getValue(); + } +} diff --git a/src/app/services/permission.service.ts b/src/app/services/permission.service.ts index 9d350366e..a02dd401a 100644 --- a/src/app/services/permission.service.ts +++ b/src/app/services/permission.service.ts @@ -23,8 +23,10 @@ export class PermissionService { if(!Array.isArray(args)) { args = [args] } - for(let permission of this.SessionStore.user.UserPermissions){ - if (args.includes(permission)){ + + + for(let permission of (this.SessionStore.user.UserPermissions || [])) { + if (args.includes(permission)) { return true; } } @@ -42,7 +44,7 @@ export class PermissionService { role = [role] } - if(!UserRoleIsValid) {return false } + if(!UserRoleIsValid) { return false } return true diff --git a/src/app/shared/chat/group-messages/group-messages.page.html b/src/app/shared/chat/group-messages/group-messages.page.html index e9cf98ea0..2e0a784e4 100644 --- a/src/app/shared/chat/group-messages/group-messages.page.html +++ b/src/app/shared/chat/group-messages/group-messages.page.html @@ -130,7 +130,6 @@
-
Alterou o nome do grupo para "{{msg.msg.split('-').join(' ')}}"
{{last ? scrollToBottom() : ''}} diff --git a/src/app/shared/chat/messages/messages.page.ts b/src/app/shared/chat/messages/messages.page.ts index 3e3b4afd3..bba14b36c 100644 --- a/src/app/shared/chat/messages/messages.page.ts +++ b/src/app/shared/chat/messages/messages.page.ts @@ -253,7 +253,7 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy this.storage.get('fileName').then((fileName) => { this.lastAudioRecorded = fileName; }) - + this.storage.get('recordData').then((recordData) => { console.log(recordData); if(recordData?.value?.recordDataBase64.includes('data:audio')){ @@ -265,7 +265,7 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy }); } catch (error) {} - + } startRecording() { @@ -389,6 +389,8 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy this.audioRecorded = `data:${recordData.value.mimeType};base64,${recordData?.value?.recordDataBase64}`; } + console.log(this.audioRecorded); + //Converting base64 to blob const encodedData = btoa(this.audioRecorded); const blob = this.base64toBlob(encodedData, recordData.value.mimeType) diff --git a/src/app/shared/header/header.page.html b/src/app/shared/header/header.page.html index 01a982036..016b7f375 100644 --- a/src/app/shared/header/header.page.html +++ b/src/app/shared/header/header.page.html @@ -66,7 +66,7 @@
-
diff --git a/src/app/shared/header/header.page.ts b/src/app/shared/header/header.page.ts index c92feddb9..36a61ad9c 100644 --- a/src/app/shared/header/header.page.ts +++ b/src/app/shared/header/header.page.ts @@ -6,13 +6,13 @@ import { LoginUserRespose } from 'src/app/models/user.model'; import { ProfilePage } from 'src/app/modals/profile/profile.page'; import { StorageService } from '../../services/storage.service'; import { SessionStore } from 'src/app/store/session.service'; -//import { NotificationsService } from '../../services/notifications.service'; import { environment } from 'src/environments/environment'; import { EventTrigger } from '../../services/eventTrigger.service'; import { ThemeService } from '../../services/theme.service'; import { interval } from 'rxjs'; import { RouteService } from 'src/app/services/route.service'; import { PermissionList } from 'src/app/models/permissionList'; +import { PermissionService } from 'src/app/services/permission.service'; @Component({ selector: 'app-header', @@ -43,7 +43,8 @@ export class HeaderPage implements OnInit { //private notificationsService: NotificationsService, private eventrigger: EventTrigger, public ThemeService: ThemeService, - public RouteService: RouteService + public RouteService: RouteService, + public p: PermissionService, ) { this.loggeduser = SessionStore.user; router.events.subscribe((val) => { diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts index e5f72e4c6..0a5b0df12 100644 --- a/src/environments/environment.prod.ts +++ b/src/environments/environment.prod.ts @@ -1,8 +1,11 @@ export const environment = { - production: true, + apiURL: 'https://gabinetedigital.dyndns.info/GabineteDigital.Services/V5/api/', apiChatUrl: 'https://gabinetedigitalchat.dyndns.info/api/v1/', apiWsChatUrl: 'wss://gabinetedigitalchat.dyndns.info/websocket', + //apiChatUrl: 'https://www.tabularium.pt/api/v1/', + + production: true, domain: 'gabinetedigital.local', defaultuser: '',//paulo.pinto paulo.pinto@gabinetedigital.local defaultuserpwd: '', //tabteste@006, diff --git a/src/environments/environment.ts b/src/environments/environment.ts index 79baa6103..3fa4b4df2 100644 --- a/src/environments/environment.ts +++ b/src/environments/environment.ts @@ -4,10 +4,10 @@ export const environment = { production: false, - /* apiURL: 'https://gabinetedigital.dyndns.info/GabineteDigital.Services/V5/api/', - apiChatUrl: 'https://gabinetedigitalchat.dyndns.info/api/v1/', - apiWsChatUrl: 'wss://gabinetedigitalchat.dyndns.info/websocket', */ + //apiURL: 'https://gabinetedigital.dyndns.info/GabineteDigital.Services/V5/api/', apiURL: 'http://gpr-dev-01.gabinetedigital.local/GabineteDigital.Services/V5/api/', + /* apiChatUrl: 'https://gabinetedigitalchat.dyndns.info/api/v1/', + apiWsChatUrl: 'wss://gabinetedigitalchat.dyndns.info/websocket', */ apiChatUrl: 'https://www.tabularium.pt/api/v1/', apiWsChatUrl: 'wss://www.tabularium.pt/websocket', /* apiChatUrl: 'http://chat.gabinetedigital.local:3000/api/v1/', */