diff --git a/ios/App/App.xcodeproj/project.pbxproj b/ios/App/App.xcodeproj/project.pbxproj index 02a8ed1b5..9592bd96e 100644 --- a/ios/App/App.xcodeproj/project.pbxproj +++ b/ios/App/App.xcodeproj/project.pbxproj @@ -489,7 +489,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = App/App.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 88; + CURRENT_PROJECT_VERSION = 94; DEVELOPMENT_TEAM = 94BRNM2LSS; ENABLE_USER_SCRIPT_SANDBOXING = NO; INFOPLIST_FILE = App/Info.plist; @@ -498,7 +498,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 3.8; + MARKETING_VERSION = 4.4; OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\""; PRODUCT_BUNDLE_IDENTIFIER = com.gpr.gabinetedigital.teste; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -516,7 +516,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = App/App.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 88; + CURRENT_PROJECT_VERSION = 94; DEVELOPMENT_TEAM = 94BRNM2LSS; ENABLE_USER_SCRIPT_SANDBOXING = NO; INFOPLIST_FILE = App/Info.plist; @@ -525,7 +525,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 3.8; + MARKETING_VERSION = 4.4; PRODUCT_BUNDLE_IDENTIFIER = com.gpr.gabinetedigital.teste; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_ACTIVE_COMPILATION_CONDITIONS = ""; diff --git a/ios/App/App/Info.plist b/ios/App/App/Info.plist index 27edf47ff..2e3b9eca0 100644 --- a/ios/App/App/Info.plist +++ b/ios/App/App/Info.plist @@ -87,6 +87,23 @@ UIViewControllerBasedStatusBarAppearance + NSExtensionActivationRule + + NSExtensionActivationSupportsFileWithMaxCount + 5 + NSExtensionActivationSupportsImageWithMaxCount + 5 + NSExtensionActivationSupportsMovieWithMaxCount + 5 + NSExtensionActivationSupportsText + + NSExtensionActivationSupportsWebPageWithMaxCount + 1 + NSExtensionActivationSupportsWebURLWithMaxCount + 1 + NSExtensionActivationUsesStrictMatching + + UNUserNotificationCenterDelegate YourApp.NotificationDelegate diff --git a/ios/App/Share/Info.plist b/ios/App/Share/Info.plist index 7beb8da40..4bcc55b8d 100644 --- a/ios/App/Share/Info.plist +++ b/ios/App/Share/Info.plist @@ -15,12 +15,20 @@ NSExtensionActivationRule - NSExtensionActivationSupportsImageWithMaxCount - 1 - NSExtensionActivationSupportsMovieWithMaxCount - 1 - NSExtensionActivationSupportsWebURLWithMaxCount - 1 + NSExtensionActivationSupportsFileWithMaxCount + 5 + NSExtensionActivationSupportsImageWithMaxCount + 5 + NSExtensionActivationSupportsMovieWithMaxCount + 5 + NSExtensionActivationSupportsText + + NSExtensionActivationSupportsWebPageWithMaxCount + 1 + NSExtensionActivationSupportsWebURLWithMaxCount + 1 + NSExtensionActivationUsesStrictMatching + NSExtensionMainStoryboard diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 3808095bb..2c173ea0c 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -301,6 +301,10 @@ const routes = [ { path: 'not-found', loadChildren: () => import('./pages/not-found/not-found.module').then( m => m.NotFoundPageModule) + }, + { + path: 'view-document-second-options', + loadChildren: () => import('./modals/view-document-second-options/view-document-second-options.module').then( m => m.ViewDocumentSecondOptionsPageModule) } /* diff --git a/src/app/modals/view-document-second-options/view-document-second-options-routing.module.ts b/src/app/modals/view-document-second-options/view-document-second-options-routing.module.ts new file mode 100644 index 000000000..2957c8f86 --- /dev/null +++ b/src/app/modals/view-document-second-options/view-document-second-options-routing.module.ts @@ -0,0 +1,17 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; + +import { ViewDocumentSecondOptionsPage } from './view-document-second-options.page'; + +const routes: Routes = [ + { + path: '', + component: ViewDocumentSecondOptionsPage + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class ViewDocumentSecondOptionsPageRoutingModule {} diff --git a/src/app/modals/view-document-second-options/view-document-second-options.module.ts b/src/app/modals/view-document-second-options/view-document-second-options.module.ts new file mode 100644 index 000000000..8fae80960 --- /dev/null +++ b/src/app/modals/view-document-second-options/view-document-second-options.module.ts @@ -0,0 +1,22 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import { IonicModule } from '@ionic/angular'; + +import { ViewDocumentSecondOptionsPageRoutingModule } from './view-document-second-options-routing.module'; + +import { ViewDocumentSecondOptionsPage } from './view-document-second-options.page'; +import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; + +@NgModule({ + imports: [ + CommonModule, + FormsModule, + IonicModule, + ViewDocumentSecondOptionsPageRoutingModule, + FontAwesomeModule + ], + declarations: [ViewDocumentSecondOptionsPage] +}) +export class ViewDocumentSecondOptionsPageModule {} diff --git a/src/app/modals/view-document-second-options/view-document-second-options.page.html b/src/app/modals/view-document-second-options/view-document-second-options.page.html new file mode 100644 index 000000000..18f0ae4c4 --- /dev/null +++ b/src/app/modals/view-document-second-options/view-document-second-options.page.html @@ -0,0 +1,24 @@ + + +
+
+ +
+ +
+ {{filename}} +
+ +
+ +
+ +
+
+
+ + +
+ +
+
diff --git a/src/app/modals/view-document-second-options/view-document-second-options.page.scss b/src/app/modals/view-document-second-options/view-document-second-options.page.scss new file mode 100644 index 000000000..d13f62918 --- /dev/null +++ b/src/app/modals/view-document-second-options/view-document-second-options.page.scss @@ -0,0 +1,27 @@ +.left{ + float: left; + } + .middle{ + float: left; + padding-left: 5px !important; + } + .right{ + float: right; + margin-left: auto; + } + + + .container-img { + background-image: url(/assets/gif/theme/gov/Blocks-loader.svg); + background-repeat: no-repeat; + background-position-x: center; + background-position-y: center; + } + + + @media only screen and (max-width: 650px) { + + .container-img { + background-size: 25%; + } + } \ No newline at end of file diff --git a/src/app/modals/view-document-second-options/view-document-second-options.page.spec.ts b/src/app/modals/view-document-second-options/view-document-second-options.page.spec.ts new file mode 100644 index 000000000..7e0ace560 --- /dev/null +++ b/src/app/modals/view-document-second-options/view-document-second-options.page.spec.ts @@ -0,0 +1,24 @@ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { IonicModule } from '@ionic/angular'; + +import { ViewDocumentSecondOptionsPage } from './view-document-second-options.page'; + +describe('ViewDocumentSecondOptionsPage', () => { + let component: ViewDocumentSecondOptionsPage; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ ViewDocumentSecondOptionsPage ], + imports: [IonicModule.forRoot()] + }).compileComponents(); + + fixture = TestBed.createComponent(ViewDocumentSecondOptionsPage); + component = fixture.componentInstance; + fixture.detectChanges(); + })); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/modals/view-document-second-options/view-document-second-options.page.ts b/src/app/modals/view-document-second-options/view-document-second-options.page.ts new file mode 100644 index 000000000..9b403ff3a --- /dev/null +++ b/src/app/modals/view-document-second-options/view-document-second-options.page.ts @@ -0,0 +1,40 @@ +import { Component, OnInit } from '@angular/core'; +import { DomSanitizer } from '@angular/platform-browser'; +import { ModalController, NavParams } from '@ionic/angular'; + +@Component({ + selector: 'app-view-document-second-options', + templateUrl: './view-document-second-options.page.html', + styleUrls: ['./view-document-second-options.page.scss'], +}) +export class ViewDocumentSecondOptionsPage implements OnInit { + + fileUrl: string; + filename: string; + completeUrl: string + trustedUrl: any; + + + constructor( + private modalController: ModalController, + private navParams: NavParams, + private sanitazer: DomSanitizer, + ) { + this.fileUrl = this.navParams.get('fileUrl'); + this.filename = this.navParams.get('filename'); + this.completeUrl = `/assets/www/pdfjs/web/viewer.html?file=${this.fileUrl}`; + } + + ngOnInit() { + console.log(this.fileUrl) + console.log(this.completeUrl) + + const link: string = this.completeUrl.replace('//pdfjs/web/', '/pdfjs/web/') + this.trustedUrl = this.sanitazer.bypassSecurityTrustResourceUrl(link); + } + + close() { + this.modalController.dismiss(); + } + +} diff --git a/src/app/pages/chat/group-messages/group-messages.page.ts b/src/app/pages/chat/group-messages/group-messages.page.ts index 568920ec3..2ff2d020b 100644 --- a/src/app/pages/chat/group-messages/group-messages.page.ts +++ b/src/app/pages/chat/group-messages/group-messages.page.ts @@ -35,6 +35,7 @@ import { RouteService } from 'src/app/services/route.service'; import { FileValidatorService } from "src/app/services/file/file-validator.service" import { sanitize } from "sanitize-filename-ts"; import { FilePicker } from '@capawesome/capacitor-file-picker'; +import { ViewDocumentSecondOptionsPage } from 'src/app/modals/view-document-second-options/view-document-second-options.page'; @Component({ selector: 'app-group-messages', @@ -1160,7 +1161,16 @@ export class GroupMessagesPage implements OnInit, AfterViewInit, OnDestroy { } async openFile(pdfString, filename, type) { - const blob = this.b64toBlob(pdfString, type) + const modal = await this.modalController.create({ + component: ViewDocumentSecondOptionsPage, + componentProps: { + fileUrl: pdfString, + filename: filename + }, + cssClass: 'modal modal-desktop' + }); + await modal.present(); + /* const blob = this.b64toBlob(pdfString, type) let pathFile = '' const fileName = filename const contentFile = blob @@ -1180,7 +1190,7 @@ export class GroupMessagesPage implements OnInit, AfterViewInit, OnDestroy { .open(dir.uri, type) .then(() => console.log()) .catch(e => console.error(e)) - }); + }); */ } downloadFileMsg(msg: MessageService) { @@ -1242,7 +1252,7 @@ export class GroupMessagesPage implements OnInit, AfterViewInit, OnDestroy { }); modal.present(); } else { - this.openFile(str, msg.attachments[0].title, msg.file.type); + this.openFile(msg.attachments[0].image_url, msg.attachments[0].title, msg.file.type); } } } diff --git a/src/app/pages/chat/messages/messages.page.html b/src/app/pages/chat/messages/messages.page.html index 5e82e5eb5..d0572fba5 100644 --- a/src/app/pages/chat/messages/messages.page.html +++ b/src/app/pages/chat/messages/messages.page.html @@ -80,7 +80,6 @@ -
{ + this.ChatSystemService.getDmRoom(this.roomId).setChangeDetector(() => { this.changeDetector() }) @@ -163,7 +164,7 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { ngOnInit() { try { - // console.log(this.router.url); + // console.log(this.router.url); this.createDirectoryImage() // this.chatService.refreshtoken(); this.ChatSystemService.getUserOfRoom(this.roomId).then((value) => { @@ -852,7 +853,7 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { console.log('add file ') const roomId = this.roomId - if(this.platform.is('ios')) { + if (this.platform.is('ios')) { console.log('ios add file ') const resultt = await FilePicker.pickFiles({ @@ -861,7 +862,7 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { readData: true, }); - console.log('RESULT', resultt.files[0]) + console.log('RESULT', resultt.files[0].data) const blobb = this.fileService.base64toBlob(resultt.files[0].data, resultt.files[0].mimeType) @@ -886,7 +887,7 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { } }) return - + } const file: any = await this.fileService.getFileFromDevice(types); @@ -904,41 +905,41 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { formData.append('blobFile', blob); console.log('add file', fileBase64) */ - const fileName = file.name + const fileName = file.name - const validation = this.FileValidatorService.fileNameValidation(fileName) + const validation = this.FileValidatorService.fileNameValidation(fileName) - if(validation.isOk) { + if (validation.isOk) { - const encodedData = btoa(JSON.stringify(await this.getBase64(file).catch((error) => { - console.error(error); - }))); - console.log(encodedData) - const blob = this.fileService.base64toBlob(encodedData, file.type) + const encodedData = btoa(JSON.stringify(await this.getBase64(file).catch((error) => { + console.error(error); + }))); + console.log(encodedData) + const blob = this.fileService.base64toBlob(encodedData, file.type) - const formData = new FormData(); - formData.append('blobFile', blob); - /* console.log('add file', fileBase64) */ + const formData = new FormData(); + formData.append('blobFile', blob); + /* console.log('add file', fileBase64) */ - this.ChatSystemService.getDmRoom(roomId).send({ - file: { - "type": file.type, - "guid": '', - }, - attachments: [{ - "title": sanitize(fileName), - "name": sanitize(fileName), - // "text": "description", - "title_link_download": false, - }], - temporaryData: formData, - attachmentsModelData: { - fileBase64: encodedData, - } - }); - } else { - this.toastService._badRequest("Ficheiro inválido") - } + this.ChatSystemService.getDmRoom(roomId).send({ + file: { + "type": file.type, + "guid": '', + }, + attachments: [{ + "title": sanitize(fileName), + "name": sanitize(fileName), + // "text": "description", + "title_link_download": false, + }], + temporaryData: formData, + attachmentsModelData: { + fileBase64: encodedData, + } + }); + } else { + this.toastService._badRequest("Ficheiro inválido") + } } @@ -1105,7 +1106,38 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { return blob; } + blobToBase64(blob) { + return new Promise((resolve, _) => { + const reader = new FileReader(); + reader.onloadend = () => resolve(reader.result); + reader.readAsDataURL(blob); + }); + } + async openFile(pdfString, filename, type) { + + console.log('url while open ',pdfString) + + const modal = await this.modalController.create({ + component: ViewDocumentSecondOptionsPage, + componentProps: { + fileUrl: pdfString, + filename: filename + }, + cssClass: 'modal modal-desktop' + }); + await modal.present(); +/* + var blob = new Blob([pdfString], { type: 'application/pdf' }); + + console.log('blob blob', blob) + + this.blobToBase64(blob).then((value) => { + console.log(value) + }).catch((error) => { + console.log(error) + }) + let pathFile = '' const fileName = filename if (this.platform.is('ios')) { @@ -1114,13 +1146,17 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { pathFile = this.file.externalRootDirectory } + console.log('file data', pdfString) console.log(pathFile) + let removePre = this.removeTextBeforeSlash(pdfString,',') + console.log('file data remove ', removePre) + await Filesystem.writeFile({ path: fileName, - data: pdfString, + data: removePre, directory: Directory.Cache, - encoding: Encoding.UTF8, + encoding: Encoding.UTF8 }).then((dir) => { console.log('DIR ', dir) this.fileOpener @@ -1129,7 +1165,16 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { .catch(e => console.error(e)) }).catch((error) => { console.log('error writing the file', error) - }); + }); */ + } + + removeTextBeforeSlash(inputString, controlString) { + if (inputString.includes(controlString)) { + const parts = inputString.split(controlString); + return parts.length > 1 ? parts[1] : inputString; + } else { + return inputString; + } } downloadFileFromBrowser(fileName: string, data: any): void { @@ -1195,7 +1240,7 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { }); modal.present(); } else { - this.openFile(str, msg.attachments[0].title, msg.file.type); + this.openFile(msg.attachments[0].image_url, msg.attachments[0].title, msg.file.type); } } @@ -1293,9 +1338,9 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { for (let i = 0; i < byteString.length; i++) { int8Array[i] = byteString.charCodeAt(i); } - const blob = new Blob([int8Array], { type: 'application/pdf' }); + const blob = new Blob([int8Array], { type: 'application/pdf' }); return blob; -} + } } diff --git a/src/app/pages/publications/new-publication/new-publication.page.ts b/src/app/pages/publications/new-publication/new-publication.page.ts index dc36e34f8..230b452ac 100644 --- a/src/app/pages/publications/new-publication/new-publication.page.ts +++ b/src/app/pages/publications/new-publication/new-publication.page.ts @@ -277,43 +277,37 @@ export class NewPublicationPage implements OnInit { } } - async loadVideo() { - - const result = await FilePicker.pickMedia - ({ - multiple: true, - }); - console.log(result.files) - result.files.forEach(async element => { - - this.filesSizeSum = this.filesSizeSum + element.size - if (this.fileSizeToMB(this.filesSizeSum) <= 20) { - console.log('pass size verificartion') - if (this.checkFileType.checkFileType(element.mimeType) == 'image' || this.checkFileType.checkFileType(element.mimeType) == 'video') { + async loadVideo() { + const result = await FilePicker.pickMedia ({ multiple: true, }); + console.log(result.files) + result.files.forEach(async element => { + this.filesSizeSum = this.filesSizeSum + element.size + if (this.fileSizeToMB(this.filesSizeSum) <= 20) { + console.log('pass size verificartion') + if (this.checkFileType.checkFileType(element.mimeType) == 'video' && this.platform.is('ios')) { + let resultUrl = decodeURIComponent(element.path); console.log('pass type verification ', resultUrl) + try { + this.recordevideoIos(resultUrl) + } catch (error) { + console.log('upload video error: ', error) + } + } else if (this.checkFileType.checkFileType(element.mimeType) == 'image' || this.checkFileType.checkFileType(element.mimeType) == 'video') { let resultUrl = decodeURIComponent(element.path); - console.log('pass type verification ', resultUrl) + console.log('pass type verification ', resultUrl) + try { + this.loadVideoAndroid(resultUrl,element) + } catch (error) { + console.log('upload video error: ', error) + } + } + } else { + if (this.seletedContent.length === 0) + this.filesSizeSum = 0 - try { - - if(this.platform.is('ios')) { - this.recordevideoIos(resultUrl) - } else { - this.loadVideoAndroid(resultUrl,element) - } - - } catch (error) { - console.log('upload video error: ', error) - } - - } - } else { - if (this.seletedContent.length === 0) - this.filesSizeSum = 0 - - this.httpErrorHandle.validationMessagge('filessize') - } - }); - }; + this.httpErrorHandle.validationMessagge('filessize') + } + }); + }; chossePhotoOrVideo() { @@ -841,7 +835,7 @@ console.log(stringGerada); fileObject ={}; const deleteSecretFile = async () => { await Filesystem.deleteFile({ - path: 'output.mp4', + path: `${stringGerada}.mp4`, directory: Directory.Cache, }); }; @@ -958,27 +952,27 @@ console.log(stringGerada); }); let fileObject ={}; - this.videoconvertService.convertVideo(fullPath,directory.uri,filename,'mp4').then(() => { - Filesystem.readFile({ path: `${directory.uri}output.mp4`}) + this.videoconvertService.convertVideo(fullPath,directory.uri,filename,'mp4').then(async () => { + await Filesystem.readFile({ path: `${directory.uri}${filename}.mp4`}) .then(async (content) => { console.log(content.data) this.filecontent = true; - fileObject = { + /* fileObject = { FileBase64: this.removeTextBeforeSlash(content.data, ','), - FileExtension: FileExtension, + FileExtension: 'mp4', OriginalFileName: 'shared', - } + } */ fileObject = { FileBase64: 'data:video/mp4;base64,' + this.removeTextBeforeSlash(content.data, ','), - FileExtension: FileExtension, + FileExtension: 'mp4', OriginalFileName: 'shared', } this.seletedContent.push(fileObject) fileObject ={}; const deleteSecretFile = async () => { await Filesystem.deleteFile({ - path: 'output.mp4', + path: `${filename}.mp4`, directory: Directory.Cache, }); }; diff --git a/src/app/services/chat/message.service.ts b/src/app/services/chat/message.service.ts index 4fca908d9..e1e519d79 100644 --- a/src/app/services/chat/message.service.ts +++ b/src/app/services/chat/message.service.ts @@ -456,9 +456,12 @@ export class MessageService { if (this.file.type == "application/img") { downloadFile = 'data:image/jpeg;base64,' + btoa(new Uint8Array(event.body).reduce((data, byte) => data + String.fromCharCode(byte), '')); } else if (this.file.type != "application/img") { - - downloadFile = new Uint8Array(event.body).reduce((data, byte) => data + String.fromCharCode(byte), ''); + downloadFile = event.url + /* + let */ + /* downloadFile = btoa(new Uint8Array(event.body).reduce((data, byte) => data + String.fromCharCode(byte), '')); */ console.log('downloaded file', downloadFile) + console.log('event body downloaded file', event.url) } diff --git a/src/app/shared/chat/messages/messages.page.ts b/src/app/shared/chat/messages/messages.page.ts index 8ef5e2ece..22276c683 100644 --- a/src/app/shared/chat/messages/messages.page.ts +++ b/src/app/shared/chat/messages/messages.page.ts @@ -891,7 +891,7 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy fileBase64 = await this._getBase64(file) formData = new FormData(); - formData.append('blobFile', file); + formData.append('blobFile', blob); } diff --git a/src/app/shared/publication/new-publication/new-publication.page.ts b/src/app/shared/publication/new-publication/new-publication.page.ts index 7cbda136a..117be63ce 100644 --- a/src/app/shared/publication/new-publication/new-publication.page.ts +++ b/src/app/shared/publication/new-publication/new-publication.page.ts @@ -778,7 +778,7 @@ console.log(stringGerada); this.videoconvertService.convertVideo(fullPath,directory.uri,stringGerada,'mp4'); - Filesystem.readFile({ path: `${directory.uri}output.mp4`}) + Filesystem.readFile({ path: `${directory.uri}${stringGerada}.mp4`}) .then(async (content) => { this.filecontent = true; diff --git a/src/assets/www/pdfjs/web/viewer.js b/src/assets/www/pdfjs/web/viewer.js index f3e0500e3..62513d7ad 100644 --- a/src/assets/www/pdfjs/web/viewer.js +++ b/src/assets/www/pdfjs/web/viewer.js @@ -1923,7 +1923,7 @@ } if (file) { - PDFViewerApplication.open(file); + PDFViewerApplication.open(new URLSearchParams(window.location.search).get("file")); } }; }