mirror of
https://code.equilibrium.co.ao/ITO/doneit-web.git
synced 2026-04-18 20:47:54 +00:00
1 line
104 KiB
JSON
1 line
104 KiB
JSON
{"ast":null,"code":"import _asyncToGenerator from \"C:/Users/eudes.inacio/GabineteDigital/gabinete-digital-fo/node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js\";\nimport { __decorate } from \"tslib\";\nimport __NG_CLI_RESOURCE__0 from \"./group-messages.page.html?ngResource\";\nimport __NG_CLI_RESOURCE__1 from \"./group-messages.page.scss?ngResource\";\nimport { Component, ViewChild, ChangeDetectorRef } from '@angular/core';\nimport { ModalController, NavParams, PopoverController, Platform } from '@ionic/angular';\nimport { AlertService } from 'src/app/services/alert.service';\nimport { ChatService } from 'src/app/services/chat.service';\nimport { ChatOptionsPopoverPage } from 'src/app/shared/popover/chat-options-popover/chat-options-popover.page';\nimport { ChatPopoverPage } from 'src/app/shared/popover/chat-popover/chat-popover.page';\nimport { GroupContactsPage } from './group-contacts/group-contacts.page';\nimport { Router } from '@angular/router';\nimport { EditGroupPage } from '../edit-group/edit-group.page';\nimport { TimeService } from 'src/app/services/functions/time.service';\nimport { FileService } from 'src/app/services/functions/file.service';\nimport { ToastService } from 'src/app/services/toast.service';\nimport { environment } from 'src/environments/environment';\nimport { NewEventPage } from '../../agenda/new-event/new-event.page';\nimport { ViewDocumentPage } from 'src/app/modals/view-document/view-document.page';\nimport { ThemeService } from 'src/app/services/theme.service';\nimport { ViewEventPage } from 'src/app/modals/view-event/view-event.page';\nimport { SqliteService } from 'src/app/services/sqlite.service';\nimport { ChatSystemService } from 'src/app/services/chat/chat-system.service';\nimport { Storage } from '@ionic/storage';\nimport { CameraService } from 'src/app/services/camera.service';\nimport { SearchPage } from 'src/app/pages/search/search.page';\nimport { VoiceRecorder } from 'capacitor-voice-recorder';\nimport { Filesystem, Directory } from '@capacitor/filesystem';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { File } from '@awesome-cordova-plugins/file/ngx';\nimport { FileOpener } from '@awesome-cordova-plugins/file-opener/ngx';\nimport { SessionStore } from 'src/app/store/session.service';\nimport { ViewMediaPage } from 'src/app/modals/view-media/view-media.page';\nlet GroupMessagesPage = class GroupMessagesPage {\n constructor(modalController, popoverController, chatService, navParams, alertService, route, timeService, fileService, toastService, ThemeService, changeDetectorRef, sqlservice, platform, ChatSystemService, storage, CameraService, sanitiser, file, fileOpener) {\n this.modalController = modalController;\n this.popoverController = popoverController;\n this.chatService = chatService;\n this.navParams = navParams;\n this.alertService = alertService;\n this.route = route;\n this.timeService = timeService;\n this.fileService = fileService;\n this.toastService = toastService;\n this.ThemeService = ThemeService;\n this.changeDetectorRef = changeDetectorRef;\n this.sqlservice = sqlservice;\n this.platform = platform;\n this.ChatSystemService = ChatSystemService;\n this.storage = storage;\n this.CameraService = CameraService;\n this.sanitiser = sanitiser;\n this.file = file;\n this.fileOpener = fileOpener;\n this.members = [];\n this.contacts = [\" Ana M.\", \"Andre F.\", \"Bruno G.\", \"Catarina T\", \"Tiago\"];\n this.allUsers = [];\n this.eventSelectedDate = new Date();\n this.scrollingOnce = true;\n this.attendees = [];\n this.scrollToBottomBtn = false;\n this.longPressActive = false;\n this.showMessageOptions = false;\n this.groupNameFormart = \"\";\n this.recording = false;\n this.allowTyping = true;\n this.storedFileNames = [];\n this.lastAudioRecorded = '';\n this.audioRecorded = \"\";\n this.audioDownloaded = \"\";\n this.durationDisplay = '';\n this.duration = 0;\n this.showAvatar = true;\n this.audioPermissionStatus = null;\n this.sessionStore = SessionStore;\n this.isAdmin = false;\n this.scrollToBottomClicked = () => {\n try {\n this.myScrollContainer.nativeElement.scrollTop = this.myScrollContainer.nativeElement.scrollHeight;\n } catch (err) {}\n };\n this.sliderOpts = {\n zoom: false,\n slidesPerView: 1.5,\n spaceBetween: 20,\n centeredSlides: true\n };\n this.zoomActive = false;\n this.zoomScale = 1;\n this.sliderZoomOpts = {\n allowSlidePrev: false,\n allowSlideNext: false,\n zoom: {\n maxRatio: 5\n },\n on: {\n zoomChange: (scale, imageEl, slideEl) => {\n this.zoomActive = true;\n this.zoomScale = scale / 5;\n this.changeDetectorRef.detectChanges();\n }\n }\n };\n this.loggedUserChat = SessionStore.user.ChatData['data'];\n this.isGroupCreated = true;\n this.roomId = this.navParams.get('roomId');\n window.onresize = event => {\n if (window.innerWidth > 701) {\n this.modalController.dismiss();\n }\n };\n this.ChatSystemService.getGroupRoom(this.roomId).loadHistory({});\n this.ChatSystemService.getGroupRoom(this.roomId).scrollDown = this.scrollToBottomClicked;\n this.ChatSystemService.openRoom(this.roomId);\n this.groupNameFormart = this.ChatSystemService.getGroupRoom(this.roomId).name.split('-').join(' ');\n setTimeout(() => {\n this.scrollToBottomClicked();\n }, 50);\n this.showAvatar = false;\n setTimeout(() => {\n this.scrollToBottomClicked();\n this.showAvatar = true;\n }, 150);\n }\n ngOnInit() {\n this.loggedUser = this.loggedUserChat;\n this.getRoomInfo();\n this.scrollToBottom();\n this.serverLongPull();\n this.setStatus('online');\n this.getChatMembers();\n // this.getRoomMessageDB(this.roomId);\n this.getGroupContacts({});\n }\n setStatus(status) {\n let body = {\n message: '',\n status: status\n };\n // this.chatService.setUserStatus(body).subscribe(res => {\n // \n // })\n }\n\n deleteMessage(msgId) {\n const room = this.ChatSystemService.getGroupRoom(this.roomId);\n this.alertService.confirmDeleteMessage(msgId, room);\n }\n ngAfterViewInit() {\n this.scrollChangeCallback = () => this.onContentScrolled(event);\n window.addEventListener('scroll', this.scrollChangeCallback, true);\n if (this.room?.customFields?.countDownDate) {\n this.roomCountDownDate = this.timeService.countDownDate(this.room.customFields.countDownDate, this.room._id);\n }\n }\n handlePress(id) {\n this.selectedMsgId = id;\n this.showMessageOptions = true;\n }\n handleClick() {\n this.showMessageOptions = false;\n this.selectedMsgId = \"\";\n }\n onContentScrolled(e) {\n this.startPosition = e.srcElement.scrollTop;\n let scroll = e.srcElement.scrollTop;\n let windowHeight = e.srcElement.scrollHeight;\n let containerHeight = windowHeight - e.srcElement.clientHeight;\n if (scroll > this.currentPosition) {} else {\n this.scrollingOnce = false;\n }\n if (containerHeight - 100 > scroll) {\n this.scrollToBottomBtn = true;\n } else {\n this.scrollToBottomBtn = false;\n }\n this.currentPosition = scroll;\n }\n calculateDuration() {\n if (!this.recording) {\n this.duration = 0;\n this.durationDisplay = '';\n return;\n }\n this.duration += 1;\n const minutes = Math.floor(this.duration / 60);\n const seconds = (this.duration % 60).toString().padStart(2, '0');\n this.durationDisplay = `${minutes}:${seconds}`;\n setTimeout(() => {\n this.calculateDuration();\n }, 1000);\n }\n getFile(fileName) {\n var _this = this;\n return _asyncToGenerator(function* () {\n const audioFile = yield Filesystem.readFile({\n path: fileName,\n directory: Directory.Data\n });\n //\n const base64sound = audioFile.data;\n //Converting base64 to blob\n const base64 = yield fetch(base64sound);\n //\n const base64Response = yield fetch(`data:audio/ogg;base64,${base64sound}`);\n //\n _this.audioRecorded = base64Response.url;\n })();\n }\n loadFiles() {\n var _this2 = this;\n return _asyncToGenerator(function* () {\n _this2.storage.get('fileName').then(fileName => {\n _this2.lastAudioRecorded = fileName;\n });\n try {\n _this2.storage.get('recordData').then(recordData => {\n if (recordData?.value?.recordDataBase64.includes('data:audio')) {\n _this2.audioRecorded = _this2.sanitiser.bypassSecurityTrustResourceUrl(recordData?.value?.recordDataBase64);\n } else if (recordData?.value?.mimeType && recordData?.value?.recordDataBase64) {\n _this2.audioRecorded = _this2.sanitiser.bypassSecurityTrustResourceUrl(`data:${recordData.value.mimeType};base64,${recordData?.value?.recordDataBase64}`);\n }\n });\n } catch (error) {}\n })();\n }\n stopRecording() {\n var _this3 = this;\n this.deleteRecording();\n this.allowTyping = false;\n if (!this.recording) {\n return;\n }\n this.recording = false;\n VoiceRecorder.stopRecording().then( /*#__PURE__*/function () {\n var _ref = _asyncToGenerator(function* (result) {\n _this3.recording = false;\n if (result.value && result.value.recordDataBase64) {\n const recordData = result.value.recordDataBase64;\n //\n const fileName = new Date().getTime() + \".mp3\";\n //Save file\n yield _this3.storage.set('fileName', fileName);\n _this3.storage.set('recordData', result).then(() => {\n setTimeout( /*#__PURE__*/_asyncToGenerator(function* () {\n _this3.loadFiles();\n }), 1000);\n });\n }\n });\n return function (_x) {\n return _ref.apply(this, arguments);\n };\n }());\n }\n startRecording() {\n var _this4 = this;\n return _asyncToGenerator(function* () {\n VoiceRecorder.requestAudioRecordingPermission();\n if (yield VoiceRecorder.canDeviceVoiceRecord().then(result => {\n return result.value;\n })) {\n if (yield VoiceRecorder.requestAudioRecordingPermission().then(result => {\n return result.value;\n })) {\n //if(await this.hasAudioRecordingPermission()){\n if (_this4.recording) {\n return;\n }\n _this4.recording = true;\n VoiceRecorder.startRecording();\n _this4.calculateDuration();\n //}\n } else {\n _this4.toastService._badRequest('Para gravar uma mensagem de voz, permita o acesso do Gabinete Digital ao seu microfone.');\n }\n } else {\n _this4.toastService._badRequest('Este dispositivo não tem capacidade para gravação de áudio!');\n }\n })();\n }\n deleteRecording() {\n var _this5 = this;\n return _asyncToGenerator(function* () {\n _this5.storage.remove('fileName');\n _this5.storage.remove('recordData');\n _this5.allowTyping = true;\n _this5.lastAudioRecorded = '';\n _this5.loadFiles();\n })();\n }\n goToEvent(event) {\n var _this6 = this;\n return _asyncToGenerator(function* () {\n let classs;\n if (window.innerWidth < 701) {\n classs = 'modal modal-desktop';\n } else {\n classs = 'modal modal-desktop showAsideOptions';\n }\n const modal = yield _this6.modalController.create({\n component: ViewEventPage,\n componentProps: {\n eventId: event.id,\n CalendarId: event.calendarId\n },\n cssClass: classs\n });\n yield modal.present();\n modal.onDidDismiss().then(res => {});\n })();\n }\n ngOnDestroy() {\n window.removeEventListener('scroll', this.scrollChangeCallback, true);\n }\n scrollToBottom() {\n try {\n if (this.scrollingOnce) {\n this.myScrollContainer.nativeElement.scrollTop = this.myScrollContainer.nativeElement.scrollHeight;\n //this.scrollingOnce = false;\n }\n } catch (err) {}\n }\n getRoomInfo() {\n var _this7 = this;\n return _asyncToGenerator(function* () {\n _this7.showLoader = true;\n // this.chatService.getRoomInfo(this.roomId).subscribe(room => {\n // this.room = room['room'];\n // this.roomName = this.room.name.split('-').join(' ');\n // if (this.room.customFields.countDownDate) {\n // this.roomCountDownDate = this.timeService.countDownDateTimer(this.room.customFields.countDownDate, this.room._id);\n // }\n // this.getGroupContacts(this.room);\n // this.showLoader = false;\n // });\n _this7.ChatSystemService.getGroupRoom(_this7.roomId).loadHistory({});\n let room = yield _this7.chatService.getRoomInfo(_this7.roomId).toPromise();\n // console.log('ROOM',room)\n _this7.room = room['room'];\n if (_this7.room.name) {\n try {\n _this7.roomName = _this7.room.name.split('-').join(' ');\n } catch (error) {\n _this7.roomName = _this7.room.name;\n }\n }\n if (SessionStore.user.ChatData.data.userId == _this7.room.u._id) {\n _this7.isAdmin = true;\n } else {\n _this7.isAdmin = false;\n }\n if (_this7.room.customFields.countDownDate) {\n _this7.roomCountDownDate = _this7.room.customFields.countDownDate;\n }\n })();\n }\n getChatMembers() {\n var _this8 = this;\n return _asyncToGenerator(function* () {\n _this8.chatService.getAllUsers().subscribe(res => {\n _this8.allUsers = res['users'].filter(data => data.username != SessionStore.user.UserName);\n });\n })();\n }\n /* load(){\r\n this.getGroupContacts();\r\n this.loadGroupMessages();\r\n } */\n close() {\n this.modalController.dismiss();\n this.deleteRecording();\n }\n doRefresh(ev) {\n this.getRoomInfo();\n ev.target.complete();\n }\n getGroupContacts(room) {\n // this.showLoader = true;\n // //If group is private call getGroupMembers\n // if (this.room.t === 'p') {\n // this.chatService.getGroupMembers(this.roomId).subscribe(res => {\n // this.members = res['members'];\n // this.showLoader = false;\n // });\n // }\n // //Otherwise call getChannelMembers for públic groups\n // else {\n // this.chatService.getChannelMembers(this.roomId).subscribe(res => {\n // this.members = res['members'];\n // this.showLoader = false;\n // });\n // }\n this.members = this.ChatSystemService.getGroupRoom(this.roomId).members;\n }\n showDateDuration(start) {\n return this.timeService.showDateDuration(start);\n }\n countDownDate(date, roomId) {\n this.roomCountDownDate = this.timeService.countDownDate(date, roomId);\n return this.timeService.countDownDateTimer(date, roomId);\n }\n addZero(i) {\n if (i < 10) {\n i = \"0\" + i;\n }\n return i;\n }\n sendMessage() {\n this.ChatSystemService.getGroupRoom(this.roomId).send({});\n }\n base64toBlob(base64Data, contentType) {\n contentType = contentType || '';\n var sliceSize = 1024;\n var byteCharacters = atob(base64Data);\n var bytesLength = byteCharacters.length;\n var slicesCount = Math.ceil(bytesLength / sliceSize);\n var byteArrays = new Array(slicesCount);\n for (var sliceIndex = 0; sliceIndex < slicesCount; ++sliceIndex) {\n var begin = sliceIndex * sliceSize;\n var end = Math.min(begin + sliceSize, bytesLength);\n var bytes = new Array(end - begin);\n for (var offset = begin, i = 0; offset < end; ++i, ++offset) {\n bytes[i] = byteCharacters[offset].charCodeAt(0);\n }\n byteArrays[sliceIndex] = new Uint8Array(bytes);\n }\n return new Blob(byteArrays, {\n type: contentType\n });\n }\n sendAudio(fileName) {\n var _this9 = this;\n return _asyncToGenerator(function* () {\n const roomId = _this9.roomId;\n let audioFile;\n _this9.storage.get('recordData').then(recordData => {\n audioFile = recordData;\n if (recordData?.value?.recordDataBase64.includes('data:audio')) {\n _this9.audioRecorded = recordData?.value?.recordDataBase64;\n } else if (recordData?.value?.mimeType && recordData?.value?.recordDataBase64) {\n _this9.audioRecorded = `data:${recordData.value.mimeType};base64,${recordData?.value?.recordDataBase64}`;\n }\n //Converting base64 to blob\n const encodedData = btoa(_this9.audioRecorded);\n const blob = _this9.base64toBlob(encodedData, recordData.value.mimeType);\n const formData = new FormData();\n formData.append(\"blobFile\", blob);\n _this9.ChatSystemService.getGroupRoom(roomId).send({\n file: {\n \"type\": \"application/audio\",\n \"msDuration\": audioFile.value.msDuration,\n \"mimeType\": audioFile.value.mimeType\n },\n attachments: [{\n \"title\": fileName,\n \"title_link_download\": true,\n \"type\": \"audio\"\n }],\n temporaryData: formData\n });\n });\n _this9.deleteRecording();\n })();\n }\n openOptions() {\n var _this10 = this;\n return _asyncToGenerator(function* () {\n const modal = yield _this10.popoverController.create({\n component: ChatPopoverPage,\n cssClass: 'popover-bottom',\n componentProps: {\n roomId: _this10.roomId,\n members: _this10.members,\n isAdmin: _this10.isAdmin,\n isCreated: _this10.isGroupCreated,\n room: _this10.room,\n name: _this10.room.name\n }\n });\n yield modal.present();\n modal.onDidDismiss().then(res => {\n if (res.data == 'leave') {\n //this.ChatSystemService.subscribeToRoomUpdate(this.roomId, this.room);\n } else if (res.data == 'cancel') {} else if (res.data == 'edit') {\n _this10.editGroup(_this10.roomId);\n } else if (res.data == 'addUser') {\n _this10.addContacts();\n }\n });\n })();\n }\n viewDocument(file, url) {\n if (file.type == \"application/webtrix\") {\n this.openViewDocumentModal(file);\n } else {\n let fullUrl = \"https://www.tabularium.pt\" + url;\n this.fileService.viewDocumentByUrl(fullUrl);\n }\n }\n openViewDocumentModal(file) {\n var _this11 = this;\n return _asyncToGenerator(function* () {\n let task = {\n serialNumber: '',\n taskStartDate: '',\n isEvent: true,\n workflowInstanceDataFields: {\n FolderID: '',\n Subject: file.Assunto,\n SourceSecFsID: file.ApplicationId,\n SourceType: 'DOC',\n SourceID: file.DocId,\n DispatchNumber: ''\n }\n };\n let doc = {\n \"Id\": \"\",\n \"ParentId\": \"\",\n \"Source\": 1,\n \"ApplicationId\": file.ApplicationId,\n \"CreateDate\": \"\",\n \"Data\": null,\n \"Description\": \"\",\n \"Link\": null,\n \"SourceId\": file.DocId,\n \"SourceName\": file.Assunto,\n \"Stakeholders\": \"\"\n };\n const modal = yield _this11.modalController.create({\n component: ViewDocumentPage,\n componentProps: {\n trustedUrl: '',\n file: {\n title: file.Assunto,\n url: '',\n title_link: ''\n },\n Document: doc,\n applicationId: file.ApplicationId,\n docId: file.DocId,\n folderId: '',\n task: task\n },\n cssClass: 'modal modal-desktop'\n });\n yield modal.present();\n })();\n }\n bookMeeting() {\n var _this12 = this;\n return _asyncToGenerator(function* () {\n _this12.getGroupContacts({});\n _this12.attendees = _this12.members.map(val => {\n return {\n Name: val.name,\n EmailAddress: val.username + \"@\" + environment.domain,\n IsRequired: \"true\"\n };\n });\n // this.popoverController.dismiss();\n const modal = yield _this12.modalController.create({\n component: NewEventPage,\n componentProps: {\n attendees: _this12.attendees\n },\n cssClass: 'modal modal-desktop',\n backdropDismiss: false\n });\n yield modal.present();\n modal.onDidDismiss().then(data => {\n if (data) {}\n });\n })();\n }\n takePicture() {\n var _this13 = this;\n return _asyncToGenerator(function* () {\n const roomId = _this13.roomId;\n const image = yield _this13.CameraService.takePicture();\n yield _this13.fileService.saveImage(image);\n const lastphoto = yield _this13.fileService.loadFiles();\n const {\n capturedImage,\n capturedImageTitle\n } = yield _this13.fileService.loadFileData(lastphoto);\n const base64 = yield fetch(capturedImage);\n const blob = yield base64.blob();\n const formData = new FormData();\n formData.append(\"blobFile\", blob);\n _this13.ChatSystemService.getGroupRoom(roomId).send({\n file: {\n \"type\": \"application/img\",\n \"guid\": ''\n },\n temporaryData: formData,\n attachments: [{\n \"title\": capturedImageTitle,\n \"text\": \"description\",\n \"title_link_download\": false\n }]\n });\n })();\n }\n addImage() {\n var _this14 = this;\n return _asyncToGenerator(function* () {\n _this14.addFileToChat(['image/apng', 'image/jpeg', 'image/png']);\n })();\n }\n addFile() {\n var _this15 = this;\n return _asyncToGenerator(function* () {\n _this15.addFileToChat(['.doc', '.docx', '.pdf']);\n })();\n }\n addFileWebtrix() {\n var _this16 = this;\n return _asyncToGenerator(function* () {\n const modal = yield _this16.modalController.create({\n component: SearchPage,\n cssClass: 'group-messages modal-desktop search-modal search-modal-to-desktop',\n componentProps: {\n type: 'AccoesPresidenciais & ArquivoDespachoElect',\n select: true,\n showSearchInput: true\n }\n });\n yield modal.present();\n modal.onDidDismiss().then( /*#__PURE__*/function () {\n var _ref3 = _asyncToGenerator(function* (res) {\n const data = res.data;\n if (data.selected) {\n _this16.ChatSystemService.getGroupRoom(_this16.roomId).send({\n file: {\n \"name\": res.data.selected.Assunto,\n \"type\": \"application/webtrix\",\n \"ApplicationId\": res.data.selected.ApplicationType,\n \"DocId\": res.data.selected.Id,\n \"Assunto\": res.data.selected.Assunto\n },\n temporaryData: res,\n attachments: [{\n \"title\": res.data.selected.Assunto,\n \"description\": res.data.selected.DocTypeDesc,\n // \"title_link\": url_no_options,\n \"title_link_download\": true,\n //\"thumb_url\": \"assets/images/webtrix-logo.png\",\n // \"message_link\": url_no_options,\n \"type\": \"webtrix\",\n //\"thumb_url\": \"assets/images/webtrix-logo.png\",\n \"text\": res.data.selected.DocTypeDesc,\n \"thumb_url\": \"https://static.ichimura.ed.jp/uploads/2017/10/pdf-icon.png\"\n }]\n });\n }\n });\n return function (_x2) {\n return _ref3.apply(this, arguments);\n };\n }());\n })();\n }\n addFileToChat(types) {\n var _this17 = this;\n return _asyncToGenerator(function* () {\n const roomId = _this17.roomId;\n const file = yield _this17.fileService.getFileFromDevice(types);\n if (file.type != \"application/img\" && file.type != \"image/png\" && file.type != \"image/jpeg\" && file.type != \"image/gif\") {\n const encodedData = btoa(JSON.stringify(yield _this17.getBase64(file).catch(error => {\n console.error(error);\n })));\n const blob = _this17.base64toBlob(encodedData, file.type);\n const formData = new FormData();\n formData.append('blobFile', blob);\n _this17.ChatSystemService.getGroupRoom(roomId).send({\n file: {\n \"type\": file.type,\n \"guid\": ''\n },\n attachments: [{\n \"title\": file.name,\n \"name\": file.name,\n // \"text\": \"description\",\n \"title_link_download\": false\n }],\n temporaryData: formData\n });\n } else {}\n })();\n }\n getFileReader() {\n const fileReader = new FileReader();\n const zoneOriginalInstance = fileReader[\"__zone_symbol__originalInstance\"];\n return zoneOriginalInstance || fileReader;\n }\n getBase64(file) {\n var reader = this.getFileReader();\n reader.readAsDataURL(file);\n return new Promise(resolve => {\n reader.onload = function () {\n resolve(reader.result);\n };\n reader.onerror = function (error) {};\n });\n }\n openChatOptions(ev) {\n var _this18 = this;\n return _asyncToGenerator(function* () {\n const roomId = _this18.roomId;\n const popover = yield _this18.popoverController.create({\n component: ChatOptionsPopoverPage,\n cssClass: 'chat-options-popover',\n event: ev,\n componentProps: {\n room: _this18.room,\n members: _this18.members,\n eventSelectedDate: new Date()\n },\n translucent: true\n });\n yield popover.present();\n yield popover.onDidDismiss().then( /*#__PURE__*/function () {\n var _ref4 = _asyncToGenerator(function* (res) {\n if (res['data'] == 'meeting') {\n _this18.bookMeeting();\n } else if (res['data'] == 'take-picture') {\n _this18.takePicture();\n } else if (res['data'] == 'add-picture') {\n _this18.addImage();\n } else if (res['data'] == 'add-document') {\n _this18.addFile();\n } else if (res['data'] == 'documentoGestaoDocumental') {\n _this18.addFileWebtrix();\n }\n });\n return function (_x3) {\n return _ref4.apply(this, arguments);\n };\n }());\n })();\n }\n addContacts() {\n var _this19 = this;\n return _asyncToGenerator(function* () {\n if (_this19.isAdmin) {\n const modal = yield _this19.modalController.create({\n component: GroupContactsPage,\n componentProps: {\n isCreated: _this19.isGroupCreated,\n room: _this19.room,\n members: _this19.members,\n name: _this19.room.name\n },\n cssClass: 'contacts',\n backdropDismiss: false\n });\n yield modal.present();\n modal.onDidDismiss().then(() => {\n _this19.getRoomInfo();\n });\n }\n })();\n }\n editGroup(roomId) {\n var _this20 = this;\n return _asyncToGenerator(function* () {\n const modal = yield _this20.modalController.create({\n component: EditGroupPage,\n cssClass: 'modal modal-desktop',\n componentProps: {\n roomId: roomId\n }\n });\n yield modal.present();\n modal.onDidDismiss().then(res => {\n _this20.getRoomInfo();\n //this.modalController.dismiss(res.data);\n });\n })();\n }\n /* async actionSheet() {\r\n const actionSheet = await this.actionSheetController.create({\r\n cssClass: 'my-custom-class',\r\n buttons: [{\r\n text: 'Sair do grupo',\r\n handler: () => {\r\n \r\n }\r\n }, {\r\n text: 'Alterar nome do grupo1',\r\n handler: () => {\r\n \r\n this.openChangeGroupName()\r\n }\r\n }, {\r\n text: 'Apagar o grupo',\r\n handler: () => {\r\n \r\n }\r\n },\r\n ]\r\n });\r\n await actionSheet.present();\r\n }\r\n */\n // getRoomMessageDB(roomId) {\n // if (this.platform.is('desktop') || this.platform.is('mobileweb')) {\n // } else {\n // this.sqlservice.getAllChatMSG(roomId).then((msg: any) => {\n // let chatmsgArray = [];\n // let array = []\n // msg.forEach(element => {\n // let msgChat = {\n // _id: element.Id,\n // attachments: this.isJson(element.Attachments),\n // channels: this.isJson(element.Channels),\n // file: this.isJson(element.File),\n // mentions: this.isJson(element.Mentions),\n // msg: element.Msg,\n // rid: element.Rid,\n // ts: element.Ts,\n // u: this.isJson(element.U),\n // _updatedAt: element.UpdatedAt,\n // image_url: this.isJson(element.image_url)\n // }\n // chatmsgArray.push(msgChat)\n // });\n // // this.messages = chatmsgArray;\n // })\n // }\n // }\n isJson(str) {\n try {\n JSON.parse(str);\n } catch (e) {\n return \"\";\n }\n return JSON.parse(str);\n }\n transformDataMSG(res) {\n if (this.platform.is('desktop') || this.platform.is('mobileweb')) {} else {\n res.forEach(element => {\n let chatmsg = {\n _id: element._id,\n attachments: element.attachments,\n channels: element.channels,\n file: element.file,\n mentions: element.mentions,\n msg: element.msg,\n rid: element.rid,\n ts: element.ts,\n u: element.u,\n _updatedAt: element._updatedAt\n /* image_url: {\r\n name: name,\r\n path: `${IMAGE_DIR}/${name}`,\r\n data: `data:image/jpeg;base64,${readFile.data}`,\r\n }, */\n };\n // this.sqlservice.addChatMSG(chatmsg)\n });\n }\n }\n\n serverLongPull() {\n var _this21 = this;\n return _asyncToGenerator(function* () {\n _this21.chatService.getPrivateGroupMessages(_this21.roomId).subscribe( /*#__PURE__*/function () {\n var _ref5 = _asyncToGenerator(function* (res) {\n if (res == 502) {\n // Connection timeout\n // happens when the connection was pending for too long\n // let's reconnect\n yield _this21.serverLongPull();\n } else if (res != 200) {\n // Show Error\n //showMessage(response.statusText);\n //this.loadMessages()\n let msgOnly = res['messages'].filter(data => data.t != 'au');\n //this.messages = msgOnly.reverse();\n // \n _this21.transformDataMSG(msgOnly.reverse());\n // this.getRoomMessageDB(this.roomId);\n // Reconnect in one second\n if (_this21.route.url != \"/home/chat\") {} else {\n //Check if modal is opened\n if (document.querySelector('.isGroupChatOpened')) {\n yield new Promise(resolve => setTimeout(resolve, 5000)).catch(error => {\n console.error(error);\n });\n yield _this21.serverLongPull();\n }\n }\n } else {\n // Got message\n //let message = await response.text();\n //this.loadMessages()\n yield _this21.serverLongPull();\n }\n });\n return function (_x4) {\n return _ref5.apply(this, arguments);\n };\n }());\n })();\n }\n touchEnd(zoomslides, card) {\n var _this22 = this;\n return _asyncToGenerator(function* () {\n // Zoom back to normal\n const slider = yield zoomslides.getSwiper();\n const zoom = slider.zoom;\n zoom.out();\n // Card back to normal\n card.el.style['z-index'] = 9;\n _this22.zoomActive = false;\n _this22.changeDetectorRef.detectChanges();\n })();\n }\n touchStart(card) {\n // Make card appear above backdrop\n card.el.style['z-index'] = 11;\n }\n b64toBlob(b64Data, contentType) {\n contentType = contentType || '';\n var sliceSize = 512;\n b64Data = b64Data.replace(/^[^,]+,/, '');\n b64Data = b64Data.replace(/\\s/g, '');\n var byteCharacters = window.atob(b64Data);\n var byteArrays = [];\n for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {\n var slice = byteCharacters.slice(offset, offset + sliceSize);\n var byteNumbers = new Array(slice.length);\n for (var i = 0; i < slice.length; i++) {\n byteNumbers[i] = slice.charCodeAt(i);\n }\n var byteArray = new Uint8Array(byteNumbers);\n byteArrays.push(byteArray);\n }\n var blob = new Blob(byteArrays, {\n type: contentType\n });\n return blob;\n }\n openFile(pdfString, filename, type) {\n const blob = this.b64toBlob(pdfString, 'application/pdf');\n let pathFile = '';\n const fileName = filename;\n const contentFile = blob;\n if (this.platform.is('ios')) {\n pathFile = this.file.documentsDirectory;\n } else {\n pathFile = this.file.externalRootDirectory;\n }\n this.file.writeFile(pathFile, fileName, contentFile, {\n replace: true\n }).then(success => {\n this.fileOpener.open(pathFile + fileName, 'application/pdf').then(() => console.log()).catch(e => console.error(e));\n }).catch(e => console.error(e));\n }\n downloadFileMsg(msg) {\n msg.downloadFileMsg();\n }\n downloadFileFromBrowser(fileName, data) {\n const linkSource = data;\n const downloadLink = document.createElement(\"a\");\n downloadLink.href = linkSource;\n downloadLink.download = fileName;\n downloadLink.click();\n }\n openPreview(msg) {\n var _this23 = this;\n return _asyncToGenerator(function* () {\n if (msg?.file?.type === \"application/webtrix\") {\n _this23.viewDocument(msg.file, msg.attachments.image_url);\n } else {\n if (!msg.attachments[0].image_url || msg.attachments[0].image_url === null || msg.attachments[0].image_url === '') {\n _this23.downloadFileMsg(msg);\n } else {\n var str = msg.attachments[0].image_url;\n str = str.substring(1, str.length - 1);\n if (_this23.platform.is('desktop') || _this23.platform.is('mobileweb')) {\n if (msg?.file?.type == \"application/img\") {\n const modal = yield _this23.modalController.create({\n component: ViewMediaPage,\n cssClass: 'modal modal-desktop',\n componentProps: {\n image: msg.attachments[0].image_url,\n type: msg.file.type,\n username: msg.u.name,\n _updatedAt: msg._updatedAt\n }\n });\n modal.present();\n } else {\n _this23.downloadFileFromBrowser(\"file\", str);\n _this23.downloadFileFromBrowser(msg.attachments[0].title, str);\n }\n } else {\n if (msg.file.type == \"application/img\") {\n const modal = yield _this23.modalController.create({\n component: ViewMediaPage,\n cssClass: 'modal modal-desktop',\n componentProps: {\n image: msg.attachments[0].image_url,\n type: msg.file.type,\n username: msg.u.name,\n _updatedAt: msg._updatedAt\n }\n });\n modal.present();\n } else {\n _this23.openFile(str, msg.attachments[0].title, msg.file.type);\n }\n }\n }\n }\n })();\n }\n audioPreview(msg) {\n var _this24 = this;\n return _asyncToGenerator(function* () {\n if (!msg.attachments[0].title_link || msg.attachments[0].title_link === null || msg.attachments[0].title_link === '') {\n _this24.downloadFileMsg(msg);\n } else {}\n })();\n }\n};\nGroupMessagesPage.ctorParameters = () => [{\n type: ModalController\n}, {\n type: PopoverController\n}, {\n type: ChatService\n}, {\n type: NavParams\n}, {\n type: AlertService\n}, {\n type: Router\n}, {\n type: TimeService\n}, {\n type: FileService\n}, {\n type: ToastService\n}, {\n type: ThemeService\n}, {\n type: ChangeDetectorRef\n}, {\n type: SqliteService\n}, {\n type: Platform\n}, {\n type: ChatSystemService\n}, {\n type: Storage\n}, {\n type: CameraService\n}, {\n type: DomSanitizer\n}, {\n type: File\n}, {\n type: FileOpener\n}];\nGroupMessagesPage.propDecorators = {\n myScrollContainer: [{\n type: ViewChild,\n args: ['scrollMe']\n }]\n};\nGroupMessagesPage = __decorate([Component({\n selector: 'app-group-messages',\n template: __NG_CLI_RESOURCE__0,\n styles: [__NG_CLI_RESOURCE__1]\n})], GroupMessagesPage);\nexport { GroupMessagesPage };","map":{"version":3,"mappings":"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","names":["Component","ViewChild","ChangeDetectorRef","ModalController","NavParams","PopoverController","Platform","AlertService","ChatService","ChatOptionsPopoverPage","ChatPopoverPage","GroupContactsPage","Router","EditGroupPage","TimeService","FileService","ToastService","environment","NewEventPage","ViewDocumentPage","ThemeService","ViewEventPage","SqliteService","ChatSystemService","Storage","CameraService","SearchPage","VoiceRecorder","Filesystem","Directory","DomSanitizer","File","FileOpener","SessionStore","ViewMediaPage","GroupMessagesPage","constructor","modalController","popoverController","chatService","navParams","alertService","route","timeService","fileService","toastService","changeDetectorRef","sqlservice","platform","storage","sanitiser","file","fileOpener","Date","myScrollContainer","nativeElement","scrollTop","scrollHeight","err","zoom","slidesPerView","spaceBetween","centeredSlides","allowSlidePrev","allowSlideNext","maxRatio","on","zoomChange","scale","imageEl","slideEl","zoomActive","zoomScale","detectChanges","loggedUserChat","user","ChatData","isGroupCreated","roomId","get","window","onresize","event","innerWidth","dismiss","getGroupRoom","loadHistory","scrollDown","scrollToBottomClicked","openRoom","groupNameFormart","name","split","join","setTimeout","showAvatar","ngOnInit","loggedUser","getRoomInfo","scrollToBottom","serverLongPull","setStatus","getChatMembers","getGroupContacts","status","body","message","deleteMessage","msgId","room","confirmDeleteMessage","ngAfterViewInit","scrollChangeCallback","onContentScrolled","addEventListener","customFields","countDownDate","roomCountDownDate","_id","handlePress","id","selectedMsgId","showMessageOptions","handleClick","e","startPosition","srcElement","scroll","windowHeight","containerHeight","clientHeight","currentPosition","scrollingOnce","scrollToBottomBtn","calculateDuration","recording","duration","durationDisplay","minutes","Math","floor","seconds","toString","padStart","getFile","fileName","audioFile","readFile","path","directory","Data","base64sound","data","base64","fetch","base64Response","_this","audioRecorded","url","loadFiles","_this2","then","lastAudioRecorded","recordData","value","recordDataBase64","includes","bypassSecurityTrustResourceUrl","mimeType","error","stopRecording","deleteRecording","allowTyping","result","_this3","getTime","set","startRecording","requestAudioRecordingPermission","canDeviceVoiceRecord","_this4","_badRequest","_this5","remove","goToEvent","classs","modal","_this6","create","component","componentProps","eventId","CalendarId","calendarId","cssClass","present","onDidDismiss","res","ngOnDestroy","removeEventListener","_this7","showLoader","toPromise","roomName","userId","u","isAdmin","_this8","getAllUsers","subscribe","allUsers","filter","username","UserName","close","doRefresh","ev","target","complete","members","showDateDuration","start","date","countDownDateTimer","addZero","i","sendMessage","send","base64toBlob","base64Data","contentType","sliceSize","byteCharacters","atob","bytesLength","length","slicesCount","ceil","byteArrays","Array","sliceIndex","begin","end","min","bytes","offset","charCodeAt","Uint8Array","Blob","type","sendAudio","_this9","encodedData","btoa","blob","formData","FormData","append","msDuration","attachments","temporaryData","openOptions","_this10","isCreated","editGroup","addContacts","viewDocument","openViewDocumentModal","fullUrl","viewDocumentByUrl","task","serialNumber","taskStartDate","isEvent","workflowInstanceDataFields","FolderID","Subject","Assunto","SourceSecFsID","ApplicationId","SourceType","SourceID","DocId","DispatchNumber","doc","_this11","trustedUrl","title","title_link","Document","applicationId","docId","folderId","bookMeeting","_this12","attendees","map","val","Name","EmailAddress","domain","IsRequired","backdropDismiss","takePicture","_this13","image","saveImage","lastphoto","capturedImage","capturedImageTitle","loadFileData","addImage","_this14","addFileToChat","addFile","_this15","addFileWebtrix","_this16","select","showSearchInput","selected","ApplicationType","Id","DocTypeDesc","types","_this17","getFileFromDevice","JSON","stringify","getBase64","catch","console","getFileReader","fileReader","FileReader","zoneOriginalInstance","reader","readAsDataURL","Promise","resolve","onload","onerror","openChatOptions","_this18","popover","eventSelectedDate","translucent","_this19","_this20","isJson","str","parse","transformDataMSG","is","forEach","element","chatmsg","channels","mentions","msg","rid","ts","_updatedAt","_this21","getPrivateGroupMessages","msgOnly","t","reverse","document","querySelector","touchEnd","zoomslides","card","slider","getSwiper","out","el","style","_this22","touchStart","b64toBlob","b64Data","replace","slice","byteNumbers","byteArray","push","openFile","pdfString","filename","pathFile","contentFile","documentsDirectory","externalRootDirectory","writeFile","success","open","log","downloadFileMsg","downloadFileFromBrowser","linkSource","downloadLink","createElement","href","download","click","openPreview","_this23","image_url","substring","audioPreview","_this24","args","selector","template"],"sourceRoot":"","sources":["C:\\Users\\eudes.inacio\\GabineteDigital\\gabinete-digital-fo\\src\\app\\pages\\chat\\group-messages\\group-messages.page.ts"],"sourcesContent":["import { Component, ElementRef, OnInit, ViewChild, AfterViewInit, OnDestroy, ChangeDetectorRef, } from '@angular/core';\r\nimport { IonSlides, ModalController, NavParams, PopoverController, Platform } from '@ionic/angular';\r\nimport { AlertService } from 'src/app/services/alert.service';\r\nimport { ChatService } from 'src/app/services/chat.service';\r\nimport { ChatOptionsPopoverPage } from 'src/app/shared/popover/chat-options-popover/chat-options-popover.page';\r\nimport { ChatPopoverPage } from 'src/app/shared/popover/chat-popover/chat-popover.page';\r\nimport { GroupContactsPage } from './group-contacts/group-contacts.page';\r\nimport { Router } from '@angular/router'\r\nimport { EditGroupPage } from '../edit-group/edit-group.page';\r\nimport { TimeService } from 'src/app/services/functions/time.service';\r\nimport { FileService } from 'src/app/services/functions/file.service';\r\nimport { ToastService } from 'src/app/services/toast.service';\r\nimport { environment } from 'src/environments/environment';\r\nimport { NewEventPage } from '../../agenda/new-event/new-event.page';\r\nimport { EventPerson } from 'src/app/models/eventperson.model';\r\nimport { ViewDocumentPage } from 'src/app/modals/view-document/view-document.page';\r\nimport { ThemeService } from 'src/app/services/theme.service'\r\nimport { ViewEventPage } from 'src/app/modals/view-event/view-event.page';\r\nimport { SqliteService } from 'src/app/services/sqlite.service';\r\nimport { ChatSystemService } from 'src/app/services/chat/chat-system.service';\r\nimport { FileType } from 'src/app/models/fileType';\r\nimport { Storage } from '@ionic/storage';\r\n\r\nimport { CameraService } from 'src/app/services/camera.service';\r\nimport { SearchPage } from 'src/app/pages/search/search.page';\r\nimport { VoiceRecorder, RecordingData, GenericResponse } from 'capacitor-voice-recorder';\r\nimport { Filesystem, Directory } from '@capacitor/filesystem';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { MessageService } from 'src/app/services/chat/message.service';\r\nimport { File } from '@awesome-cordova-plugins/file/ngx';\r\nimport { FileOpener } from '@awesome-cordova-plugins/file-opener/ngx';\r\nimport { SessionStore } from 'src/app/store/session.service';\r\nimport { ViewMediaPage } from 'src/app/modals/view-media/view-media.page';\r\n\r\n@Component({\r\n selector: 'app-group-messages',\r\n templateUrl: './group-messages.page.html',\r\n styleUrls: ['./group-messages.page.scss'],\r\n})\r\nexport class GroupMessagesPage implements OnInit, AfterViewInit, OnDestroy {\r\n\r\n showLoader: boolean;\r\n isGroupCreated: boolean;\r\n loggedUser: any;\r\n\r\n room: any;\r\n roomName: any;\r\n members: any = []\r\n contacts: string[] = [\" Ana M.\", \"Andre F.\", \"Bruno G.\", \"Catarina T\", \"Tiago\"];\r\n allUsers: any[] = [];\r\n\r\n roomId: string;\r\n loggedUserChat: any;\r\n eventSelectedDate: Date = new Date();\r\n\r\n scrollingOnce: boolean = true;\r\n private scrollChangeCallback: () => void;\r\n currentPosition: any;\r\n startPosition: number;\r\n\r\n capturedImage: any;\r\n capturedImageTitle: any;\r\n attendees: EventPerson[] = [];\r\n scrollToBottomBtn = false;\r\n\r\n longPressActive = false;\r\n showMessageOptions = false;\r\n selectedMsgId: string;\r\n roomCountDownDate: any;\r\n downloadFile: any;\r\n groupNameFormart = \"\";\r\n\r\n @ViewChild('scrollMe') private myScrollContainer: ElementRef;\r\n\r\n recording = false;\r\n allowTyping = true;\r\n storedFileNames = [];\r\n lastAudioRecorded = '';\r\n audioRecorded: any = \"\";\r\n audioDownloaded: any = \"\";\r\n durationDisplay = '';\r\n duration = 0;\r\n showAvatar = true;\r\n audioPermissionStatus: 'granted'| 'denied' | 'prompt' | null = null\r\n sessionStore = SessionStore\r\n isAdmin = false;\r\n constructor(\r\n private modalController: ModalController,\r\n public popoverController: PopoverController,\r\n private chatService: ChatService,\r\n private navParams: NavParams,\r\n private alertService: AlertService,\r\n private route: Router,\r\n private timeService: TimeService,\r\n private fileService: FileService,\r\n private toastService: ToastService,\r\n public ThemeService: ThemeService,\r\n private changeDetectorRef: ChangeDetectorRef,\r\n private sqlservice: SqliteService,\r\n private platform: Platform,\r\n public ChatSystemService: ChatSystemService,\r\n private storage: Storage,\r\n private CameraService: CameraService,\r\n private sanitiser: DomSanitizer,\r\n private file: File,\r\n private fileOpener: FileOpener,\r\n ) {\r\n this.loggedUserChat = SessionStore.user.ChatData['data'];\r\n this.isGroupCreated = true;\r\n this.roomId = this.navParams.get('roomId');\r\n window.onresize = (event) => {\r\n if (window.innerWidth > 701) {\r\n this.modalController.dismiss();\r\n }\r\n };\r\n\r\n this.ChatSystemService.getGroupRoom(this.roomId).loadHistory({});\r\n this.ChatSystemService.getGroupRoom(this.roomId).scrollDown = this.scrollToBottomClicked;\r\n this.ChatSystemService.openRoom(this.roomId)\r\n this.groupNameFormart = this.ChatSystemService.getGroupRoom(this.roomId).name.split('-').join(' ') \r\n\r\n setTimeout(() => {\r\n this.scrollToBottomClicked()\r\n }, 50)\r\n\r\n\r\n this.showAvatar = false\r\n\r\n setTimeout(() => {\r\n this.scrollToBottomClicked()\r\n this.showAvatar = true\r\n }, 150)\r\n\r\n }\r\n\r\n ngOnInit() {\r\n \r\n this.loggedUser = this.loggedUserChat;\r\n this.getRoomInfo();\r\n this.scrollToBottom();\r\n this.serverLongPull();\r\n this.setStatus('online');\r\n this.getChatMembers();\r\n\r\n // this.getRoomMessageDB(this.roomId);\r\n this.getGroupContacts({});\r\n \r\n }\r\n\r\n setStatus(status: string) {\r\n let body = {\r\n message: '',\r\n status: status,\r\n }\r\n // this.chatService.setUserStatus(body).subscribe(res => {\r\n // \r\n // })\r\n }\r\n\r\n deleteMessage(msgId: string) {\r\n const room = this.ChatSystemService.getGroupRoom(this.roomId)\r\n this.alertService.confirmDeleteMessage(msgId, room);\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.scrollChangeCallback = () => this.onContentScrolled(event);\r\n window.addEventListener('scroll', this.scrollChangeCallback, true);\r\n\r\n if(this.room?.customFields?.countDownDate) {\r\n this.roomCountDownDate = this.timeService.countDownDate(this.room.customFields.countDownDate, this.room._id);\r\n }\r\n }\r\n\r\n handlePress(id?: string) {\r\n this.selectedMsgId = id;\r\n this.showMessageOptions = true;\r\n }\r\n\r\n handleClick() {\r\n this.showMessageOptions = false;\r\n this.selectedMsgId = \"\";\r\n }\r\n\r\n onContentScrolled(e) {\r\n this.startPosition = e.srcElement.scrollTop;\r\n let scroll = e.srcElement.scrollTop;\r\n let windowHeight = e.srcElement.scrollHeight;\r\n let containerHeight = windowHeight - e.srcElement.clientHeight;\r\n\r\n if (scroll > this.currentPosition) {\r\n } else {\r\n this.scrollingOnce = false;\r\n }\r\n if ((containerHeight - 100) > scroll) {\r\n this.scrollToBottomBtn = true;\r\n }\r\n else {\r\n this.scrollToBottomBtn = false;\r\n }\r\n this.currentPosition = scroll;\r\n }\r\n\r\n calculateDuration() {\r\n if (!this.recording) {\r\n this.duration = 0;\r\n this.durationDisplay = '';\r\n return;\r\n }\r\n this.duration += 1;\r\n const minutes = Math.floor(this.duration / 60);\r\n const seconds = (this.duration % 60).toString().padStart(2, '0');\r\n this.durationDisplay = `${minutes}:${seconds}`;\r\n\r\n setTimeout(() => {\r\n this.calculateDuration();\r\n }, 1000)\r\n }\r\n\r\n async getFile(fileName?: any) {\r\n const audioFile = await Filesystem.readFile({\r\n path: fileName,\r\n directory: Directory.Data\r\n })\r\n //\r\n const base64sound = audioFile.data;\r\n\r\n //Converting base64 to blob\r\n const base64 = await fetch(base64sound);\r\n //\r\n\r\n const base64Response = await fetch(`data:audio/ogg;base64,${base64sound}`);\r\n //\r\n\r\n this.audioRecorded = base64Response.url;\r\n\r\n \r\n\r\n }\r\n\r\n async loadFiles() {\r\n\r\n this.storage.get('fileName').then((fileName) => {\r\n this.lastAudioRecorded = fileName;\r\n })\r\n\r\n try {\r\n this.storage.get('recordData').then((recordData) => {\r\n \r\n if (recordData?.value?.recordDataBase64.includes('data:audio')) {\r\n this.audioRecorded = this.sanitiser.bypassSecurityTrustResourceUrl(recordData?.value?.recordDataBase64);\r\n }\r\n else if(recordData?.value?.mimeType && recordData?.value?.recordDataBase64) {\r\n this.audioRecorded = this.sanitiser.bypassSecurityTrustResourceUrl(`data:${recordData.value.mimeType};base64,${recordData?.value?.recordDataBase64}`);\r\n }\r\n });\r\n } catch (error) { }\r\n\r\n\r\n }\r\n\r\n stopRecording() {\r\n this.deleteRecording();\r\n this.allowTyping = false;\r\n \r\n if (!this.recording) {\r\n return;\r\n }\r\n this.recording = false;\r\n VoiceRecorder.stopRecording().then(async (result: RecordingData) => {\r\n \r\n\r\n this.recording = false;\r\n if (result.value && result.value.recordDataBase64) {\r\n const recordData = result.value.recordDataBase64;\r\n //\r\n const fileName = new Date().getTime() + \".mp3\";\r\n //Save file\r\n await this.storage.set('fileName', fileName)\r\n this.storage.set('recordData', result).then(() => {\r\n \r\n\r\n setTimeout(async () => {\r\n this.loadFiles();\r\n }, 1000);\r\n })\r\n }\r\n })\r\n\r\n }\r\n\r\n async startRecording() {\r\n VoiceRecorder.requestAudioRecordingPermission();\r\n if(await VoiceRecorder.canDeviceVoiceRecord().then((result: GenericResponse) =>{return result.value})){\r\n if(await VoiceRecorder.requestAudioRecordingPermission().then((result: GenericResponse) => {return result.value})){\r\n //if(await this.hasAudioRecordingPermission()){\r\n if (this.recording) {\r\n return;\r\n }\r\n this.recording = true;\r\n VoiceRecorder.startRecording();\r\n this.calculateDuration();\r\n //}\r\n }\r\n else{\r\n this.toastService._badRequest('Para gravar uma mensagem de voz, permita o acesso do Gabinete Digital ao seu microfone.');\r\n }\r\n }\r\n else{\r\n this.toastService._badRequest('Este dispositivo não tem capacidade para gravação de áudio!');\r\n }\r\n }\r\n\r\n\r\n\r\n async deleteRecording() {\r\n this.storage.remove('fileName');\r\n this.storage.remove('recordData');\r\n\r\n this.allowTyping = true;\r\n this.lastAudioRecorded = '';\r\n this.loadFiles();\r\n }\r\n\r\n async goToEvent(event: any) {\r\n let classs;\r\n if (window.innerWidth < 701) {\r\n classs = 'modal modal-desktop'\r\n } else {\r\n classs = 'modal modal-desktop showAsideOptions'\r\n }\r\n\r\n const modal = await this.modalController.create({\r\n component: ViewEventPage,\r\n componentProps: {\r\n eventId: event.id,\r\n CalendarId: event.calendarId\r\n },\r\n cssClass: classs,\r\n });\r\n await modal.present();\r\n modal.onDidDismiss().then((res) => {\r\n \r\n });\r\n }\r\n\r\n ngOnDestroy() {\r\n window.removeEventListener('scroll', this.scrollChangeCallback, true);\r\n }\r\n\r\n scrollToBottom(): void {\r\n try {\r\n if (this.scrollingOnce) {\r\n this.myScrollContainer.nativeElement.scrollTop = this.myScrollContainer.nativeElement.scrollHeight;\r\n //this.scrollingOnce = false;\r\n }\r\n } catch (err) { }\r\n }\r\n\r\n scrollToBottomClicked = () => {\r\n try {\r\n this.myScrollContainer.nativeElement.scrollTop = this.myScrollContainer.nativeElement.scrollHeight;\r\n } catch (err) { }\r\n }\r\n\r\n async getRoomInfo() {\r\n this.showLoader = true;\r\n // this.chatService.getRoomInfo(this.roomId).subscribe(room => {\r\n // this.room = room['room'];\r\n // this.roomName = this.room.name.split('-').join(' ');\r\n // if (this.room.customFields.countDownDate) {\r\n // this.roomCountDownDate = this.timeService.countDownDateTimer(this.room.customFields.countDownDate, this.room._id);\r\n // }\r\n // this.getGroupContacts(this.room);\r\n // this.showLoader = false;\r\n // });\r\n this.ChatSystemService.getGroupRoom(this.roomId).loadHistory({});\r\n let room = await this.chatService.getRoomInfo(this.roomId).toPromise();\r\n // console.log('ROOM',room)\r\n this.room = room['room'];\r\n if (this.room.name) {\r\n try {\r\n this.roomName = this.room.name.split('-').join(' ');\r\n } catch (error) {\r\n this.roomName = this.room.name;\r\n }\r\n \r\n }\r\n \r\n\r\n if(SessionStore.user.ChatData.data.userId == this.room.u._id){\r\n this.isAdmin = true\r\n } else {\r\n this.isAdmin = false\r\n }\r\n\r\n if (this.room.customFields.countDownDate) {\r\n this.roomCountDownDate = this.room.customFields.countDownDate;\r\n }\r\n }\r\n\r\n async getChatMembers() {\r\n this.chatService.getAllUsers().subscribe(res => {\r\n \r\n\r\n this.allUsers = res['users'].filter(data => data.username != SessionStore.user.UserName);\r\n \r\n });\r\n }\r\n\r\n /* load(){\r\n this.getGroupContacts();\r\n this.loadGroupMessages();\r\n } */\r\n\r\n close() {\r\n this.modalController.dismiss();\r\n this.deleteRecording();\r\n }\r\n\r\n doRefresh(ev: any) {\r\n this.getRoomInfo();\r\n ev.target.complete();\r\n }\r\n\r\n getGroupContacts(room: any) {\r\n // this.showLoader = true;\r\n // //If group is private call getGroupMembers\r\n // if (this.room.t === 'p') {\r\n // this.chatService.getGroupMembers(this.roomId).subscribe(res => {\r\n \r\n // this.members = res['members'];\r\n // this.showLoader = false;\r\n // });\r\n // }\r\n // //Otherwise call getChannelMembers for públic groups\r\n // else {\r\n // this.chatService.getChannelMembers(this.roomId).subscribe(res => {\r\n \r\n // this.members = res['members'];\r\n // this.showLoader = false;\r\n // });\r\n // }\r\n\r\n this.members = this.ChatSystemService.getGroupRoom(this.roomId).members\r\n }\r\n\r\n\r\n showDateDuration(start: any) {\r\n return this.timeService.showDateDuration(start);\r\n }\r\n countDownDate(date: any, roomId: string) {\r\n this.roomCountDownDate = this.timeService.countDownDate(date, roomId);\r\n return this.timeService.countDownDateTimer(date, roomId);\r\n }\r\n\r\n addZero(i) {\r\n if (i < 10) {\r\n i = \"0\" + i;\r\n }\r\n return i;\r\n }\r\n\r\n sendMessage() {\r\n this.ChatSystemService.getGroupRoom(this.roomId).send({})\r\n }\r\n\r\n base64toBlob(base64Data, contentType) {\r\n contentType = contentType || '';\r\n var sliceSize = 1024;\r\n var byteCharacters = atob(base64Data);\r\n var bytesLength = byteCharacters.length;\r\n var slicesCount = Math.ceil(bytesLength / sliceSize);\r\n var byteArrays = new Array(slicesCount);\r\n\r\n for (var sliceIndex = 0; sliceIndex < slicesCount; ++sliceIndex) {\r\n var begin = sliceIndex * sliceSize;\r\n var end = Math.min(begin + sliceSize, bytesLength);\r\n\r\n var bytes = new Array(end - begin);\r\n for (var offset = begin, i = 0; offset < end; ++i, ++offset) {\r\n bytes[i] = byteCharacters[offset].charCodeAt(0);\r\n }\r\n byteArrays[sliceIndex] = new Uint8Array(bytes);\r\n }\r\n return new Blob(byteArrays, { type: contentType });\r\n }\r\n\r\n async sendAudio(fileName) {\r\n\r\n const roomId = this.roomId\r\n let audioFile;\r\n this.storage.get('recordData').then((recordData) => {\r\n \r\n audioFile = recordData;\r\n if (recordData?.value?.recordDataBase64.includes('data:audio')) {\r\n this.audioRecorded = recordData?.value?.recordDataBase64;\r\n }\r\n else if(recordData?.value?.mimeType && recordData?.value?.recordDataBase64){\r\n this.audioRecorded = `data:${recordData.value.mimeType};base64,${recordData?.value?.recordDataBase64}`;\r\n }\r\n\r\n //Converting base64 to blob\r\n const encodedData = btoa(this.audioRecorded);\r\n const blob = this.base64toBlob(encodedData, recordData.value.mimeType)\r\n \r\n const formData = new FormData();\r\n formData.append(\"blobFile\", blob);\r\n\r\n this.ChatSystemService.getGroupRoom(roomId).send({\r\n file: {\r\n \"type\": \"application/audio\",\r\n \"msDuration\": audioFile.value.msDuration,\r\n \"mimeType\": audioFile.value.mimeType,\r\n },\r\n attachments: [{\r\n \"title\": fileName,\r\n \"title_link_download\": true,\r\n \"type\": \"audio\"\r\n }],\r\n temporaryData: formData\r\n })\r\n\r\n });\r\n this.deleteRecording();\r\n }\r\n\r\n\r\n async openOptions() {\r\n const modal = await this.popoverController.create({\r\n component: ChatPopoverPage,\r\n cssClass: 'popover-bottom',\r\n componentProps: {\r\n roomId: this.roomId,\r\n members: this.members,\r\n isAdmin: this.isAdmin,\r\n isCreated: this.isGroupCreated,\r\n room: this.room,\r\n name: this.room.name,\r\n },\r\n });\r\n await modal.present();\r\n modal.onDidDismiss().then(res => {\r\n if (res.data == 'leave') {\r\n \r\n //this.ChatSystemService.subscribeToRoomUpdate(this.roomId, this.room);\r\n }\r\n else if (res.data == 'cancel') {\r\n \r\n }\r\n else if (res.data == 'edit') {\r\n this.editGroup(this.roomId);\r\n } else if (res.data == 'addUser') {\r\n \r\n this.addContacts();\r\n }\r\n });\r\n }\r\n\r\n\r\n viewDocument(file: any, url?: string) {\r\n\r\n if (file.type == \"application/webtrix\") {\r\n this.openViewDocumentModal(file);\r\n }\r\n else {\r\n let fullUrl = \"https://www.tabularium.pt\" + url;\r\n this.fileService.viewDocumentByUrl(fullUrl);\r\n }\r\n }\r\n\r\n async openViewDocumentModal(file: any) {\r\n\r\n let task = {\r\n serialNumber: '',\r\n taskStartDate: '',\r\n isEvent: true,\r\n workflowInstanceDataFields: {\r\n FolderID: '',\r\n Subject: file.Assunto,\r\n SourceSecFsID: file.ApplicationId,\r\n SourceType: 'DOC',\r\n SourceID: file.DocId,\r\n DispatchNumber: ''\r\n }\r\n }\r\n\r\n let doc = {\r\n \"Id\": \"\",\r\n \"ParentId\": \"\",\r\n \"Source\": 1,\r\n \"ApplicationId\": file.ApplicationId,\r\n \"CreateDate\": \"\",\r\n \"Data\": null,\r\n \"Description\": \"\",\r\n \"Link\": null,\r\n \"SourceId\": file.DocId,\r\n \"SourceName\": file.Assunto,\r\n \"Stakeholders\": \"\",\r\n }\r\n\r\n const modal = await this.modalController.create({\r\n component: ViewDocumentPage,\r\n componentProps: {\r\n trustedUrl: '',\r\n file: {\r\n title: file.Assunto,\r\n url: '',\r\n title_link: '',\r\n },\r\n Document: doc,\r\n applicationId: file.ApplicationId,\r\n docId: file.DocId,\r\n folderId: '',\r\n task: task\r\n },\r\n cssClass: 'modal modal-desktop'\r\n });\r\n await modal.present();\r\n\r\n }\r\n\r\n async bookMeeting() {\r\n\r\n this.getGroupContacts({});\r\n this.attendees = this.members.map((val) => {\r\n return {\r\n Name: val.name,\r\n EmailAddress: val.username + \"@\" + environment.domain,\r\n IsRequired: \"true\",\r\n }\r\n });\r\n \r\n // this.popoverController.dismiss();\r\n const modal = await this.modalController.create({\r\n component: NewEventPage,\r\n componentProps: {\r\n attendees: this.attendees,\r\n },\r\n cssClass: 'modal modal-desktop',\r\n backdropDismiss: false\r\n });\r\n await modal.present();\r\n modal.onDidDismiss().then((data) => {\r\n if (data) {\r\n\r\n }\r\n });\r\n }\r\n\r\n\r\n\r\n async takePicture() {\r\n const roomId = this.roomId\r\n\r\n const image = await this.CameraService.takePicture();\r\n await this.fileService.saveImage(image)\r\n const lastphoto: any = await this.fileService.loadFiles();\r\n const { capturedImage, capturedImageTitle } = await this.fileService.loadFileData(lastphoto);\r\n const base64 = await fetch(capturedImage);\r\n const blob = await base64.blob();\r\n const formData = new FormData();\r\n formData.append(\"blobFile\", blob);\r\n\r\n this.ChatSystemService.getGroupRoom(roomId).send({\r\n file: {\r\n \"type\": \"application/img\",\r\n \"guid\": ''\r\n },\r\n temporaryData: formData,\r\n attachments: [{\r\n \"title\": capturedImageTitle,\r\n \"text\": \"description\",\r\n \"title_link_download\": false,\r\n }]\r\n })\r\n\r\n }\r\n\r\n async addImage() {\r\n this.addFileToChat(['image/apng', 'image/jpeg', 'image/png'])\r\n }\r\n\r\n async addFile() {\r\n this.addFileToChat(['.doc', '.docx', '.pdf'])\r\n }\r\n\r\n async addFileWebtrix() {\r\n const modal = await this.modalController.create({\r\n component: SearchPage,\r\n cssClass: 'group-messages modal-desktop search-modal search-modal-to-desktop',\r\n componentProps: {\r\n type: 'AccoesPresidenciais & ArquivoDespachoElect',\r\n select: true,\r\n showSearchInput: true,\r\n }\r\n });\r\n await modal.present();\r\n modal.onDidDismiss().then(async res => {\r\n const data = res.data;\r\n\r\n if (data.selected) {\r\n\r\n this.ChatSystemService.getGroupRoom(this.roomId).send({\r\n file: {\r\n \"name\": res.data.selected.Assunto,\r\n \"type\": \"application/webtrix\",\r\n \"ApplicationId\": res.data.selected.ApplicationType,\r\n \"DocId\": res.data.selected.Id,\r\n \"Assunto\": res.data.selected.Assunto,\r\n },\r\n temporaryData: res,\r\n attachments: [{\r\n \"title\": res.data.selected.Assunto,\r\n \"description\": res.data.selected.DocTypeDesc,\r\n // \"title_link\": url_no_options,\r\n \"title_link_download\": true,\r\n //\"thumb_url\": \"assets/images/webtrix-logo.png\",\r\n // \"message_link\": url_no_options,\r\n \"type\": \"webtrix\",\r\n //\"thumb_url\": \"assets/images/webtrix-logo.png\",\r\n \"text\": res.data.selected.DocTypeDesc,\r\n \"thumb_url\": \"https://static.ichimura.ed.jp/uploads/2017/10/pdf-icon.png\",\r\n }]\r\n })\r\n\r\n }\r\n });\r\n }\r\n\r\n\r\n async addFileToChat(types: typeof FileType[]) {\r\n\r\n const roomId = this.roomId\r\n\r\n const file: any = await this.fileService.getFileFromDevice(types);\r\n\r\n \r\n\r\n if (file.type != \"application/img\" && file.type != \"image/png\" && file.type != \"image/jpeg\" && file.type != \"image/gif\") {\r\n\r\n const encodedData = btoa(JSON.stringify(await this.getBase64(file).catch ((error) => {\r\n console.error(error);\r\n })));\r\n const blob = this.base64toBlob(encodedData, file.type)\r\n \r\n const formData = new FormData();\r\n formData.append('blobFile', blob);\r\n \r\n\r\n this.ChatSystemService.getGroupRoom(roomId).send({\r\n file: {\r\n \"type\": file.type,\r\n \"guid\": '',\r\n },\r\n attachments: [{\r\n \"title\": file.name,\r\n \"name\": file.name,\r\n // \"text\": \"description\",\r\n \"title_link_download\": false,\r\n }],\r\n temporaryData: formData\r\n });\r\n\r\n } else {\r\n \r\n }\r\n\r\n }\r\n\r\n getFileReader(): FileReader {\r\n const fileReader = new FileReader();\r\n const zoneOriginalInstance = (fileReader as any)[\"__zone_symbol__originalInstance\"];\r\n return zoneOriginalInstance || fileReader;\r\n }\r\n\r\n getBase64(file) {\r\n var reader = this.getFileReader();\r\n reader.readAsDataURL(file);\r\n return new Promise(resolve => {\r\n reader.onload = function () {\r\n resolve(reader.result)\r\n };\r\n reader.onerror = function (error) {\r\n \r\n };\r\n });\r\n\r\n }\r\n\r\n async openChatOptions(ev?: any) {\r\n \r\n const roomId = this.roomId;\r\n\r\n const popover = await this.popoverController.create({\r\n component: ChatOptionsPopoverPage,\r\n cssClass: 'chat-options-popover',\r\n event: ev,\r\n componentProps: {\r\n room: this.room,\r\n members: this.members,\r\n eventSelectedDate: new Date(),\r\n },\r\n translucent: true\r\n });\r\n await popover.present();\r\n await popover.onDidDismiss().then(async (res) => {\r\n \r\n if (res['data'] == 'meeting') {\r\n this.bookMeeting();\r\n }\r\n else if (res['data'] == 'take-picture') {\r\n this.takePicture()\r\n }\r\n else if (res['data'] == 'add-picture') {\r\n this.addImage()\r\n\r\n }\r\n else if (res['data'] == 'add-document') {\r\n this.addFile()\r\n }\r\n else if (res['data'] == 'documentoGestaoDocumental') {\r\n\r\n this.addFileWebtrix()\r\n }\r\n });\r\n }\r\n\r\n async addContacts() {\r\n if(this.isAdmin) {\r\n\r\n const modal = await this.modalController.create({\r\n component: GroupContactsPage,\r\n componentProps: {\r\n isCreated: this.isGroupCreated,\r\n room: this.room,\r\n members: this.members,\r\n name: this.room.name,\r\n },\r\n cssClass: 'contacts',\r\n backdropDismiss: false\r\n });\r\n \r\n await modal.present();\r\n \r\n modal.onDidDismiss().then(() => {\r\n this.getRoomInfo();\r\n });\r\n }\r\n\r\n }\r\n\r\n async editGroup(roomId) {\r\n const modal = await this.modalController.create({\r\n component: EditGroupPage,\r\n cssClass: 'modal modal-desktop',\r\n componentProps: {\r\n roomId: roomId,\r\n },\r\n });\r\n await modal.present();\r\n modal.onDidDismiss().then((res) => {\r\n \r\n this.getRoomInfo();\r\n //this.modalController.dismiss(res.data);\r\n });\r\n }\r\n\r\n /* async actionSheet() {\r\n const actionSheet = await this.actionSheetController.create({\r\n cssClass: 'my-custom-class',\r\n buttons: [{\r\n text: 'Sair do grupo',\r\n handler: () => {\r\n \r\n }\r\n }, {\r\n text: 'Alterar nome do grupo1',\r\n handler: () => {\r\n \r\n this.openChangeGroupName()\r\n }\r\n }, {\r\n text: 'Apagar o grupo',\r\n handler: () => {\r\n \r\n }\r\n },\r\n ]\r\n });\r\n await actionSheet.present();\r\n }\r\n */\r\n\r\n // getRoomMessageDB(roomId) {\r\n // if (this.platform.is('desktop') || this.platform.is('mobileweb')) {\r\n // } else {\r\n // this.sqlservice.getAllChatMSG(roomId).then((msg: any) => {\r\n \r\n // let chatmsgArray = [];\r\n // let array = []\r\n // msg.forEach(element => {\r\n \r\n\r\n // let msgChat = {\r\n // _id: element.Id,\r\n // attachments: this.isJson(element.Attachments),\r\n // channels: this.isJson(element.Channels),\r\n // file: this.isJson(element.File),\r\n // mentions: this.isJson(element.Mentions),\r\n // msg: element.Msg,\r\n // rid: element.Rid,\r\n // ts: element.Ts,\r\n // u: this.isJson(element.U),\r\n // _updatedAt: element.UpdatedAt,\r\n // image_url: this.isJson(element.image_url)\r\n // }\r\n\r\n // chatmsgArray.push(msgChat)\r\n // });\r\n\r\n // // this.messages = chatmsgArray;\r\n \r\n // })\r\n // }\r\n // }\r\n\r\n isJson(str) {\r\n try {\r\n JSON.parse(str);\r\n } catch (e) {\r\n return \"\";\r\n }\r\n return JSON.parse(str);\r\n }\r\n\r\n transformDataMSG(res) {\r\n if (this.platform.is('desktop') || this.platform.is('mobileweb')) {\r\n } else {\r\n res.forEach(element => {\r\n\r\n let chatmsg = {\r\n _id: element._id,\r\n attachments: element.attachments,\r\n channels: element.channels,\r\n file: element.file,\r\n mentions: element.mentions,\r\n msg: element.msg,\r\n rid: element.rid,\r\n ts: element.ts,\r\n u: element.u,\r\n _updatedAt: element._updatedAt,\r\n /* image_url: {\r\n name: name,\r\n path: `${IMAGE_DIR}/${name}`,\r\n data: `data:image/jpeg;base64,${readFile.data}`,\r\n }, */\r\n }\r\n\r\n // this.sqlservice.addChatMSG(chatmsg)\r\n\r\n });\r\n }\r\n\r\n }\r\n\r\n async serverLongPull() {\r\n this.chatService.getPrivateGroupMessages(this.roomId).subscribe(async res => {\r\n\r\n if (res == 502) {\r\n // Connection timeout\r\n // happens when the connection was pending for too long\r\n // let's reconnect\r\n await this.serverLongPull();\r\n } else if (res != 200) {\r\n // Show Error\r\n //showMessage(response.statusText);\r\n //this.loadMessages()\r\n let msgOnly = res['messages'].filter(data => data.t != 'au');\r\n //this.messages = msgOnly.reverse();\r\n // \r\n this.transformDataMSG(msgOnly.reverse());\r\n // this.getRoomMessageDB(this.roomId);\r\n // Reconnect in one second\r\n if (this.route.url != \"/home/chat\") {\r\n \r\n } else {\r\n //Check if modal is opened\r\n if (document.querySelector('.isGroupChatOpened')) {\r\n await new Promise(resolve => setTimeout(resolve, 5000)).catch ((error) => {\r\n console.error(error);\r\n });\r\n await this.serverLongPull();\r\n \r\n }\r\n }\r\n\r\n } else {\r\n // Got message\r\n //let message = await response.text();\r\n //this.loadMessages()\r\n await this.serverLongPull();\r\n }\r\n });\r\n }\r\n\r\n sliderOpts = {\r\n zoom: false,\r\n slidesPerView: 1.5,\r\n spaceBetween: 20,\r\n centeredSlides: true\r\n };\r\n zoomActive = false;\r\n zoomScale = 1;\r\n\r\n sliderZoomOpts = {\r\n allowSlidePrev: false,\r\n allowSlideNext: false,\r\n zoom: {\r\n maxRatio: 5\r\n },\r\n on: {\r\n zoomChange: (scale, imageEl, slideEl) => {\r\n this.zoomActive = true;\r\n this.zoomScale = scale / 5;\r\n this.changeDetectorRef.detectChanges();\r\n }\r\n }\r\n }\r\n\r\n async touchEnd(zoomslides: IonSlides, card) {\r\n // Zoom back to normal\r\n const slider = await zoomslides.getSwiper();\r\n const zoom = slider.zoom;\r\n zoom.out();\r\n\r\n // Card back to normal\r\n card.el.style['z-index'] = 9;\r\n\r\n this.zoomActive = false;\r\n this.changeDetectorRef.detectChanges();\r\n }\r\n\r\n touchStart(card) {\r\n // Make card appear above backdrop\r\n card.el.style['z-index'] = 11;\r\n }\r\n\r\n b64toBlob(b64Data, contentType) {\r\n contentType = contentType || '';\r\n var sliceSize = 512;\r\n b64Data = b64Data.replace(/^[^,]+,/, '');\r\n b64Data = b64Data.replace(/\\s/g, '');\r\n var byteCharacters = window.atob(b64Data);\r\n var byteArrays = [];\r\n\r\n for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {\r\n var slice = byteCharacters.slice(offset, offset + sliceSize);\r\n\r\n var byteNumbers = new Array(slice.length);\r\n for (var i = 0; i < slice.length; i++) {\r\n byteNumbers[i] = slice.charCodeAt(i);\r\n }\r\n\r\n var byteArray = new Uint8Array(byteNumbers);\r\n\r\n byteArrays.push(byteArray);\r\n }\r\n\r\n var blob = new Blob(byteArrays, { type: contentType });\r\n return blob;\r\n }\r\n\r\n openFile(pdfString, filename, type) {\r\n const blob = this.b64toBlob(pdfString, 'application/pdf')\r\n let pathFile = ''\r\n const fileName = filename\r\n const contentFile = blob\r\n if (this.platform.is('ios')) {\r\n pathFile = this.file.documentsDirectory\r\n } else {\r\n pathFile = this.file.externalRootDirectory\r\n }\r\n \r\n \r\n \r\n this.file\r\n .writeFile(pathFile, fileName, contentFile, { replace: true })\r\n .then(success => {\r\n this.fileOpener\r\n .open(pathFile + fileName, 'application/pdf')\r\n .then(() => console.log())\r\n .catch(e => console.error(e))\r\n })\r\n .catch(e => console.error(e))\r\n }\r\n\r\n downloadFileMsg(msg: MessageService) {\r\n msg.downloadFileMsg()\r\n }\r\n\r\n downloadFileFromBrowser(fileName: string, data: any): void {\r\n const linkSource = data;\r\n const downloadLink = document.createElement(\"a\");\r\n downloadLink.href = linkSource;\r\n downloadLink.download = fileName;\r\n downloadLink.click();\r\n }\r\n\r\n async openPreview(msg: MessageService) {\r\n\r\n if(msg?.file?.type === \"application/webtrix\") {\r\n this.viewDocument(msg.file, msg.attachments.image_url)\r\n } else {\r\n if (!msg.attachments[0].image_url || msg.attachments[0].image_url === null || msg.attachments[0].image_url === '') {\r\n this.downloadFileMsg(msg)\r\n\r\n } else {\r\n\r\n var str = msg.attachments[0].image_url;\r\n str = str.substring(1, ((str.length) - 1));\r\n\r\n if (this.platform.is('desktop') || this.platform.is('mobileweb')) {\r\n\r\n if (msg?.file?.type == \"application/img\") {\r\n\r\n const modal = await this.modalController.create({\r\n component: ViewMediaPage,\r\n cssClass: 'modal modal-desktop',\r\n componentProps: {\r\n image: msg.attachments[0].image_url,\r\n type: msg.file.type,\r\n username: msg.u.name,\r\n _updatedAt: msg._updatedAt\r\n }\r\n });\r\n modal.present();\r\n } else {\r\n this.downloadFileFromBrowser(\"file\", str)\r\n this.downloadFileFromBrowser(msg.attachments[0].title, str)\r\n }\r\n\r\n } else {\r\n if (msg.file.type == \"application/img\") {\r\n const modal = await this.modalController.create({\r\n component: ViewMediaPage,\r\n cssClass: 'modal modal-desktop',\r\n componentProps: {\r\n image: msg.attachments[0].image_url,\r\n type: msg.file.type,\r\n username: msg.u.name,\r\n _updatedAt: msg._updatedAt\r\n }\r\n });\r\n modal.present();\r\n } else {\r\n this.openFile(str, msg.attachments[0].title, msg.file.type);\r\n }\r\n }\r\n }\r\n }\r\n\r\n }\r\n\r\n async audioPreview(msg) {\r\n \r\n if (!msg.attachments[0].title_link || msg.attachments[0].title_link === null || msg.attachments[0].title_link === '') {\r\n this.downloadFileMsg(msg)\r\n } else { }\r\n }\r\n}\r\n\r\n"]},"metadata":{},"sourceType":"module"} |