Merge branch 'feature/chat-v0' of bitbucket.org:equilibriumito/gabinete-digital into feature/chat-v0

This commit is contained in:
tiago.kayaya
2022-03-29 16:55:35 +01:00
22 changed files with 240 additions and 123 deletions
+6 -6
View File
@@ -3175,9 +3175,9 @@
}
},
"@ionic-native/network": {
"version": "5.36.0",
"resolved": "https://registry.npmjs.org/@ionic-native/network/-/network-5.36.0.tgz",
"integrity": "sha512-gpa7cJqodEK+zmmViYJCqEpXoKSXcaYLaaRKdv5gn5M++bpmiw2pKM9JH8VoqYWaYDcUwD3S0yYeBBkG5DE0Kg==",
"version": "5.22.0-beta-1",
"resolved": "https://registry.npmjs.org/@ionic-native/network/-/network-5.22.0-beta-1.tgz",
"integrity": "sha512-reOgFhHkyzCujqoGc1x8U9AZ40SBzdYT4HCFA6L2RwQT1NMyv+sDsp5er64p419Rfxg1k2QVTaDlEh+xPwhEqQ==",
"requires": {
"@types/cordova": "^0.0.34"
},
@@ -6230,9 +6230,9 @@
}
},
"beast-orm": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/beast-orm/-/beast-orm-1.0.1.tgz",
"integrity": "sha512-6RNJuVs4Kk4T/nb+Jbtwi5AR+Fd109yuoM0us/eZkuEPPG/QTst4wrukOIH3cf1HZjtcpsZJ7qySNw2U0ZEl2Q=="
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/beast-orm/-/beast-orm-1.0.3.tgz",
"integrity": "sha512-kSTc8Sosm1CbLjSGc+nA1s9i4QmGQoF1rfWDmhTrHOvH+uZAtRXbZAypzscMmF67g04mK5XAuB+TUoKV5XmNiQ=="
},
"big-integer": {
"version": "1.6.49",
+2 -2
View File
@@ -72,7 +72,7 @@
"@ionic-native/local-notifications": "^4.20.0",
"@ionic-native/media": "^5.36.0",
"@ionic-native/media-capture": "^5.36.0",
"@ionic-native/network": "^5.36.0",
"@ionic-native/network": "^5.22.0-beta-1",
"@ionic-native/photo-viewer": "^5.36.0",
"@ionic-native/screen-orientation": "^5.35.0",
"@ionic-native/social-sharing": "^5.36.0",
@@ -99,7 +99,7 @@
"angular-svg-icon": "^12.0.0",
"angular-tag-cloud-module": "^5.2.2",
"base64-js": "^1.5.1",
"beast-orm": "1.0.1",
"beast-orm": "^1.0.3",
"bootstrap": "^4.5.0",
"build": "0.1.4",
"capacitor-voice-recorder": "^2.1.0",
+27 -5
View File
@@ -3,15 +3,20 @@ import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot, UrlTr
import { Observable } from 'rxjs';
import { SessionStore } from '../store/session.service';
import { AlertController, Platform } from '@ionic/angular';
import { PermissionService } from '../services/permission.service';
import { PermissionList } from '../models/permissionList';
@Injectable({
providedIn: 'root'
})
export class InactivityGuard implements CanActivate {
permissionList = new PermissionList();
constructor(
private router:Router,
private platform: Platform,
public permissionService: PermissionService,
){}
canActivate(
@@ -19,17 +24,34 @@ export class InactivityGuard implements CanActivate {
state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
if (this.platform.is('desktop') || this.platform.is('mobileweb')) {
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']);
}
return false
} else if(SessionStore.exist && SessionStore.user.Inactivity && !SessionStore.hasPin ) {
return true
} else if(SessionStore.exist && !SessionStore.user.Inactivity) {
return true
} else {
this.router.navigate(['/home/events']);
}//Mobile or Tablet without session
else {
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']);
}
return false
}
}
}
+1 -1
View File
@@ -2,7 +2,7 @@
<ion-tabs class="tab">
<ion-tab-bar class="bottoms" slot="bottom">
<ion-tab-button tab="events" [class.active]="pathname === '/home/events'">
<ion-tab-button *ngIf="p.userPermission([permissionList.Agenda]) || p.userPermission([permissionList.Gabinete])" tab="events" [class.active]="pathname === '/home/events'">
<!-- <ion-icon name="home"></ion-icon> -->
<ion-icon *ngIf="pathname != '/home/events'" class="nav-icon" src="assets/images/icons-nav-home.svg"></ion-icon>
<ion-icon *ngIf="pathname == '/home/events'" class="nav-icon" src="assets/images/nav-hover/icons-nav-home-active.svg"></ion-icon>
+10 -9
View File
@@ -1,7 +1,7 @@
import { models } from 'beast-orm'
import { AESEncrypt } from '../services/aesencrypt.service'
const _AESEncrypt = new AESEncrypt()
const _AESEncrypt = new AESEncrypt()
const { ArrayField, JsonField} = models.indexedDB.fields
export class MessageModel extends models.Model {
@@ -12,12 +12,12 @@ export class MessageModel extends models.Model {
rid = models.CharField()
ts = JsonField({blank:true})
u = JsonField()
_id = models.CharField({unique:true, blank:true})
_id = models.CharField({blank:true})
_updatedAt = models.IntegerField()
messageSend = models.BooleanField()
offline = models.BooleanField()
viewed = ArrayField()
received = ArrayField()
viewed = ArrayField({blank:true})
received = ArrayField({blank:true})
localReference = models.CharField({blank:true})
attachments = ArrayField({blank:true})
file = JsonField({blank:true})
@@ -28,17 +28,18 @@ export class DeleteMessageModel extends models.Model {
messageId = models.CharField()
rid = models.CharField()
ts = JsonField()
u = JsonField()
needToReceiveBy = ArrayField()
}
models.register({
databaseName: 'chat-storage',
type: 'indexedDB',
version: 1,
type: 'indexedDB',
version: 4,
models: [MessageModel, DeleteMessageModel]
})
})
window['MessageModel'] = MessageModel
+3 -1
View File
@@ -395,7 +395,7 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy {
const roomId = this.roomId
let audioFile;
this.storage.get('recordData').then((recordData) => {
console.log(recordData);
audioFile = recordData;
if(recordData?.value?.recordDataBase64.includes('data:audio')){
this.audioRecorded = recordData?.value?.recordDataBase64;
@@ -404,6 +404,8 @@ export class MessagesPage implements OnInit, 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)
@@ -11,7 +11,7 @@
<div class="main-content d-flex height-100 border-t-radius">
<!-- Aside left -->
<div *ngIf="p.per([permission.Agenda])" class="aside-wrapper d-flex flex-column width-md-40 flex-grow-1">
<div class="aside-wrapper d-flex flex-column width-md-40 flex-grow-1">
<ion-progress-bar type="indeterminate" *ngIf="showLoader"></ion-progress-bar>
<div class="title-container">
<div class="title">
+24 -9
View File
@@ -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']);
}
}
}
-1
View File
@@ -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));
@@ -47,13 +47,8 @@ export class ChatMethodsService {
return this.chatService.sendMessage(body)
}
deleteMessage(body) {
return this.chatService.deleteMessage(body)
}
}
+27 -21
View File
@@ -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)
+28 -45
View File
@@ -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<MessageService> {
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
@@ -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
@@ -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();
});
});
@@ -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<ConnectionStatus> = 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<ConnectionStatus> {
return this.status.asObservable();
}
public getCurrentNetworkStatus(): ConnectionStatus {
return this.status.getValue();
}
}
+5 -3
View File
@@ -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
@@ -130,7 +130,6 @@
</div>
<div *ngIf="msg.t == 'r'" class="info-text">
<ion-label>Alterou o nome do grupo para "{{msg.msg.split('-').join(' ')}}"</ion-label><br />
{{last ? scrollToBottom() : ''}}
@@ -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)
+1 -1
View File
@@ -66,7 +66,7 @@
<div class="d-flex flex-1 pr-20 pl-50">
<div class="tab mr-20 d-flex align-center cursor-pointer" (click)="changeRoute('/home/events')"
<div *ngIf="p.userPermission([permissionList.Agenda]) || p.userPermission([permissionList.Gabinete])" class="tab mr-20 d-flex align-center cursor-pointer" (click)="changeRoute('/home/events')"
[class.active]="locationPathname() == '/home/events'">
<ion-icon *ngIf="ThemeService.currentTheme == 'default' " class="font-40" src='assets/images/icons-nav-home-active-black.svg'></ion-icon>
+3 -2
View File
@@ -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) => {
+4 -1
View File
@@ -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,
+3 -3
View File
@@ -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/', */