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 \"./messages.page.html?ngResource\";\nimport __NG_CLI_RESOURCE__1 from \"./messages.page.scss?ngResource\";\nimport { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';\nimport { AnimationController, GestureController, ModalController, PopoverController } from '@ionic/angular';\nimport { ChatService } from 'src/app/services/chat.service';\nimport { ToastService } from 'src/app/services/toast.service';\nimport { ChatOptionsPopoverPage } from 'src/app/shared/popover/chat-options-popover/chat-options-popover.page';\nimport { MessagesOptionsPage } from 'src/app/shared/popover/messages-options/messages-options.page';\nimport { ContactsPage } from '../new-group/contacts/contacts.page';\nimport { ChatOptionsFeaturesPage } from 'src/app/modals/chat-options-features/chat-options-features.page';\nimport { ChatMessageStore } from 'src/app/store/chat/chat-message.service';\nimport { ChatUserStorage } from 'src/app/store/chat/chat-user.service';\nimport { TimeService } from 'src/app/services/functions/time.service';\nimport { FileService } from 'src/app/services/functions/file.service';\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 { Storage } from '@ionic/storage';\nimport { ChatSystemService } from 'src/app/services/chat/chat-system.service';\nimport { RochetChatConnectorService } from 'src/app/services/chat/rochet-chat-connector.service';\nimport { CameraService } from 'src/app/services/camera.service';\nimport { SearchPage } from 'src/app/pages/search/search.page';\nimport { Camera, CameraResultType, CameraSource } from '@capacitor/camera';\nimport { DocumentViewer } from '@ionic-native/document-viewer';\nimport { VoiceRecorder } from 'capacitor-voice-recorder';\nimport { Filesystem, Directory } from '@capacitor/filesystem';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { Platform } from '@ionic/angular';\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 { Howl } from 'howler';\nimport { ViewMediaPage } from 'src/app/modals/view-media/view-media.page';\nimport { ChatMessageDebuggingPage } from 'src/app/shared/popover/chat-message-debugging/chat-message-debugging.page';\nimport { PermissionService } from 'src/app/services/permission.service';\nconst IMAGE_DIR = 'stored-images';\nlet MessagesPage = class MessagesPage {\n constructor(popoverController, modalController, /* private navParams: NavParams, */\n chatService, animationController, toastService, timeService, fileService, gestureController, ThemeService, storage, ChatSystemService, RochetChatConnectorService, CameraService, sanitiser, file, platform, fileOpener, p) {\n this.popoverController = popoverController;\n this.modalController = modalController;\n this.chatService = chatService;\n this.animationController = animationController;\n this.toastService = toastService;\n this.timeService = timeService;\n this.fileService = fileService;\n this.gestureController = gestureController;\n this.ThemeService = ThemeService;\n this.storage = storage;\n this.ChatSystemService = ChatSystemService;\n this.RochetChatConnectorService = RochetChatConnectorService;\n this.CameraService = CameraService;\n this.sanitiser = sanitiser;\n this.file = file;\n this.platform = platform;\n this.fileOpener = fileOpener;\n this.p = p;\n this.userPresence = '';\n this.downloadProgess = 0;\n this.openNewEventPage = new EventEmitter();\n this.getDirectMessages = new EventEmitter();\n this.chatMessageStore = ChatMessageStore;\n this.chatUserStorage = ChatUserStorage;\n this.scrollingOnce = true;\n this.mesageItemDropdownOptions = false;\n this.scrollToBottomBtn = false;\n this.longPressActive = false;\n this.massages = [];\n this.showAvatar = true;\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.audioPermissionStatus = null;\n this.sessionStore = SessionStore;\n this.audioPlay = null;\n this.isPlaying = false;\n this.audioProgress = 0;\n this.audioDuration = 0;\n this.userName = \"\";\n this.room = new Array();\n this.isAdmin = false;\n this.load = () => {\n this.checktimeOut = true;\n this.getChatMembers();\n };\n this.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 this.scrollToBottomClicked = () => {\n try {\n this.myScrollContainer.nativeElement.scrollTop = this.myScrollContainer.nativeElement.scrollHeight;\n //this.scrollingOnce = false;\n } catch (err) {}\n };\n // update\n this.checkAudioPermission();\n }\n ngOnChanges(changes) {\n this.ChatSystemService.getAllRooms();\n this.ChatSystemService.getDmRoom(this.roomId).loadHistory({});\n this.ChatSystemService.getDmRoom(this.roomId).scrollDown = this.scrollToBottomClicked;\n this.ChatSystemService.openRoom(this.roomId);\n this.showAvatar = false;\n setTimeout(() => {\n this.scrollToBottomClicked();\n this.showAvatar = true;\n }, 150);\n this.deleteRecording();\n // this.ChatSystemService.getDmRoom(this.roomId).deleteAll()\n }\n\n ChatMessageDebuggingPage() {\n var _this = this;\n return _asyncToGenerator(function* () {\n const modal = yield _this.modalController.create({\n component: ChatMessageDebuggingPage,\n cssClass: 'model profile-modal search-submodal',\n componentProps: {\n roomId: _this.roomId\n }\n });\n return yield modal.present();\n })();\n }\n checkAudioPermission() {\n var _this2 = this;\n return _asyncToGenerator(function* () {\n const permissionStatus = yield navigator.permissions.query({\n name: 'microphone'\n });\n _this2.audioPermissionStatus = permissionStatus.state;\n permissionStatus.onchange = data => {\n // \n // \n };\n })();\n }\n ngOnInit() {\n this.ChatSystemService.getAllRooms();\n // this.chatService.refreshtoken();\n this.scrollToBottom();\n this.getChatMembers();\n this.deleteRecording();\n this.loadFiles();\n }\n onPressingMessage() {\n const gesture = this.gestureController.create({\n el: this.messageContainer.nativeElement,\n gestureName: 'long-press',\n onStart: ev => {\n this.longPressActive = true;\n },\n onEnd: ev => {\n this.longPressActive = false;\n }\n });\n }\n doRefresh(ev) {\n this.load();\n ev.target.complete();\n }\n ngAfterViewInit() {\n this.scrollChangeCallback = () => this.onContentScrolled(event);\n window.addEventListener('scroll', this.scrollChangeCallback, true);\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 _this3 = this;\n return _asyncToGenerator(function* () {\n const audioFile = yield Filesystem.readFile({\n path: fileName,\n directory: Directory.Data\n });\n const base64sound = audioFile.data;\n const base64Response = yield fetch(`data:audio/ogg;base64,${base64sound}`);\n _this3.audioRecorded = base64Response.url;\n })();\n }\n loadFiles() {\n var _this4 = this;\n return _asyncToGenerator(function* () {\n try {\n _this4.storage.get('fileName').then(fileName => {\n _this4.lastAudioRecorded = fileName;\n });\n _this4.storage.get('recordData').then(recordData => {\n if (recordData?.value?.recordDataBase64.includes('data:audio')) {\n _this4.audioRecorded = _this4.sanitiser.bypassSecurityTrustResourceUrl(recordData?.value?.recordDataBase64);\n } else if (recordData?.value?.mimeType && recordData?.value?.recordDataBase64) {\n _this4.audioRecorded = _this4.sanitiser.bypassSecurityTrustResourceUrl(`data:${recordData.value.mimeType};base64,${recordData?.value?.recordDataBase64}`);\n }\n });\n } catch (error) {}\n _this4.storage.get('recordData').then(recordData => {\n if (recordData?.value?.recordDataBase64?.includes('data:audio')) {\n _this4.audioRecorded = _this4.sanitiser.bypassSecurityTrustResourceUrl(recordData.value.recordDataBase64);\n } else if (recordData?.value?.mimeType && recordData?.value?.recordDataBase64) {\n _this4.audioRecorded = _this4.sanitiser.bypassSecurityTrustResourceUrl(`data:${recordData.value.mimeType};base64,${recordData.value.recordDataBase64}`);\n }\n });\n })();\n }\n startRecording() {\n var _this5 = 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 (_this5.recording) {\n return;\n }\n _this5.recording = true;\n VoiceRecorder.startRecording();\n _this5.calculateDuration();\n //}\n } else {\n _this5.toastService._badRequest('Para gravar uma mensagem de voz, permita o acesso do Gabinete Digital ao seu microfone.');\n }\n } else {\n _this5.toastService._badRequest('Este dispositivo não tem capacidade para gravação de áudio!');\n }\n })();\n }\n stopRecording() {\n var _this6 = 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 _this6.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 _this6.storage.set('fileName', fileName);\n _this6.storage.set('recordData', result).then(() => {});\n }\n });\n return function (_x) {\n return _ref.apply(this, arguments);\n };\n }());\n setTimeout( /*#__PURE__*/_asyncToGenerator(function* () {\n _this6.loadFiles();\n }), 1000);\n }\n deleteRecording() {\n var _this7 = this;\n return _asyncToGenerator(function* () {\n _this7.storage.remove('fileName');\n _this7.storage.remove('recordData');\n _this7.allowTyping = true;\n _this7.lastAudioRecorded = '';\n _this7.loadFiles();\n })();\n }\n ngOnDestroy() {\n this.checktimeOut = false;\n window.removeEventListener('scroll', this.scrollChangeCallback, true);\n }\n openBookMeetingComponent() {\n let data = {\n roomId: this.roomId,\n members: this.members\n };\n this.openNewEventPage.emit(data);\n }\n showDateDuration(start) {\n return this.timeService.showDateDuration(start);\n }\n goToEvent(event) {\n var _this8 = 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 _this8.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 sendMessage() {\n this.ChatSystemService.getDmRoom(this.roomId).send({});\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 {\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.getDmRoom(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 deleteMessage(msgId, msg) {\n this.ChatSystemService.getDmRoom(this.roomId).sendDeleteRequest(msgId);\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 openViewDocumentModal(file) {\n var _this10 = 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 _this10.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 getChatMembers() {\n // \n // this.showLoader = true;\n // this.chatService.getMembers(this.roomId).subscribe(res => {\n // this.members = res['members'];\n // this.dmUsers = res['members'].filter(data => data.username != this.sessionStore.user.UserName)\n // this.showLoader = false;\n // });\n this.members = this.ChatSystemService.getDmRoom(this.roomId).members;\n this.dmUsers = this.ChatSystemService.getDmRoom(this.roomId).membersExcludeMe;\n }\n openMessagesOptions(ev) {\n var _this11 = this;\n return _asyncToGenerator(function* () {\n const popover = yield _this11.popoverController.create({\n component: MessagesOptionsPage,\n componentProps: {\n roomId: _this11.dm._id\n },\n cssClass: 'messages-options',\n event: ev,\n translucent: true\n });\n return yield popover.present();\n })();\n }\n addContacts() {\n var _this12 = this;\n return _asyncToGenerator(function* () {\n const modal = yield _this12.modalController.create({\n component: ContactsPage,\n componentProps: {},\n cssClass: 'contacts',\n backdropDismiss: false\n });\n yield modal.present();\n modal.onDidDismiss();\n })();\n }\n openSendMessageOptions(ev) {\n if (window.innerWidth < 701) {\n this.openChatOptions(ev);\n } else {\n this._openChatOptions();\n }\n }\n openChatOptions(ev) {\n var _this13 = this;\n return _asyncToGenerator(function* () {\n const popover = yield _this13.popoverController.create({\n component: ChatOptionsPopoverPage,\n cssClass: 'chat-options-popover',\n event: ev,\n translucent: true\n });\n return yield popover.present();\n })();\n }\n _openMessagesOptions() {\n var _this14 = this;\n return _asyncToGenerator(function* () {\n const enterAnimation = baseEl => {\n const backdropAnimation = _this14.animationController.create().addElement(baseEl.querySelector('ion-backdrop')).fromTo('opacity', '0.01', 'var(--backdrop-opacity)');\n const wrapperAnimation = _this14.animationController.create().addElement(baseEl.querySelector('.modal-wrapper')).keyframes([{\n offset: 0,\n opacity: '1',\n right: '-100%'\n }, {\n offset: 1,\n opacity: '1',\n right: '0px'\n }]);\n return _this14.animationController.create().addElement(baseEl).easing('ease-out').duration(500).addAnimation([backdropAnimation, wrapperAnimation]);\n };\n const leaveAnimation = baseEl => {\n return enterAnimation(baseEl).direction('reverse');\n };\n const modal = yield _this14.modalController.create({\n enterAnimation,\n leaveAnimation,\n component: MessagesOptionsPage,\n cssClass: 'model profile-modal search-submodal',\n componentProps: {\n roomId: _this14.roomId\n }\n });\n return yield modal.present();\n })();\n }\n dataURItoBlob(dataURI) {\n // convert base64 to raw binary data held in a string\n // doesn't handle URLEncoded DataURIs - see SO answer #6850276 for code that does this\n var byteString = atob(dataURI.split(',')[1]);\n // separate out the mime component\n var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];\n // write the bytes of the string to an ArrayBuffer\n var ab = new ArrayBuffer(byteString.length);\n // create a view into the buffer\n var ia = new Uint8Array(ab);\n // set the bytes of the buffer to the correct values\n for (var i = 0; i < byteString.length; i++) {\n ia[i] = byteString.charCodeAt(i);\n }\n // write the ArrayBuffer to a blob, and you're done\n var blob = new Blob([ab], {\n type: mimeString\n });\n return blob;\n }\n takePictureMobile() {\n var _this15 = this;\n return _asyncToGenerator(function* () {\n const roomId = _this15.roomId;\n const file = yield Camera.getPhoto({\n quality: 90,\n // allowEditing: true,\n resultType: CameraResultType.Base64,\n source: CameraSource.Camera\n });\n const blob = _this15.dataURItoBlob('data:image/jpeg;base64,' + file.base64String);\n const formData = new FormData();\n formData.append(\"blobFile\", blob);\n _this15.ChatSystemService.getDmRoom(roomId).send({\n file: {\n \"type\": \"application/img\",\n \"guid\": ''\n },\n temporaryData: formData,\n attachments: [{\n \"title\": file.path,\n // \"image_url\": \"\",\n //\"image_url\": 'data:image/jpeg;base64,' + file.base64String,\n \"text\": \"description\",\n \"title_link_download\": false\n }]\n });\n })();\n }\n takePicture() {\n var _this16 = this;\n return _asyncToGenerator(function* () {\n const roomId = _this16.roomId;\n const image = yield _this16.CameraService.takePicture();\n yield _this16.fileService.saveImage(image);\n const lastphoto = yield _this16.fileService.loadFiles();\n const {\n capturedImage,\n capturedImageTitle\n } = yield _this16.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 _this16.ChatSystemService.getDmRoom(roomId).send({\n file: {\n \"type\": \"application/img\",\n \"guid\": ''\n },\n temporaryData: formData,\n attachments: [{\n \"title\": capturedImageTitle,\n \"image_url\": capturedImage,\n \"text\": \"description\",\n \"title_link_download\": false\n }]\n });\n })();\n }\n addImage() {\n var _this17 = this;\n return _asyncToGenerator(function* () {\n _this17.addFileToChatMobile(['image/apng', 'image/jpeg', 'image/png']);\n })();\n }\n addFile() {\n var _this18 = this;\n return _asyncToGenerator(function* () {\n _this18.addFileToChat(['.doc', '.docx', '.pdf']);\n })();\n }\n addFileWebtrix() {\n var _this19 = this;\n return _asyncToGenerator(function* () {\n const modal = yield _this19.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 const roomId = _this19.roomId;\n if (data.selected) {\n _this19.ChatSystemService.getDmRoom(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_download\": true,\n \"type\": \"webtrix\",\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 addFileToChatMobile(types) {\n var _this20 = this;\n return _asyncToGenerator(function* () {\n const roomId = _this20.roomId;\n const file = yield Camera.getPhoto({\n quality: 90,\n // allowEditing: true,\n resultType: CameraResultType.Base64,\n source: CameraSource.Photos\n });\n //const imageData = await this.fileToBase64Service.convert(file)\n //\n const response = yield fetch('data:image/jpeg;base64,' + file.base64String);\n const blob = yield response.blob();\n const formData = new FormData();\n formData.append(\"blobFile\", blob);\n _this20.ChatSystemService.getDmRoom(roomId).send({\n file: {\n \"type\": \"application/img\",\n \"guid\": ''\n },\n temporaryData: formData,\n attachments: [{\n \"title\": file.path,\n //\"image_url\": 'data:image/jpeg;base64,' + file.base64String,\n \"text\": \"description\",\n \"title_link_download\": false\n }]\n });\n })();\n }\n addFileToChat(types) {\n var _this21 = this;\n return _asyncToGenerator(function* () {\n const roomId = _this21.roomId;\n const file = yield _this21.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 _this21.getBase64(file).catch(error => {\n console.error(error);\n })));\n const blob = _this21.base64toBlob(encodedData, file.type);\n const formData = new FormData();\n formData.append(\"blobFile\", blob);\n _this21.ChatSystemService.getDmRoom(roomId).send({\n file: {\n \"type\": file.type,\n \"guid\": ''\n },\n attachments: [{\n \"title\": file.name,\n \"name\": file.name,\n //\"image_url\": res,\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 bookMeeting() {\n let data = {\n roomId: this.roomId,\n members: this.members\n };\n this.openNewEventPage.emit(data);\n }\n chatsend() {}\n _openChatOptions() {\n var _this22 = this;\n return _asyncToGenerator(function* () {\n const roomId = _this22.roomId;\n const enterAnimation = baseEl => {\n const backdropAnimation = _this22.animationController.create().addElement(baseEl.querySelector('ion-backdrop')).fromTo('opacity', '0.01', 'var(--backdrop-opacity)');\n const wrapperAnimation = _this22.animationController.create().addElement(baseEl.querySelector('.modal-wrapper')).keyframes([{\n offset: 0,\n opacity: '1',\n right: '-100%'\n }, {\n offset: 1,\n opacity: '1',\n right: '0px'\n }]);\n return _this22.animationController.create().addElement(baseEl).easing('ease-out').duration(500).addAnimation([backdropAnimation, wrapperAnimation]);\n };\n const leaveAnimation = baseEl => {\n return enterAnimation(baseEl).direction('reverse');\n };\n const modal = yield _this22.modalController.create({\n enterAnimation,\n leaveAnimation,\n component: ChatOptionsFeaturesPage,\n cssClass: 'model profile-modal search-submodal',\n componentProps: {\n roomId: _this22.roomId,\n members: _this22.members\n }\n });\n yield modal.present();\n modal.onDidDismiss().then( /*#__PURE__*/function () {\n var _ref4 = _asyncToGenerator(function* (res) {\n if (res['data'] == 'meeting') {\n //this.closeAllDesktopComponents.emit();\n let data = {\n roomId: _this22.roomId,\n members: _this22.members\n };\n _this22.openNewEventPage.emit(data);\n } else if (res['data'] == 'take-picture') {\n _this22.takePictureMobile();\n } else if (res['data'] == 'add-picture') {\n _this22.addImage();\n } else if (res['data'] == 'add-document') {\n _this22.addFile();\n } else if (res['data'] == 'documentoGestaoDocumental') {\n _this22.addFileWebtrix();\n _this22.showLoader = false;\n }\n });\n return function (_x3) {\n return _ref4.apply(this, arguments);\n };\n }());\n })();\n }\n downloadFileMsg(msg) {\n msg.downloadFileMsg();\n }\n pdfPreview() {\n const options = {\n title: 'My App'\n };\n DocumentViewer.viewDocument;\n }\n audioPreview(msg) {\n var _this23 = this;\n return _asyncToGenerator(function* () {\n if (!msg.attachments[0].title_link || msg.attachments[0].title_link === null || msg.attachments[0].title_link === '') {\n _this23.downloadFileMsg(msg);\n } else {}\n })();\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 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 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 openFile(pdfString, filename, type) {\n const blob = this.b64toBlob(pdfString, type);\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, type).then(() => {}).catch(e => console.error(e));\n }).catch(e => console.error(e));\n }\n openPreview(msg) {\n var _this24 = this;\n return _asyncToGenerator(function* () {\n if (msg.file.type === \"application/webtrix\") {\n _this24.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 _this24.downloadFileMsg(msg);\n } else {\n var str = msg.attachments[0].image_url;\n str = str.substring(1, str.length - 1);\n if (_this24.platform.is('desktop') || _this24.platform.is('mobileweb')) {\n if (msg.file.type == \"application/img\") {\n const modal = yield _this24.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 _this24.downloadFileFromBrowser(\"file\", str);\n }\n } else {\n _this24.openFile(str, msg.attachments[0].title, msg.file.type);\n // this.downloadFileFromBrowser(\"file\", str)\n }\n }\n }\n })();\n }\n\n start(track) {\n if (this.audioPlay) {\n this.audioPlay.stop();\n }\n this.audioPlay = new Howl({\n src: [track.changingThisBreaksApplicationSecurity],\n onplay: () => {\n this.isPlaying = true;\n this.updateProgress();\n },\n onend: () => {\n this.isPlaying = false;\n clearTimeout(this.audioTimer);\n this.audioProgress = 0;\n }\n });\n this.audioPlay.play();\n }\n togglePlayer(pause) {\n this.isPlaying = !pause;\n if (pause) {\n this.audioPlay.pause();\n } else {\n this.audioPlay.play();\n }\n }\n seek() {\n let newValue = +this.range.value;\n let duration = this.audioPlay.duration();\n this.audioPlay.seek(duration * (newValue / 100));\n }\n updateProgress() {\n let seek = this.audioPlay.seek();\n this.audioProgress = seek / this.audioPlay.duration() * 100 || 0;\n this.audioTimer = setTimeout(() => {\n this.updateProgress();\n }, 1000);\n }\n getRoomInfo() {\n var _this25 = this;\n return _asyncToGenerator(function* () {\n let room = yield _this25.chatService.getRoomInfo(_this25.roomId).toPromise();\n _this25.room = room['room'];\n if (_this25.room.name) {\n try {\n _this25.roomName = _this25.room.name.split('-').join(' ');\n } catch (error) {\n _this25.roomName = _this25.room.name;\n }\n }\n if (SessionStore.user.ChatData.data.userId == _this25.room.u._id) {\n _this25.isAdmin = true;\n } else {\n _this25.isAdmin = false;\n }\n if (_this25.room.customFields.countDownDate) {\n _this25.roomCountDownDate = _this25.room.customFields.countDownDate;\n }\n })();\n }\n};\nMessagesPage.ctorParameters = () => [{\n type: PopoverController\n}, {\n type: ModalController\n}, {\n type: ChatService\n}, {\n type: AnimationController\n}, {\n type: ToastService\n}, {\n type: TimeService\n}, {\n type: FileService\n}, {\n type: GestureController\n}, {\n type: ThemeService\n}, {\n type: Storage\n}, {\n type: ChatSystemService\n}, {\n type: RochetChatConnectorService\n}, {\n type: CameraService\n}, {\n type: DomSanitizer\n}, {\n type: File\n}, {\n type: Platform\n}, {\n type: FileOpener\n}, {\n type: PermissionService\n}];\nMessagesPage.propDecorators = {\n myScrollContainer: [{\n type: ViewChild,\n args: ['scrollMe']\n }],\n messageContainer: [{\n type: ViewChild,\n args: ['message-item']\n }],\n roomId: [{\n type: Input\n }],\n showMessages: [{\n type: Input\n }],\n openNewEventPage: [{\n type: Output\n }],\n getDirectMessages: [{\n type: Output\n }],\n range: [{\n type: ViewChild,\n args: ['range', {\n static: false\n }]\n }]\n};\nMessagesPage = __decorate([Component({\n selector: 'app-messages',\n template: __NG_CLI_RESOURCE__0,\n styles: [__NG_CLI_RESOURCE__1]\n})], MessagesPage);\nexport { MessagesPage };","map":{"version":3,"mappings":"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","names":["Component","EventEmitter","Input","Output","ViewChild","AnimationController","GestureController","ModalController","PopoverController","ChatService","ToastService","ChatOptionsPopoverPage","MessagesOptionsPage","ContactsPage","ChatOptionsFeaturesPage","ChatMessageStore","ChatUserStorage","TimeService","FileService","ViewDocumentPage","ThemeService","ViewEventPage","Storage","ChatSystemService","RochetChatConnectorService","CameraService","SearchPage","Camera","CameraResultType","CameraSource","DocumentViewer","VoiceRecorder","Filesystem","Directory","DomSanitizer","Platform","File","FileOpener","SessionStore","Howl","ViewMediaPage","ChatMessageDebuggingPage","PermissionService","IMAGE_DIR","MessagesPage","constructor","popoverController","modalController","chatService","animationController","toastService","timeService","fileService","gestureController","storage","sanitiser","file","platform","fileOpener","p","Array","checktimeOut","getChatMembers","scrollingOnce","myScrollContainer","nativeElement","scrollTop","scrollHeight","err","checkAudioPermission","ngOnChanges","changes","getAllRooms","getDmRoom","roomId","loadHistory","scrollDown","scrollToBottomClicked","openRoom","showAvatar","setTimeout","deleteRecording","modal","_this","create","component","cssClass","componentProps","present","permissionStatus","navigator","permissions","query","name","_this2","audioPermissionStatus","state","onchange","data","ngOnInit","scrollToBottom","loadFiles","onPressingMessage","gesture","el","messageContainer","gestureName","onStart","ev","longPressActive","onEnd","doRefresh","load","target","complete","ngAfterViewInit","scrollChangeCallback","onContentScrolled","event","window","addEventListener","e","startPosition","srcElement","scroll","windowHeight","containerHeight","clientHeight","currentPosition","scrollToBottomBtn","calculateDuration","recording","duration","durationDisplay","minutes","Math","floor","seconds","toString","padStart","getFile","fileName","audioFile","readFile","path","directory","Data","base64sound","base64Response","fetch","_this3","audioRecorded","url","_this4","get","then","lastAudioRecorded","recordData","value","recordDataBase64","includes","bypassSecurityTrustResourceUrl","mimeType","error","startRecording","requestAudioRecordingPermission","canDeviceVoiceRecord","result","_this5","_badRequest","stopRecording","allowTyping","_this6","Date","getTime","set","_this7","remove","ngOnDestroy","removeEventListener","openBookMeetingComponent","members","openNewEventPage","emit","showDateDuration","start","goToEvent","classs","innerWidth","_this8","eventId","id","CalendarId","calendarId","onDidDismiss","res","sendMessage","send","sendAudio","_this9","encodedData","btoa","blob","base64toBlob","formData","FormData","append","msDuration","attachments","temporaryData","deleteMessage","msgId","msg","sendDeleteRequest","base64Data","contentType","sliceSize","byteCharacters","atob","bytesLength","length","slicesCount","ceil","byteArrays","sliceIndex","begin","end","min","bytes","offset","i","charCodeAt","Uint8Array","Blob","type","openViewDocumentModal","task","serialNumber","taskStartDate","isEvent","workflowInstanceDataFields","FolderID","Subject","Assunto","SourceSecFsID","ApplicationId","SourceType","SourceID","DocId","DispatchNumber","doc","_this10","trustedUrl","title","title_link","Document","applicationId","docId","folderId","dmUsers","membersExcludeMe","openMessagesOptions","popover","_this11","dm","_id","translucent","addContacts","_this12","backdropDismiss","openSendMessageOptions","openChatOptions","_openChatOptions","_this13","_openMessagesOptions","enterAnimation","baseEl","backdropAnimation","_this14","addElement","querySelector","fromTo","wrapperAnimation","keyframes","opacity","right","easing","addAnimation","leaveAnimation","direction","dataURItoBlob","dataURI","byteString","split","mimeString","ab","ArrayBuffer","ia","takePictureMobile","_this15","getPhoto","quality","resultType","Base64","source","base64String","takePicture","_this16","image","saveImage","lastphoto","capturedImage","capturedImageTitle","loadFileData","base64","addImage","_this17","addFileToChatMobile","addFile","_this18","addFileToChat","addFileWebtrix","_this19","select","showSearchInput","selected","ApplicationType","Id","DocTypeDesc","types","_this20","Photos","response","_this21","getFileFromDevice","JSON","stringify","getBase64","catch","console","getFileReader","fileReader","FileReader","zoneOriginalInstance","reader","readAsDataURL","Promise","resolve","onload","onerror","bookMeeting","chatsend","_this22","showLoader","downloadFileMsg","pdfPreview","options","viewDocument","audioPreview","_this23","b64toBlob","b64Data","replace","slice","byteNumbers","byteArray","push","downloadFileFromBrowser","linkSource","downloadLink","document","createElement","href","download","click","fullUrl","viewDocumentByUrl","openFile","pdfString","filename","pathFile","contentFile","is","documentsDirectory","externalRootDirectory","writeFile","success","open","openPreview","_this24","image_url","str","substring","username","u","_updatedAt","track","audioPlay","stop","src","changingThisBreaksApplicationSecurity","onplay","isPlaying","updateProgress","onend","clearTimeout","audioTimer","audioProgress","play","togglePlayer","pause","seek","newValue","range","getRoomInfo","room","_this25","toPromise","roomName","join","user","ChatData","userId","isAdmin","customFields","countDownDate","roomCountDownDate","args","static","selector","template"],"sourceRoot":"","sources":["C:\\Users\\eudes.inacio\\GabineteDigital\\gabinete-digital-fo\\src\\app\\shared\\chat\\messages\\messages.page.ts"],"sourcesContent":["import { AfterViewInit, Component, ElementRef, EventEmitter, Input, OnChanges, OnDestroy, OnInit, Output, SimpleChanges, ViewChild } from '@angular/core';\r\nimport { AnimationController, GestureController, IonRange, ModalController, PopoverController } from '@ionic/angular';\r\nimport { AuthService } from 'src/app/services/auth.service';\r\nimport { ChatService } from 'src/app/services/chat.service';\r\nimport { ToastService } from 'src/app/services/toast.service';\r\nimport { ChatOptionsPopoverPage } from 'src/app/shared/popover/chat-options-popover/chat-options-popover.page';\r\nimport { MessagesOptionsPage } from 'src/app/shared/popover/messages-options/messages-options.page';\r\nimport { ContactsPage } from '../new-group/contacts/contacts.page';\r\nimport { ChatOptionsFeaturesPage } from 'src/app/modals/chat-options-features/chat-options-features.page';\r\nimport { ChatMessageStore } from 'src/app/store/chat/chat-message.service';\r\nimport { ChatUserStorage } from 'src/app/store/chat/chat-user.service';\r\nimport { TimeService } from 'src/app/services/functions/time.service';\r\nimport { FileService } from 'src/app/services/functions/file.service';\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 { Storage } from '@ionic/storage';\r\nimport { ChatSystemService } from 'src/app/services/chat/chat-system.service'\r\nimport { RochetChatConnectorService } from 'src/app/services/chat/rochet-chat-connector.service'\r\nimport { MessageService } from 'src/app/services/chat/message.service';\r\nimport { AttachmentsService } from 'src/app/services/attachments.service';\r\nimport { CameraService } from 'src/app/services/camera.service';\r\nimport { FileType } from 'src/app/models/fileType';\r\nimport { SearchPage } from 'src/app/pages/search/search.page';\r\nimport { Camera, CameraResultType, CameraSource } from '@capacitor/camera';\r\nimport { DocumentViewer, DocumentViewerOptions } from '@ionic-native/document-viewer';\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 { Platform } from '@ionic/angular';\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 { Howl } from 'howler';\r\nimport { ViewMediaPage } from 'src/app/modals/view-media/view-media.page';\r\nimport { ChatMessageDebuggingPage } from 'src/app/shared/popover/chat-message-debugging/chat-message-debugging.page';\r\nimport { PermissionService } from 'src/app/services/permission.service';\r\n\r\n\r\nconst IMAGE_DIR = 'stored-images';\r\n@Component({\r\n selector: 'app-messages',\r\n templateUrl: './messages.page.html',\r\n styleUrls: ['./messages.page.scss'],\r\n})\r\nexport class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy {\r\n showLoader: boolean;\r\n\r\n @ViewChild('scrollMe') private myScrollContainer: ElementRef;\r\n @ViewChild('message-item') messageContainer: ElementRef;\r\n\r\n messages: any;\r\n dm: any;\r\n userPresence = '';\r\n dmUsers: any;\r\n checktimeOut: boolean;\r\n members: any;\r\n downloadProgess = 0;\r\n\r\n @Input() roomId: string;\r\n @Input() showMessages: string;\r\n\r\n @Output() openNewEventPage: EventEmitter<any> = new EventEmitter<any>();\r\n @Output() getDirectMessages: EventEmitter<any> = new EventEmitter<any>();\r\n\r\n\r\n chatMessageStore = ChatMessageStore\r\n chatUserStorage = ChatUserStorage\r\n\r\n scrollingOnce: boolean = true;\r\n private scrollChangeCallback: () => void;\r\n currentPosition: any;\r\n startPosition: number;\r\n mesageItemDropdownOptions: boolean = false;\r\n scrollToBottomBtn = false;\r\n longPressActive = false;\r\n frameUrl: any;\r\n downloadFile: string;\r\n massages: MessageService[] = []\r\n\r\n showAvatar = true;\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\r\n audioPermissionStatus: 'granted' | 'denied' | 'prompt' | null = null\r\n sessionStore = SessionStore\r\n audioPlay: Howl = null;\r\n isPlaying = false;\r\n audioProgress = 0;\r\n audioDuration = 0;\r\n audioTimer: any;\r\n @ViewChild('range', { static: false }) range: IonRange;\r\n userName = \"\";\r\n room: any = new Array();\r\n roomName: any;\r\n isAdmin = false;\r\n roomCountDownDate: string;\r\n\r\n constructor(\r\n public popoverController: PopoverController,\r\n private modalController: ModalController,\r\n /* private navParams: NavParams, */\r\n private chatService: ChatService,\r\n private animationController: AnimationController,\r\n private toastService: ToastService,\r\n private timeService: TimeService,\r\n private fileService: FileService,\r\n private gestureController: GestureController,\r\n public ThemeService: ThemeService,\r\n private storage: Storage,\r\n public ChatSystemService: ChatSystemService,\r\n public RochetChatConnectorService: RochetChatConnectorService,\r\n private CameraService: CameraService,\r\n private sanitiser: DomSanitizer,\r\n private file: File,\r\n private platform: Platform,\r\n private fileOpener: FileOpener,\r\n public p: PermissionService,\r\n ) {\r\n // update\r\n this.checkAudioPermission()\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n\r\n this.ChatSystemService.getAllRooms();\r\n this.ChatSystemService.getDmRoom(this.roomId).loadHistory({})\r\n\r\n this.ChatSystemService.getDmRoom(this.roomId).scrollDown = this.scrollToBottomClicked\r\n\r\n this.ChatSystemService.openRoom(this.roomId)\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 this.deleteRecording()\r\n\r\n\r\n // this.ChatSystemService.getDmRoom(this.roomId).deleteAll()\r\n\r\n }\r\n\r\n async ChatMessageDebuggingPage() {\r\n \r\n const modal = await this.modalController.create({\r\n component: ChatMessageDebuggingPage,\r\n cssClass: 'model profile-modal search-submodal',\r\n componentProps: {\r\n roomId: this.roomId,\r\n }\r\n });\r\n return await modal.present();\r\n }\r\n\r\n async checkAudioPermission() {\r\n const permissionStatus = await navigator.permissions.query({ name: 'microphone' } as any)\r\n\r\n\r\n\r\n this.audioPermissionStatus = permissionStatus.state\r\n\r\n permissionStatus.onchange = (data: any) => {\r\n // \r\n // \r\n }\r\n\r\n }\r\n\r\n ngOnInit() {\r\n this.ChatSystemService.getAllRooms();\r\n // this.chatService.refreshtoken();\r\n this.scrollToBottom();\r\n this.getChatMembers();\r\n\r\n this.deleteRecording();\r\n this.loadFiles();\r\n }\r\n\r\n\r\n onPressingMessage() {\r\n const gesture = this.gestureController.create({\r\n el: this.messageContainer.nativeElement,\r\n gestureName: 'long-press',\r\n onStart: ev => {\r\n this.longPressActive = true;\r\n\r\n },\r\n onEnd: ev => {\r\n this.longPressActive = false;\r\n\r\n }\r\n });\r\n }\r\n\r\n load = () => {\r\n this.checktimeOut = true;\r\n this.getChatMembers();\r\n }\r\n\r\n\r\n doRefresh(ev: any) {\r\n this.load();\r\n ev.target.complete();\r\n }\r\n\r\n scrollToBottom = () => {\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 //this.scrollingOnce = false;\r\n } catch (err) { }\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\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 const base64sound = audioFile.data;\r\n const base64Response = await fetch(`data:audio/ogg;base64,${base64sound}`);\r\n this.audioRecorded = base64Response.url;\r\n }\r\n\r\n async loadFiles() {\r\n try {\r\n this.storage.get('fileName').then((fileName) => {\r\n this.lastAudioRecorded = fileName;\r\n })\r\n\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 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 }\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 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 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 this.storage.set('fileName', fileName);\r\n this.storage.set('recordData', result).then(() => {\r\n\r\n })\r\n }\r\n })\r\n setTimeout(async () => {\r\n this.loadFiles();\r\n }, 1000);\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 ngOnDestroy() {\r\n this.checktimeOut = false;\r\n window.removeEventListener('scroll', this.scrollChangeCallback, true);\r\n }\r\n\r\n openBookMeetingComponent() {\r\n let data = {\r\n roomId: this.roomId,\r\n members: this.members\r\n }\r\n this.openNewEventPage.emit(data);\r\n }\r\n\r\n showDateDuration(start: any) {\r\n return this.timeService.showDateDuration(start);\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 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 sendMessage() {\r\n this.ChatSystemService.getDmRoom(this.roomId).send({})\r\n }\r\n\r\n\r\n async sendAudio(fileName) {\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\r\n if (recordData?.value?.recordDataBase64?.includes('data:audio')) {\r\n this.audioRecorded = recordData.value.recordDataBase64;\r\n }\r\n else {\r\n this.audioRecorded = `data:${recordData.value.mimeType};base64,${recordData?.value?.recordDataBase64}`;\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.getDmRoom(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 deleteMessage(msgId: string, msg: MessageService) {\r\n this.ChatSystemService.getDmRoom(this.roomId).sendDeleteRequest(msgId)\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\r\n async openViewDocumentModal(file: any) {\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 getChatMembers() {\r\n // \r\n\r\n // this.showLoader = true;\r\n // this.chatService.getMembers(this.roomId).subscribe(res => {\r\n // this.members = res['members'];\r\n // this.dmUsers = res['members'].filter(data => data.username != this.sessionStore.user.UserName)\r\n // this.showLoader = false;\r\n // });\r\n\r\n this.members = this.ChatSystemService.getDmRoom(this.roomId).members\r\n this.dmUsers = this.ChatSystemService.getDmRoom(this.roomId).membersExcludeMe\r\n }\r\n\r\n async openMessagesOptions(ev: any) {\r\n const popover = await this.popoverController.create({\r\n component: MessagesOptionsPage,\r\n componentProps: {\r\n roomId: this.dm._id,\r\n },\r\n cssClass: 'messages-options',\r\n event: ev,\r\n translucent: true,\r\n });\r\n return await popover.present();\r\n }\r\n\r\n async addContacts() {\r\n const modal = await this.modalController.create({\r\n component: ContactsPage,\r\n componentProps: {},\r\n cssClass: 'contacts',\r\n backdropDismiss: false\r\n });\r\n\r\n await modal.present();\r\n\r\n modal.onDidDismiss();\r\n }\r\n\r\n openSendMessageOptions(ev?: any) {\r\n if (window.innerWidth < 701) {\r\n\r\n this.openChatOptions(ev);\r\n }\r\n else {\r\n\r\n this._openChatOptions();\r\n }\r\n }\r\n\r\n async openChatOptions(ev: any) {\r\n const popover = await this.popoverController.create({\r\n component: ChatOptionsPopoverPage,\r\n cssClass: 'chat-options-popover',\r\n event: ev,\r\n translucent: true\r\n });\r\n return await popover.present();\r\n }\r\n\r\n\r\n\r\n async _openMessagesOptions() {\r\n\r\n const enterAnimation = (baseEl: any) => {\r\n const backdropAnimation = this.animationController.create()\r\n .addElement(baseEl.querySelector('ion-backdrop')!)\r\n .fromTo('opacity', '0.01', 'var(--backdrop-opacity)');\r\n\r\n const wrapperAnimation = this.animationController.create()\r\n .addElement(baseEl.querySelector('.modal-wrapper')!)\r\n .keyframes([\r\n { offset: 0, opacity: '1', right: '-100%' },\r\n { offset: 1, opacity: '1', right: '0px' }\r\n ]);\r\n\r\n return this.animationController.create()\r\n .addElement(baseEl)\r\n .easing('ease-out')\r\n .duration(500)\r\n .addAnimation([backdropAnimation, wrapperAnimation]);\r\n }\r\n\r\n const leaveAnimation = (baseEl: any) => {\r\n return enterAnimation(baseEl).direction('reverse');\r\n }\r\n\r\n\r\n const modal = await this.modalController.create({\r\n enterAnimation,\r\n leaveAnimation,\r\n component: MessagesOptionsPage,\r\n cssClass: 'model profile-modal search-submodal',\r\n componentProps: {\r\n roomId: this.roomId,\r\n }\r\n });\r\n return await modal.present();\r\n }\r\n\r\n\r\n dataURItoBlob(dataURI) {\r\n // convert base64 to raw binary data held in a string\r\n // doesn't handle URLEncoded DataURIs - see SO answer #6850276 for code that does this\r\n var byteString = atob(dataURI.split(',')[1]);\r\n \r\n // separate out the mime component\r\n var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]\r\n \r\n // write the bytes of the string to an ArrayBuffer\r\n var ab = new ArrayBuffer(byteString.length);\r\n \r\n // create a view into the buffer\r\n var ia = new Uint8Array(ab);\r\n \r\n // set the bytes of the buffer to the correct values\r\n for (var i = 0; i < byteString.length; i++) {\r\n ia[i] = byteString.charCodeAt(i);\r\n }\r\n \r\n // write the ArrayBuffer to a blob, and you're done\r\n var blob = new Blob([ab], {type: mimeString});\r\n return blob;\r\n \r\n }\r\n\r\n async takePictureMobile() {\r\n\r\n\r\n const roomId = this.roomId\r\n\r\n const file = await Camera.getPhoto({\r\n quality: 90,\r\n // allowEditing: true,\r\n resultType: CameraResultType.Base64,\r\n source: CameraSource.Camera\r\n });\r\n\r\n const blob = this.dataURItoBlob('data:image/jpeg;base64,' + file.base64String)\r\n\r\n const formData = new FormData();\r\n formData.append(\"blobFile\", blob);\r\n\r\n this.ChatSystemService.getDmRoom(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\": file.path,\r\n // \"image_url\": \"\",\r\n //\"image_url\": 'data:image/jpeg;base64,' + file.base64String,\r\n \"text\": \"description\",\r\n \"title_link_download\": false,\r\n }]\r\n })\r\n\r\n }\r\n\r\n async takePicture() {\r\n\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\r\n const blob = await base64.blob();\r\n const formData = new FormData();\r\n formData.append(\"blobFile\", blob);\r\n\r\n\r\n\r\n this.ChatSystemService.getDmRoom(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 \"image_url\": capturedImage,\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.addFileToChatMobile(['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\r\n const data = res.data;\r\n const roomId = this.roomId\r\n\r\n if (data.selected) {\r\n\r\n this.ChatSystemService.getDmRoom(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_download\": true,\r\n \"type\": \"webtrix\",\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 addFileToChatMobile(types: typeof FileType[]) {\r\n const roomId = this.roomId\r\n\r\n const file = await Camera.getPhoto({\r\n quality: 90,\r\n // allowEditing: true,\r\n resultType: CameraResultType.Base64,\r\n source: CameraSource.Photos\r\n });\r\n\r\n //const imageData = await this.fileToBase64Service.convert(file)\r\n //\r\n\r\n const response = await fetch('data:image/jpeg;base64,' + file.base64String!);\r\n const blob = await response.blob();\r\n\r\n const formData = new FormData();\r\n formData.append(\"blobFile\", blob);\r\n\r\n this.ChatSystemService.getDmRoom(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\": file.path,\r\n //\"image_url\": 'data:image/jpeg;base64,' + file.base64String,\r\n \"text\": \"description\",\r\n \"title_link_download\": false,\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 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\r\n const formData = new FormData();\r\n formData.append(\"blobFile\", blob);\r\n\r\n this.ChatSystemService.getDmRoom(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 //\"image_url\": res,\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\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\r\n bookMeeting() {\r\n let data = {\r\n roomId: this.roomId,\r\n members: this.members\r\n }\r\n this.openNewEventPage.emit(data);\r\n }\r\n\r\n\r\n chatsend() {\r\n\r\n }\r\n\r\n async _openChatOptions() {\r\n const roomId = this.roomId;\r\n\r\n\r\n const enterAnimation = (baseEl: any) => {\r\n const backdropAnimation = this.animationController.create()\r\n .addElement(baseEl.querySelector('ion-backdrop')!)\r\n .fromTo('opacity', '0.01', 'var(--backdrop-opacity)');\r\n\r\n const wrapperAnimation = this.animationController.create()\r\n .addElement(baseEl.querySelector('.modal-wrapper')!)\r\n .keyframes([\r\n { offset: 0, opacity: '1', right: '-100%' },\r\n { offset: 1, opacity: '1', right: '0px' }\r\n ]);\r\n\r\n return this.animationController.create()\r\n .addElement(baseEl)\r\n .easing('ease-out')\r\n .duration(500)\r\n .addAnimation([backdropAnimation, wrapperAnimation]);\r\n }\r\n\r\n const leaveAnimation = (baseEl: any) => {\r\n return enterAnimation(baseEl).direction('reverse');\r\n }\r\n\r\n const modal = await this.modalController.create({\r\n enterAnimation,\r\n leaveAnimation,\r\n component: ChatOptionsFeaturesPage,\r\n cssClass: 'model profile-modal search-submodal',\r\n componentProps: {\r\n roomId: this.roomId,\r\n members: this.members,\r\n }\r\n });\r\n await modal.present();\r\n modal.onDidDismiss().then(async (res) => {\r\n\r\n\r\n\r\n if (res['data'] == 'meeting') {\r\n //this.closeAllDesktopComponents.emit();\r\n let data = {\r\n roomId: this.roomId,\r\n members: this.members\r\n }\r\n this.openNewEventPage.emit(data);\r\n }\r\n else if (res['data'] == 'take-picture') {\r\n\r\n this.takePictureMobile()\r\n\r\n }\r\n else if (res['data'] == 'add-picture') {\r\n\r\n this.addImage()\r\n\r\n }\r\n else if (res['data'] == 'add-document') {\r\n\r\n this.addFile()\r\n\r\n }\r\n else if (res['data'] == 'documentoGestaoDocumental') {\r\n\r\n this.addFileWebtrix()\r\n\r\n this.showLoader = false;\r\n }\r\n\r\n });\r\n }\r\n\r\n\r\n\r\n\r\n downloadFileMsg(msg: MessageService) {\r\n msg.downloadFileMsg()\r\n }\r\n\r\n pdfPreview() {\r\n const options: DocumentViewerOptions = {\r\n title: 'My App'\r\n };\r\n DocumentViewer.viewDocument\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 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 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 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 openFile(pdfString, filename, type) {\r\n const blob = this.b64toBlob(pdfString, type)\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, type)\r\n .then(() => { })\r\n .catch(e => console.error(e))\r\n })\r\n .catch(e => console.error(e))\r\n }\r\n\r\n async openPreview(msg) {\r\n\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\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 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 }\r\n\r\n\r\n } else {\r\n this.openFile(str, msg.attachments[0].title, msg.file.type);\r\n // this.downloadFileFromBrowser(\"file\", str)\r\n }\r\n\r\n }\r\n }\r\n\r\n }\r\n\r\n start(track) {\r\n if (this.audioPlay) {\r\n this.audioPlay.stop();\r\n }\r\n this.audioPlay = new Howl({\r\n src: [track.changingThisBreaksApplicationSecurity],\r\n onplay: () => {\r\n this.isPlaying = true;\r\n this.updateProgress()\r\n },\r\n onend: () => {\r\n this.isPlaying = false;\r\n clearTimeout(this.audioTimer)\r\n this.audioProgress = 0\r\n\r\n },\r\n })\r\n this.audioPlay.play();\r\n }\r\n\r\n togglePlayer(pause) {\r\n this.isPlaying = !pause;\r\n if (pause) {\r\n this.audioPlay.pause();\r\n } else {\r\n this.audioPlay.play();\r\n }\r\n }\r\n\r\n seek() {\r\n let newValue = +this.range.value;\r\n let duration = this.audioPlay.duration();\r\n this.audioPlay.seek(duration * (newValue / 100));\r\n }\r\n\r\n updateProgress() {\r\n let seek = this.audioPlay.seek();\r\n this.audioProgress = (seek / this.audioPlay.duration()) * 100 || 0;\r\n this.audioTimer = setTimeout(() => {\r\n this.updateProgress()\r\n }, 1000)\r\n }\r\n\r\n async getRoomInfo() {\r\n let room = await this.chatService.getRoomInfo(this.roomId).toPromise();\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\r\n}\r\n\r\n\r\n\r\n"]},"metadata":{},"sourceType":"module"} |