This commit is contained in:
Peter Maquiran
2024-03-26 12:03:30 +01:00
parent 0b876e516b
commit ca0b968abe
32 changed files with 1016 additions and 794 deletions
@@ -103,9 +103,6 @@ export class ChatTokenInterceptor implements HttpInterceptor {
private addToken(request: HttpRequest<any>, token: string) {
let headers = new HttpHeaders();
console.log('X-User-Id', SessionStore.user.ChatData.data.userId)
console.log('X-Auth-Token', SessionStore.user.ChatData.data.authToken)
headers = headers.set('X-User-Id', SessionStore.user.ChatData.data.userId);
headers = headers.set('X-Auth-Token', SessionStore.user.ChatData.data.authToken);
+1 -12
View File
@@ -32,7 +32,6 @@ import { EventTrigger } from 'src/app/services/eventTrigger.service';
import { RochetChatConnectorService } from 'src/app/services/chat/rochet-chat-connector.service';
import { RouteService } from 'src/app/services/route.service';
import { Plugins } from '@capacitor/core';
import { ChangeDetectorRef } from '@angular/core';
const { App } = Plugins;
@@ -129,8 +128,7 @@ export class ChatPage implements OnInit {
private eventTriger: EventTrigger,
private RochetChatConnectorService: RochetChatConnectorService,
private zone: NgZone,
public RouteService: RouteService,
private ChangeDetectorRef: ChangeDetectorRef
public RouteService: RouteService
) {
this.headers = new HttpHeaders();;
@@ -178,15 +176,6 @@ export class ChatPage implements OnInit {
}
});
this.ChatSystemService.setMainChangeDetector(()=> {
this.changeDetector()
})
}
changeDetector = () => {
console.log('run detection')
this.ChangeDetectorRef.detectChanges()
}
@@ -110,7 +110,6 @@ export class GroupMessagesPage implements OnInit, AfterViewInit, OnDestroy {
private fileOpener: FileOpener,
public RouteService: RouteService,
private FileValidatorService: FileValidatorService,
private ChangeDetectorRef: ChangeDetectorRef
) {
this.ChatSystemService.getUser()
@@ -147,10 +146,6 @@ export class GroupMessagesPage implements OnInit, AfterViewInit, OnDestroy {
this.ChatSystemService.getGroupRoom(this.roomId).scrollDown = this.scrollToBottomClicked;
this.ChatSystemService.openRoom(this.roomId)
this.groupNameFormart = this.ChatSystemService.getGroupRoom(this.roomId).name.split('-').join(' ')
this.ChatSystemService.getGroupRoom(this.roomId).setChangeDetector(()=> {
this.changeDetector()
})
} catch (error) {
setTimeout(() => {
this.open()
@@ -159,11 +154,6 @@ export class GroupMessagesPage implements OnInit, AfterViewInit, OnDestroy {
}
changeDetector = () => {
console.log('run detection page')
this.ChangeDetectorRef.detectChanges()
}
ngOnInit() {
this.loggedUser = this.loggedUserChat;
@@ -841,7 +831,7 @@ export class GroupMessagesPage implements OnInit, AfterViewInit, OnDestroy {
async addFileToChat(types: typeof FileType[]) {
const roomId = this.roomId
@@ -879,7 +869,7 @@ export class GroupMessagesPage implements OnInit, AfterViewInit, OnDestroy {
}
})
return
}
const file: any = await this.fileService.getFileFromDevice(types);
+2 -11
View File
@@ -37,7 +37,6 @@ import { RochetChatConnectorService } from 'src/app/services/chat/rochet-chat-co
import { FileValidatorService } from "src/app/services/file/file-validator.service"
import { sanitize } from "sanitize-filename-ts";
import { FilePicker } from '@capawesome/capacitor-file-picker';
import { ChangeDetectorRef } from '@angular/core';
@@ -125,7 +124,6 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy {
private router: Router,
public RochetChatConnectorService: RochetChatConnectorService,
private FileValidatorService: FileValidatorService,
private ChangeDetectorRef: ChangeDetectorRef
) {
try {
@@ -144,10 +142,6 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy {
this.ChatSystemService.getDmRoom(this.roomId).loadHistory({})
this.ChatSystemService.getDmRoom(this.roomId).scrollDown = this.scrollToBottomClicked
this.ChatSystemService.openRoom(this.roomId)
this.ChatSystemService.getDmRoom(this.roomId).setChangeDetector(() => {
this.changeDetector()
})
setTimeout(() => {
this.scrollToBottomClicked()
@@ -157,10 +151,7 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy {
}
}
changeDetector = () => {
console.log('run detection page')
this.ChangeDetectorRef.detectChanges()
}
ngOnInit() {
try {
@@ -1127,7 +1118,7 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy {
cssClass: 'modal modal-desktop'
});
await modal.present();
/*
/*
var blob = new Blob([pdfString], { type: 'application/pdf' });
console.log('blob blob', blob)
-2
View File
@@ -314,5 +314,3 @@
<!-- <iframe id="home-iframe" style="width: 100%;" src="/assets/www/pdfjs/web/viewer.html?file=/assets/www/pdfjs/web/compressed.tracemonkey-pldi-09.pdf.pdf"></iframe> -->
</ion-content>
<a href="/assets/any.pdf">Visit W3Schools.com!</a>
@@ -253,6 +253,8 @@ export class ExpedienteDetailPage implements OnInit {
this.TaskService.loadExpedientes();
console.log("res========", res)
this.task = {
"SerialNumber": res.serialNumber,
"Folio": res.workflowInstanceDataFields.Subject,
@@ -9,6 +9,9 @@ import { NewPublicationPageRoutingModule } from './new-publication-routing.modul
import { NewPublicationPage } from './new-publication.page';
import '@teamhive/capacitor-video-recorder';
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
import { MatProgressBarModule } from '@angular/material/progress-bar';
@NgModule({
imports: [
CommonModule,
@@ -16,6 +19,7 @@ import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
IonicModule,
NewPublicationPageRoutingModule,
FontAwesomeModule,
MatProgressBarModule,
],
exports: [NewPublicationPage],
declarations: [NewPublicationPage]
@@ -11,7 +11,7 @@
<div class="overflow-y-auto padding">
<div *ngIf="publicationType!='1'" class="ion-item-container"
[class.input-error]="Form?.get('Subject')?.invalid && validateFrom ">
<ion-input autocomplete="on" autocorrect="on" spellcheck="true" [(ngModel)]="pub.Title" name="title"
<ion-input autocomplete="on" autocorrect="on" spellcheck="true" [(ngModel)]="PublicationFromMvService.form.Title" name="title"
ngDefaultControl placeholder="Título*"></ion-input>
</div>
@@ -21,41 +21,50 @@
<ion-icon slot="start" src="assets/images/icons-description.svg"></ion-icon>
</div>
<div class="ion-textarea-class" [class.input-error]="Form?.get('Message')?.invalid && validateFrom ">
<ion-textarea autocomplete="on" autocorrect="on" spellcheck="true" [(ngModel)]="pub.Message"
<ion-textarea autocomplete="on" autocorrect="on" spellcheck="true" [(ngModel)]="PublicationFromMvService.form.Message"
name="description" ngDefaultControl rows="12" cols="20" placeholder="Corpo de texto*"></ion-textarea>
</div>
</div>
</div>
<div *ngIf="seletedContent.length > 0" class="ion-item-container-no-border mb-20">
<div *ngIf="PublicationFromMvService.form.Files.length > 0" class="ion-item-container-no-border mb-20">
<ion-label class="attached-title pb-10">Fotografia Anexada</ion-label>
<div class="d-flex justify-content-between">
<div class="d-flex">
<div *ngFor="let seleted of seletedContent.slice(0, displayLimit), let i = index" lot="start" class="mr-10">
<div *ngFor="let seleted of PublicationFromMvService.form.Files.slice(0, displayLimit), let i = index" lot="start" class="mr-10">
<div class="text-center cursor-pointer" (click)="deleteFromSeletedContent(i)" style="font-weight: 700;color: #c63527;">
X
</div>
<div *ngIf="checkFileType.checkFileType(seleted.FileExtension) == 'video' && seleted.chucksManager">
<mat-progress-bar
mode="determinate"
[style.width]="seleted.chucksManager.uploadPercentage"
></mat-progress-bar>
</div>
<ion-img *ngIf="checkFileType.checkFileType(seleted.FileExtension) == 'image'" [(ngModel)]="capturedImage"
name="image" ngDefaultControl [src]="seleted.FileBase64"
name="image" ngDefaultControl [src]="seleted.url"
(click)="imageSize(capturedImage)" style="height: 69px;"></ion-img>
<video *ngIf="checkFileType.checkFileType(seleted.FileExtension) == 'video'" width="70" height="70"
controls="controls" preload="metadata" webkit-playsinline="webkit-playsinline">
<source type="video/mp4" [src]="seleted.FileBase64">
<source type="video/mp4" [src]="seleted.url">
</video>
</div>
<!-- Display the blurred image and count if there are more images -->
<ion-thumbnail *ngIf="seletedContent.length > displayLimit" lot="start">
<ion-img [src]="'data:image/jpg;base64,' + seletedContent[displayLimit - 1].base64"
<ion-thumbnail *ngIf="PublicationFromMvService.form.Files.length > displayLimit" lot="start">
<ion-img [src]="'data:image/jpg;base64,' + PublicationFromMvService.form.Files[displayLimit - 1].Base64"
style="filter: blur(5px);"></ion-img>
<p>mais {{ seletedContent.length - displayLimit }}</p>
<p>mais {{ PublicationFromMvService.form.Files.length - displayLimit }}</p>
</ion-thumbnail>
<ion-label class="pl-10">
<p>{{capturedImageTitle}}</p>
@@ -66,22 +75,6 @@
</div>
</div>
<!-- <div class="picture d-flex pb-5 hide-desktop"
*ngIf="publication && !( publication.Files[0].FileBase64 == 'data:image/jpg;base64,null' || publication.Files[0].FileBase64 == '' )">
<div class="post-img" *ngIf="publication.Files[0].FileBase64 ">
<img src="{{publication.Files[0].FileBase64 }}" alt="image">
</div>
<div class="d-flex flex-column pl-10" *ngIf="publication.Files[0].FileBase64 ">
<div class="picture-file-name">{{publication.OriginalFileName}}.{{publication.FileExtension}}</div>
<div class="size">75 Kb</div>
</div>
<div class="flex-grow-1 d-flex align-center justify-end font-25" *ngIf="publication.Files[0].FileBase64 "
(click)="deletePublicationImage()">
<ion-icon name="close"></ion-icon>
</div>
</div> -->
<div class="ion-item-container-no-border pt-10">
<ion-label (click)="takePicture()">
<div class="attach-icon">
@@ -111,51 +104,7 @@
</div>
</ion-label>
</div>
<!-- <div *ngIf="photoOrVideo" class="container-multiselect pt-10">
<button id="container-multiselect" class="multiselect-button" (click)="takePicture()">Fotografia</button>
<button id="container-multiselect" class="multiselect-button" (click)="startVideoRecording()">Video</button>
</div> -->
<!-- <div *ngIf="photoOrVideo" class="ion-item-container-no-border">
<ion-label (click)="takePicture()">
<div class="attach-icon">
<ion-icon *ngIf="ThemeService.currentTheme == 'default' "
src="assets/images/icons-add-photo.svg"></ion-icon>
<ion-icon *ngIf="ThemeService.currentTheme == 'gov' "
src="assets/images/theme/gov/icons-add-photo.svg"></ion-icon>
</div>
<div class="attach-document">
<ion-label>Foto</ion-label>
</div>
</ion-label>
</div>
<div *ngIf="photoOrVideo" class="ion-item-container-no-border">
<ion-label (click)="startVideoRecording()">
<div class="attach-icon">
<ion-icon *ngIf="ThemeService.currentTheme == 'default' "
src="assets/images/icons-add-photo.svg"></ion-icon>
<ion-icon *ngIf="ThemeService.currentTheme == 'gov' "
src="assets/images/theme/gov/icons-add-photo.svg"></ion-icon>
</div>
<div class="attach-document">
<ion-label>Video</ion-label>
</div>
</ion-label>
</div> -->
<!-- <div class="ion-item-container-no-border">
<ion-label (click)="laodPicture()" class="cursor-pointer">
<div class="attach-icon">
<ion-icon *ngIf="ThemeService.currentTheme == 'default' " src="assets/images/icons-add-photos.svg"></ion-icon>
<ion-icon *ngIf="ThemeService.currentTheme == 'gov' " src="assets/images/theme/gov/icons-add-photos.svg"></ion-icon>
</div>
<div class="attach-document cursor-pointer">
<ion-label>Galeria</ion-label>
</div>
</ion-label>
</div> -->
<div class="ion-item-container-no-border">
<ion-label (click)="loadVideo()" class="cursor-pointer">
<div class="attach-icon">
@@ -27,14 +27,16 @@ import { FilePicker } from '@capawesome/capacitor-file-picker';
import { CapacitorVideoPlayer } from 'capacitor-video-player';
import { CaptureError, CaptureImageOptions, MediaCapture, MediaFile } from '@awesome-cordova-plugins/media-capture/ngx';
import { Capacitor } from '@capacitor/core';
import { File } from '@ionic-native/file/ngx';
import { File as IonicFile } from '@ionic-native/file/ngx';
import { Media } from '@ionic-native/media/ngx';
import { checkFileTypeService } from 'src/app/services/checkFileType.service';
import { FileValidatorService } from "src/app/services/file/file-validator.service"
import { App } from '@capacitor/app';
import { NavigationExtras, Router } from '@angular/router';
import { VideoconvertService } from 'src/app/services/videoconvert.service'
import { PublicationAttachmentEntity } from 'src/app/shared/publication/upload/upload-streaming.service';
import { PublicationFromMvService } from "src/app/shared/publication/upload/publication-from-mv.service"
import { File } from '../../../models/chatMethod';
const config = {
quality: 0.5,
@@ -88,8 +90,6 @@ export class NewPublicationPage implements OnInit {
validateFrom = false
showLoader: boolean;
publication: Publication;
pub: Publication = new Publication();
folderId: string;
image: Image = new Image();
@@ -117,7 +117,6 @@ export class NewPublicationPage implements OnInit {
photoOrVideo: boolean = false;
fileType = "";
filecontent: boolean;
seletedContent: any[] = []
// Set a limit for the number of images to display
displayLimit = 4;
filesSizeSum = 0;
@@ -140,22 +139,38 @@ export class NewPublicationPage implements OnInit {
public checkFileType: checkFileTypeService,
private FileValidatorService: FileValidatorService,
private router: Router,
private videoconvertService: VideoconvertService
private videoconvertService: VideoconvertService,
public PublicationFromMvService: PublicationFromMvService,
) {
this.publicationType = this.navParams.get('publicationType');
this.folderId = this.navParams.get('folderId');
this.publication = this.navParams.get('publication');
if (this.publication) {
this.seletedContent = this.publication.Files;
const publication = this.navParams.get('publication');
if (publication && typeof publication?.Files == 'object') {
this.filecontent = true;
const newFiles: PublicationAttachmentEntity[] = publication.Files.map(e => {
return new PublicationAttachmentEntity(
{
base64: e.FileBase64,
extension: e.FileExtension,
OriginalFileName: e.OriginalFileName,
FileType: this.checkFileType.checkFileType(e.FileExtension) as any
}
)
})
for(const files of newFiles) {
this.PublicationFromMvService.form.Files.push(files)
}
}
console.log('Edit', this.publication)
this.publicationTitle = 'Nova Publicação';
this.intent = this.navParams.get('intent');
this.convertBlobToBase64Worker = new Worker(new URL('./convertBlobToBase64.worker.js', import.meta.url));
this.PublicationFromMvService.clear()
}
ngOnInit() {
@@ -204,17 +219,22 @@ export class NewPublicationPage implements OnInit {
console.log('take picture', this.removeTextBeforeSlash(picture, ','),)
this.filecontent = true;
this.photoOrVideo = false;
let fileObject = {
FileBase64: this.removeTextBeforeSlash(picture, ','),
FileExtension: capturedImage.format,
OriginalFileName: 'image'
}
this.seletedContent.push(fileObject)
const newAttachment = new PublicationAttachmentEntity(
{
base64: this.removeTextBeforeSlash(picture, ','),
extension: capturedImage.format,
OriginalFileName: "image",
FileType: 'image'
}
)
this.PublicationFromMvService.form.Files.push(newAttachment)
});
} else {
if (this.seletedContent.length === 0)
if (this.PublicationFromMvService.form.Files.length === 0)
this.filesSizeSum = 0
this.httpErrorHandle.validationMessagge('filessize');
@@ -255,9 +275,9 @@ export class NewPublicationPage implements OnInit {
try {
if (this.platform.is('ios')) {
this.recordevideoIos(element.fullPath)
this.recordevideoIos(element.fullPath, element)
} else {
this.recordVideoAndroid(element.fullPath)
this.recordVideoAndroid(element.fullPath, element)
}
} catch (e) {
@@ -265,7 +285,7 @@ export class NewPublicationPage implements OnInit {
}
} else {
if (this.seletedContent.length === 0)
if (this.PublicationFromMvService.form.Files.length === 0)
this.filesSizeSum = 0
this.httpErrorHandle.validationMessagge('filessize')
@@ -277,35 +297,35 @@ 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')
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)
try {
this.recordevideoIos(resultUrl, element)
} 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)
try {
this.loadVideoAndroid(resultUrl,element)
} catch (error) {
console.log('upload video error: ', error)
}
}
} else {
if (this.seletedContent.length === 0)
this.filesSizeSum = 0
try {
this.loadVideoAndroid(resultUrl,element)
} catch (error) {
console.log('upload video error: ', error)
}
}
} else {
if (this.PublicationFromMvService.form.Files.length === 0)
this.filesSizeSum = 0
this.httpErrorHandle.validationMessagge('filessize')
}
this.httpErrorHandle.validationMessagge('filessize')
}
});
};
@@ -367,14 +387,14 @@ export class NewPublicationPage implements OnInit {
injectValidation() {
this.Form = new FormGroup({
Subject: new FormControl(this.pub.Title, [
Subject: new FormControl(this.PublicationFromMvService.form.Title, [
Validators.required,
// Validators.minLength(4)
]),
capturedImage: new FormControl(this.capturedImage, [
]),
Message: new FormControl(this.pub.Message, [
Message: new FormControl(this.PublicationFromMvService.form.Message, [
Validators.required,
Validators.maxLength(1000)
@@ -390,172 +410,26 @@ export class NewPublicationPage implements OnInit {
if (this.Form.invalid) return false
if (this.seletedContent.length != 0) {
if (this.PublicationFromMvService.form.Files.length != 0) {
if (this.publicationType == '3') {
const loader = this.toastService.loading()
// has file
if (this.PublicationFolderService.PublicationHasImage(this.publication)) {
this.publication = {
DateIndex: this.publication.DateIndex,
DocumentId: this.publication.DocumentId,
ProcessId: this.publication.ProcessId,
Title: this.pub.Title,
Message: this.pub.Message,
DatePublication: this.publication.DatePublication,
OriginalFileName: this.publication.OriginalFileName,
Files: this.seletedContent,
}
/* } else if (this.capturedVideo != '' && this.capturedImage == '') {
this.publication = {
DateIndex: this.publication.DateIndex,
DocumentId: this.publication.DocumentId,
ProcessId: this.publication.ProcessId,
Title: this.pub.Title,
Message: this.pub.Message,
DatePublication: this.publication.DatePublication,
OriginalFileName: this.publication.OriginalFileName || 'video',
Files: this.seletedContent,
FileExtension: 'mp4',
}
} */
// no names
} else if (!this.PublicationFolderService.PublicationHasImage(this.publication)) {
this.publication = {
DateIndex: this.publication.DateIndex,
DocumentId: this.publication.DocumentId,
ProcessId: this.publication.ProcessId,
Title: this.pub.Title,
Message: this.pub.Message,
DatePublication: this.publication.DatePublication,
OriginalFileName: this.publication.OriginalFileName,
Files: this.seletedContent,
}
} /* else {
this.publication = {
DateIndex: this.publication.DateIndex,
DocumentId: this.publication.DocumentId,
ProcessId: this.publication.ProcessId,
Title: this.pub.Title,
Message: this.pub.Message,
DatePublication: this.publication.DatePublication,
OriginalFileName: this.publication.OriginalFileName,
FileBase64: this.publication.FileBase64,
FileExtension: this.publication.FileExtension || 'jpeg',
}
} */
try {
const response = await this.publications.UpdatePublication(this.publication.ProcessId, this.publication).toPromise()
this.httpErrorHandle.httpsSucessMessagge('Editar publicação')
console.log({ response })
this.close();
} catch (error) {
if (error.status == 404) {
this.PublicationFolderService.deletePost(this.publication.ProcessId, this.publication.DocumentId)
this.close();
}
this.httpErrorHandle.httpStatusHandle(error)
} finally {
loader.remove()
}
}
else {
const date = formatDate(new Date(), 'yyyy-MM-dd HH:mm:ss')
/* this.seletedContent = this.seletedContent.map((e) => {
if(e.FileExtension == "mp4") {
return {
FileBase64: e.FileBase64,
FileExtension: 'data:video/mp4;base64,'+e.FileExtension,
OriginalFileName: "video",
}
}
return e
}) */
/* if (this.capturedImage != '') { */
this.publication = {
DateIndex: date,
DocumentId: null,
ProcessId: JSON.stringify(this.folderId),
Title: this.pub.Title,
Message: this.pub.Message,
DatePublication: date,
OriginalFileName: this.capturedImageTitle || 'foto',
Files: this.seletedContent,
/* FileExtension: 'jpeg', */
}
/* } else if (this.capturedVideo != '') {
this.publication = {
DateIndex: date,
DocumentId: null,
ProcessId: this.folderId,
Title: this.pub.Title,
Message: this.pub.Message,
DatePublication: date,
OriginalFileName: this.capturedImageTitle || 'video',
Files: this.seletedContent,
FileExtension: 'mp4',
}
} */
const loader = this.toastService.loading()
try {
await this.publications.CreatePublication(this.folderId, this.publication).toPromise();
this.httpErrorHandle.httpsSucessMessagge('Criar publicação')
if (window["sharedContent"]) {
window["sharedContent"] = null
window["openFolder"] = true
if(window.innerWidth <= 700) {
this.router.navigate(['/home/publications', this.folderId]);
} else if(window.innerWidth >= 701){
let navigationExtras: NavigationExtras = { queryParams: { "folderId": this.folderId, } };
this.router.navigate(['/home/publications']);
}
return
}
this.close();
} catch (error) {
this.httpErrorHandle.httpStatusHandle(error)
} finally {
loader.remove()
}
}
this.PublicationFolderService.getPublicationsIds(this.folderId)
this.close();
this.PublicationFromMvService.setFolderId(this.folderId)
await this.PublicationFromMvService.save()
} else {
this.httpErrorHandle.validationMessagge("noFileSelected")
}
}
ngOnDestroy() {
// if(!this.PublicationFromMvService.form.send) {
// this.PublicationFromMvService.cancel()
// }
}
close() {
this.modalController.dismiss(this.publication).then(() => {
this.modalController.dismiss(this.PublicationFromMvService.form).then(() => {
this.showLoader = true;
});
@@ -566,7 +440,7 @@ export class NewPublicationPage implements OnInit {
clear() {
this.capturedImageTitle = null;
this.seletedContent = [];
this.PublicationFromMvService.form.Files = [];
}
setTitle() {
@@ -578,8 +452,6 @@ export class NewPublicationPage implements OnInit {
}
else if (this.publicationType == '3') {
this.publicationTitle = 'Editar Publicação';
this.pub = this.navParams.get('publication');
}
}
@@ -603,7 +475,7 @@ export class NewPublicationPage implements OnInit {
deletePublicationImage() {
this.seletedContent = []
this.PublicationFromMvService.form.Files = []
}
async compressImageBase64(base64String: string, maxWidth: number, maxHeight: number, quality: number): Promise<string> {
@@ -794,7 +666,7 @@ console.log(stringGerada);
}
deleteFromSeletedContent(index) {
this.seletedContent.splice(index, 1)
this.PublicationFromMvService.form.Files.splice(index, 1)
}
closeApp() {
@@ -806,73 +678,84 @@ console.log(stringGerada);
}
async recordevideoIos(fullPath) {
console.log('fullpath', fullPath)
async recordevideoIos(fullPath, element) {
try {
const directory = await Filesystem.getUri({
directory: Directory.Cache,
path: '',
});
const directory = await Filesystem.getUri({
directory: Directory.Cache,
path: '',
});
const stringGerada = this.gerarStringAleatoria();
console.log(stringGerada);
let fileObject ={};
this.videoconvertService.convertVideo(fullPath,directory.uri,stringGerada,'mp4').then(async () => {
await Filesystem.readFile({ path: `${directory.uri}${stringGerada}.mp4`})
const stringGerada = this.gerarStringAleatoria();
.then(async (content) => {
this.filecontent = true;
fileObject = {}
console.log('First clean',fileObject)
fileObject = {
FileBase64: 'data:video/mp4;base64,' + content.data,
FileExtension: 'mp4',
OriginalFileName: stringGerada
}
console.log('what do we have',fileObject)
this.seletedContent.push(fileObject)
console.log('file object 1',fileObject)
fileObject ={};
const deleteSecretFile = async () => {
await Filesystem.deleteFile({
path: `${stringGerada}.mp4`,
directory: Directory.Cache,
});
};
await deleteSecretFile().then((value) => {
console.log('delete file',value)
fileObject ={};
console.log('file object 2',fileObject)
this.videoconvertService.convertVideo(fullPath,directory.uri,stringGerada,'mp4').then(async () => {
await Filesystem.readFile({ path: `${directory.uri}${stringGerada}.mp4`})
.then(async (content) => {
this.filecontent = true;
const file = new File([element.blob], element.name);
const newAttachment = new PublicationAttachmentEntity(
{
base64: 'data:video/mp4;base64,' + content.data,
extension: 'mp4',
blobFile: file,
FileType: this.checkFileType.checkFileType('mp4') as any,
OriginalFileName: 'load video'
}
)
this.PublicationFromMvService.form.Files.push(newAttachment)
const deleteSecretFile = async () => {
await Filesystem.deleteFile({
path: `${stringGerada}.mp4`,
directory: Directory.Cache,
});
};
await deleteSecretFile().then((value) => {
console.log('delete file',value)
})
})
})
.catch((erro) => console.error('read converted video erro ', erro));
});
.catch((erro) => console.error('read converted video erro ', erro));
});
} catch (error) {
} catch (error) {
console.log('record video ios erro, ', error)
}
}
}
async recordVideoAndroid(fullPath) {
async recordVideoAndroid(fullPath, element) {
try {
const savedFile = await Filesystem.copy({
from: fullPath,
to: "video.mp4",
toDirectory: FilesystemDirectory.Data
});
console.log(savedFile.uri)
Filesystem.readFile({ path: savedFile.uri })
const savedFile = await Filesystem.copy({
from: fullPath,
to: "video.mp4",
toDirectory: FilesystemDirectory.Data
});
console.log(savedFile.uri)
Filesystem.readFile({ path: savedFile.uri })
.then(async (content) => {
this.filecontent = true;
let fileObject = {
FileBase64: 'data:video/mp4;base64,' + content.data,
FileExtension: 'mp4',
OriginalFileName: 'video'
}
this.seletedContent.push(fileObject)
const file = new File([element.blob], element.name);
window['a'] = element
const newAttachment = new PublicationAttachmentEntity(
{
base64: 'data:video/mp4;base64,' + content.data,
extension: 'mp4',
blobFile: file,
FileType: this.checkFileType.checkFileType( 'mp4') as any,
OriginalFileName: 'load video'
}
)
this.PublicationFromMvService.form.Files.push(newAttachment)
})
.catch((error) => console.error('reade converted video erro ',error));
@@ -889,24 +772,38 @@ console.log(stringGerada);
Filesystem.readFile({ path: resultUrl })
.then(async (content) => {
console.log(content)
this.filecontent = true;
let fileObject;
if (this.removeTextBeforeSlash(element.mimeType, '/') == "mp4") {
fileObject = {
FileBase64: 'data:video/mp4;base64,' + content.data,
FileExtension: this.removeTextBeforeSlash(element.mimeType, '/'),
OriginalFileName: 'video'
}
const newAttachment = new PublicationAttachmentEntity(
{
base64: content.data,
extension: this.removeTextBeforeSlash(element.mimeType, '/'),
FileType: this.checkFileType.checkFileType( this.removeTextBeforeSlash(element.mimeType, '/')) as any,
OriginalFileName: 'load video'
}
)
newAttachment.needUpload()
this.PublicationFromMvService.form.Files.push(newAttachment)
} else {
fileObject = {
FileBase64: 'data:image/jpeg;base64,' + content.data,
FileExtension: this.removeTextBeforeSlash(element.mimeType, '/'),
OriginalFileName: 'image'
}
const newAttachment = new PublicationAttachmentEntity(
{
base64: 'data:image/jpeg;base64,' + content.data,
extension: this.removeTextBeforeSlash(element.mimeType, '/'),
FileType: this.checkFileType.checkFileType( this.removeTextBeforeSlash(element.mimeType, '/')) as any,
OriginalFileName: 'image'
}
)
this.PublicationFromMvService.form.Files.push(newAttachment)
}
this.seletedContent.push(fileObject)
})
.catch((err) => console.error(err));
@@ -939,7 +836,7 @@ console.log(stringGerada);
}
console.log('shared base', content.data)
this.seletedContent.push(fileObject)
this.PublicationFromMvService.form.Files.push(fileObject)
} catch (error) {
console.log('error shared filesystem', error)
}
@@ -963,12 +860,18 @@ console.log(stringGerada);
FileExtension: 'mp4',
OriginalFileName: 'shared',
} */
fileObject = {
FileBase64: 'data:video/mp4;base64,' + this.removeTextBeforeSlash(content.data, ','),
FileExtension: 'mp4',
OriginalFileName: 'shared',
}
this.seletedContent.push(fileObject)
const newAttachment = new PublicationAttachmentEntity(
{
base64: 'data:video/mp4;base64,' + this.removeTextBeforeSlash(content.data, ','),
extension: 'mp4',
FileType: this.checkFileType.checkFileType('mp4') as any,
OriginalFileName: 'shared'
}
)
newAttachment.needUpload()
this.PublicationFromMvService.form.Files.push(newAttachment)
fileObject ={};
const deleteSecretFile = async () => {
await Filesystem.deleteFile({
@@ -1014,7 +917,7 @@ console.log(stringGerada);
}
console.log('shared base', content.data)
this.seletedContent.push(fileObject)
this.PublicationFromMvService.form.Files.push(fileObject)
} catch (error) {
console.log('error shared filesystem', error)
}
@@ -21,6 +21,8 @@ import { StopvideoService } from "src/app/services/stopvideo.service"
import { Result } from 'neverthrow';
import { App } from '@capacitor/app';
import { ActiveTabService } from 'src/app/services/active-tab.service';
import { PublicationHolderService } from 'src/app/services/publication/publication-holder.service'
@Component({
selector: 'app-view-publications',
templateUrl: './view-publications.page.html',
@@ -71,7 +73,8 @@ export class ViewPublicationsPage implements OnInit {
private publicationVideoManagerService: PublicationVideoManagerService,
public stopvideoService: StopvideoService,
private platform: Platform,
public activeTabService: ActiveTabService) {
public activeTabService: ActiveTabService,
public PublicationHolderService: PublicationHolderService) {
/* this.publicationVideoManagerService.setContainer(this.VideoManager.nativeElement) */
@@ -311,20 +314,26 @@ export class ViewPublicationsPage implements OnInit {
}
async AddPublication(publicationType: any, folderId: any) {
const modal = await this.modalController.create({
component: NewPublicationPage,
componentProps: {
publicationType: publicationType,
folderId: this.folderId,
},
cssClass: 'new-publication modal modal-desktop',
backdropDismiss: false
});
modal.onDidDismiss().then(() => {
this.doRefresh(event);
});
await modal.present();
// if(this.PublicationHolderService.PublicationFormMV.length == 0) {
const modal = await this.modalController.create({
component: NewPublicationPage,
componentProps: {
publicationType: publicationType,
folderId: this.folderId,
},
cssClass: 'new-publication modal modal-desktop',
backdropDismiss: false
});
modal.onDidDismiss().then(() => {
this.doRefresh(event);
});
await modal.present();
//} else {
// this.toastService._successMessage('já existe uma publicação a ser processado');
//}
}
goToPublicationDetail(DocumentId: string, ProcessId: string) {
@@ -151,15 +151,6 @@ export class ChatSystemService {
} catch(error) {}
}
setMainChangeDetector(x:Function) {
this.mainChangeDetector = x
}
runMainChangeDetector() {
console.log("change")
// this.mainChangeDetector()
}
loadChat() {
if (SessionStore.user?.ChatData?.data) {
this.ReLoadChat()
-7
View File
@@ -25,7 +25,6 @@ import { ChatSystemService } from './chat-system.service';
import { ViewedMessageService } from './viewed-message.service'
import * as FIFOProcessQueue from 'fifo-process-queue';
import { NotificationsService } from '../notifications.service';
import { ChangeDetectorRef } from '@angular/core';
@Injectable({
providedIn: 'root'
@@ -85,7 +84,6 @@ export class RoomService {
sortRoomList = () => { }
chatServiceDeleteRoom = (roomId) => { }
private changeDetector: Function = () => {}
constructor(
public RochetChatConnectorService: RochetChatConnectorService,
@@ -192,11 +190,6 @@ export class RoomService {
}
setChangeDetector(x:Function) {
console.log("set change detector")
this.changeDetector = x
}
get online() {
if (!this.isGroup) {
-12
View File
@@ -202,9 +202,6 @@ export class NotificationsService {
this.active = true
console.log('NOtification Listener', notification)
this.storenotification(notification)
this.chatNotification(notification)
}
);
@@ -216,7 +213,6 @@ export class NotificationsService {
this.eventtrigger.publishSomeData({
notification: "recive"
})
this.chatNotification(notification)
// Handle the received message, e.g., show a notification
});
}
@@ -400,12 +396,4 @@ export class NotificationsService {
}
chatNotification(_notification) {
const notification = this.NotificationHolderService.stractureNotificationObject(_notification)
if (notification?.notification?.data?.Service === "chat" || notification?.Service === "chat") {
this.ChatController.ChatSystemService.runMainChangeDetector()
}
}
}
@@ -0,0 +1,16 @@
import { TestBed } from '@angular/core/testing';
import { HolderService } from './holder.service';
describe('HolderService', () => {
let service: HolderService;
beforeEach(() => {
TestBed.configureTestingModule({});
service = TestBed.inject(HolderService);
});
it('should be created', () => {
expect(service).toBeTruthy();
});
});
@@ -3,7 +3,7 @@ import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root'
})
export class PublicationFormMVService {
export class HolderService {
constructor() { }
}
@@ -0,0 +1,16 @@
import { TestBed } from '@angular/core/testing';
import { PublicationHolderService } from './publication-holder.service';
describe('PublicationHolderService', () => {
let service: PublicationHolderService;
beforeEach(() => {
TestBed.configureTestingModule({});
service = TestBed.inject(PublicationHolderService);
});
it('should be created', () => {
expect(service).toBeTruthy();
});
});
@@ -0,0 +1,98 @@
import { Injectable } from '@angular/core';
import { PublicationFormMV } from 'src/app/shared/publication/upload/upload-streaming.service';
@Injectable({
providedIn: 'root'
})
export class PublicationHolderService {
count = 0
PublicationFormMV: {
id: string,
percentage: number,
retry: boolean,
retryFunction: Function
}[] = []
constructor() {
window['upload-header-set-percentage'] = (id: string, percentage: number) => {
this.PublicationFormMV = this.PublicationFormMV.map((e)=> {
if(e.id == id) {
console.log("percentage", percentage)
e.percentage = percentage
}
return e
})
this.uploadPercentage()
}
window['upload-header-set-add'] = (id: string, percentage: number, save: Function) => {
this.PublicationFormMV.push({id, percentage, retry: false, retryFunction: save})
this.uploadPercentage()
}
window['upload-header-set-remove'] = (id: string) => {
this.remove(id)
}
window['upload-header-set-retry'] = (id: string) => {
this.PublicationFormMV = this.PublicationFormMV.map((e)=> {
if(e.id == id) {
e.retry = true
}
return e
})
this.uploadPercentage()
}
window['upload-header-remove-retry'] = (id: string) => {
this.uploadPercentage()
this.PublicationFormMV = this.PublicationFormMV.map((e)=> {
if(e.id == id) {
e.retry = false
}
return e
})
this.uploadPercentage()
}
}
remove(id: string) {
this.PublicationFormMV = this.PublicationFormMV.filter((e)=> e.id != id)
this.uploadPercentage()
}
hasPublication() {
return this.PublicationFormMV.length >= 1
}
uploadPercentage = () => {
const percentageArray = this.PublicationFormMV.map((e) => e.percentage)
// Check if the array is not empty
if (percentageArray.length === 0) {
this.count = 0
} else {
let sum = percentageArray.reduce((acc, percentage) => acc + percentage, 0);
// Calculate the average percentage
let averagePercentage = sum / percentageArray.length;
this.count = Math.ceil(averagePercentage)
}
}
}
@@ -147,21 +147,29 @@ class ReconnectingWebSocketSignalR {
}
commit(path): Promise<Result<true, false>> {
console.log('committing')
return new Promise((resolve, reject) => {
try {
console.log('this.connection.invoke', this.connection)
this.connection.invoke("CommitUpload", path).then((e) => {
console.log("commit message", e)
resolve(ok(true))
}).catch(err => {
console.error('upload catch commit error')
if(this.isOpen) {
try {
console.log('this.connection.invoke', this.connection)
this.connection.invoke("CommitUpload", path).then((e) => {
console.log("commit message", e)
resolve(ok(true))
}).catch(err => {
console.error('upload catch commit error')
resolve(Err(false))
console.error(err.toString())
});
} catch(error) {
resolve(Err(false))
console.error(err.toString())
});
} catch(error) {
resolve(Err(false))
console.error('upload commit error')
console.error(error)
console.error('upload commit error')
console.error(error)
}
} else {
this.onConnect.push(()=> {
resolve(this.commit(path))
})
}
})
}
@@ -410,61 +418,60 @@ export class ObjectMergeNotification{
this.runWatch = false
})
this.socket.subscribe((data: socketResponse) => {
if(data.IsCompleted == true) {
console.log("==================!!!====================")
try {
this.callbacks[data.Guid](data)
delete this.callbacks[data.Guid]
} catch (error) {}
} else {
console.log("else", data)
}
})
// this.socket.subscribe((data: socketResponse) => {
// if(data.IsCompleted == true) {
// console.log("==================!!!====================")
// try {
// this.callbacks[data.Guid](data)
// delete this.callbacks[data.Guid]
// } catch (error) {}
// } else {
// console.log("else", data)
// }
// })
// this.socket.connect();
// this.watch()
}
connect() {
// this.socket.connect();
this.socket.connect();
}
close() {
// this.socket.disconnect();
// this.watchCount = 0;
// this.runWatch = false
this.socket.disconnect();
this.watchCount = 0;
this.runWatch = false
}
async watch() {
// this.watchCount = 0;
this.watchCount = 0;
// if(this.runWatch) {
// setTimeout(async () => {
// for(const [key, funx] of Object.entries(this.callbacks)) {
if(this.runWatch) {
setTimeout(async () => {
for(const [key, funx] of Object.entries(this.callbacks)) {
// const request = await this.CMAPIService.getVideoHeader(key)
const request = await this.CMAPIService.getVideoHeader(key)
// if(request.isOk()) {
// funx()
// delete this.callbacks[key]
// }
// }
if(request.isOk()) {
funx()
delete this.callbacks[key]
}
}
// this.watchCount++
// if(this.watchCount <= 15) {
// this.watch()
// } else {
// this.runWatch = false
// }
this.watchCount++
if(this.watchCount <= 15) {
this.watch()
} else {
this.runWatch = false
}
// }, 1000)
}, 1000)
// } else {
// console.log("end loop============================")
// }
} else {
console.log("end loop============================")
}
}
subscribe(GUID, callback:Function) {
@@ -30,7 +30,6 @@ import { SessionStore } from 'src/app/store/session.service';
import { ViewMediaPage } from 'src/app/modals/view-media/view-media.page';
import { PermissionService } from 'src/app/services/permission.service';
import { FileValidatorService } from "src/app/services/file/file-validator.service"
import { ChangeDetectorRef } from '@angular/core';
@Component({
selector: 'app-group-messages',
templateUrl: './group-messages.page.html',
@@ -103,8 +102,7 @@ export class GroupMessagesPage implements OnInit, OnChanges, AfterViewInit, OnDe
private platform: Platform,
private fileOpener: FileOpener,
public p: PermissionService,
private FileValidatorService: FileValidatorService,
private ChangeDetectorRef: ChangeDetectorRef
private FileValidatorService: FileValidatorService
) {
this.ChatSystemService.getUser()
@@ -120,9 +118,6 @@ export class GroupMessagesPage implements OnInit, OnChanges, AfterViewInit, OnDe
this.ChatSystemService.openRoom(this.roomId)
this.ChatSystemService.getGroupRoom(this.roomId).scrollDown = this.scrollToBottomClicked
this.groupNameFormart = this.ChatSystemService.getGroupRoom(this.roomId).name.split('-').join(' ')
this.ChatSystemService.getGroupRoom(this.roomId).setChangeDetector(()=> {
this.changeDetector()
})
this.showAvatar = false
setTimeout(() => {
@@ -134,12 +129,6 @@ export class GroupMessagesPage implements OnInit, OnChanges, AfterViewInit, OnDe
}
changeDetector = () => {
console.log('run detection shared')
this.ChangeDetectorRef.detectChanges()
}
ngOnInit() {
this.loggedUser = this.loggedUserChat;
//setTimeout(() => {
+1 -11
View File
@@ -34,7 +34,6 @@ import { ViewMediaPage } from 'src/app/modals/view-media/view-media.page';
import { ChatMessageDebuggingPage } from 'src/app/shared/popover/chat-message-debugging/chat-message-debugging.page';
import { PermissionService } from 'src/app/services/permission.service';
import { FileValidatorService } from "src/app/services/file/file-validator.service"
import { ChangeDetectorRef } from '@angular/core';
const IMAGE_DIR = 'stored-images';
@@ -124,8 +123,7 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy
private platform: Platform,
private fileOpener: FileOpener,
public p: PermissionService,
private FileValidatorService: FileValidatorService,
private ChangeDetectorRef: ChangeDetectorRef
private FileValidatorService: FileValidatorService
) {
// update
this.checkAudioPermission()
@@ -141,9 +139,6 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy
this.ChatSystemService.openRoom(this.roomId)
this.ChatSystemService.getDmRoom(this.roomId)
this.ChatSystemService.getDmRoom(this.roomId).setChangeDetector(()=> {
this.changeDetector()
})
this.showAvatar = false
@@ -161,11 +156,6 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy
}
changeDetector = () => {
console.log('run detection shared')
this.ChangeDetectorRef.detectChanges()
}
async ChatMessageDebuggingPage() {
+20 -3
View File
@@ -40,14 +40,23 @@
</div>
</div>
<div title="Perfil" class="div-profile cursor-pointer viewport-font-size " (click)="openProfile()">
<div title="Perfil" class="div-profile cursor-pointer viewport-font-size " >
<div *ngIf="PublicationHolderService.count != 0" style="color: black" style="display: flex;
color: black;
justify-content: center;
align-items: center;
" >
{{ PublicationHolderService.count }}%
<span style="padding-right: 7px" *ngIf="PublicationHolderService.PublicationFormMV?.[0]?.retry" (click)="PublicationHolderService.PublicationFormMV?.[0]?.retryFunction()" ><ion-icon src="assets/images/retry-svgrepo-com.svg" > </ion-icon></span>
<span style="padding-right: 7px" *ngIf="PublicationHolderService.PublicationFormMV?.[0]?.retry" (click)="PublicationHolderService.remove(PublicationHolderService.PublicationFormMV?.[0]?.id)">X</span>
</div>
<!-- <div *ngIf="this.NotificationHolderService.notificationList.length > 0" class="icon-badge">{{NotificationHolderService.notificationList.length}}</div> -->
<!-- <ion-icon *ngIf="ThemeService.currentTheme == 'doneIt' " class="icon font-45-em" src='assets/images/theme/doneIt/icons-profile.svg'></ion-icon>
<ion-icon *ngIf="ThemeService.currentTheme == 'default' " class="icon font-45-em" src='assets/images/icons-profile.svg'></ion-icon>
<ion-icon *ngIf="ThemeService.currentTheme == 'gov' " class="icon font-45-em" src='assets/images/theme/gov/icons-profile.svg'></ion-icon> -->
<div *ngIf="profilePicture == ''" class="profile-image">
<div (click)="openProfile()" *ngIf="profilePicture == ''" class="profile-image" >
<!-- <img *ngIf="loggeduser.RoleDescription == 'Presidente da República' " class="profile-image"
src='assets/images/presidente.png'>
<img *ngIf="loggeduser.RoleDescription == 'Ministro e Director do Gabinete do PR' " class="profile-image"
@@ -60,7 +69,7 @@
</div>
<div *ngIf="profilePicture != ''" class="profile-image">
<div (click)="openProfile()" *ngIf="profilePicture != ''" class="profile-image">
<img class="profile-image image-prety" src={{profilePicture}}>
</div>
@@ -164,6 +173,13 @@
</div>
<div class="header-btns d-flex">
<div *ngIf="PublicationHolderService.count != 0" style="color: black" >
{{ PublicationHolderService.count }}%
<span style="padding-right: 7px" *ngIf="PublicationHolderService.PublicationFormMV?.[0]?.retry" (click)="PublicationHolderService.PublicationFormMV?.[0]?.retryFunction()" ><ion-icon src="assets/images/retry-svgrepo-com.svg" > </ion-icon></span>
<span style="padding-right: 7px" *ngIf="PublicationHolderService.PublicationFormMV?.[0]?.retry" (click)="PublicationHolderService.remove(PublicationHolderService.PublicationFormMV?.[0]?.id)">X</span>
</div>
<div title="Pesquisa" *ngIf="!hideSearchBtn" class="mr-20 d-flex align-center cursor-pointer">
<div style="padding-top: 5px;" (click)="openSearch();showSearch=true" *ngIf="!showSearch">
<ion-icon title="Perfil" *ngIf="ThemeService.currentTheme == 'doneIt' " class="font-45-rem"
@@ -241,3 +257,4 @@
</div>
<div [class.header-bottom-line]="ThemeService.currentTheme == 'gov'" style="height: 5px;"></div>
</div>
+1 -2
View File
@@ -86,8 +86,7 @@
}
.div-profile {
width: 40px;
height: 40px;
text-align: center;
background-color: transparent;
display: flex !important;
+8 -2
View File
@@ -17,7 +17,7 @@ import { NotificationsService } from 'src/app/services/notifications.service';
import { AttachmentsService } from 'src/app/services/attachments.service';
import { NotificationHolderService } from 'src/app/store/notification-holder.service';
import { HeaderSettingsService } from "src/app/services/header-settings.service"
import { PublicationHolderService } from 'src/app/services/publication/publication-holder.service'
@Component({
selector: 'app-header',
templateUrl: './header.page.html',
@@ -53,7 +53,6 @@ export class HeaderPage implements OnInit {
}
}
constructor(
private router: Router,
private modalController: ModalController,
@@ -72,6 +71,7 @@ export class HeaderPage implements OnInit {
private attachmentService: AttachmentsService,
public NotificationHolderService: NotificationHolderService,
public HeaderSettingsService: HeaderSettingsService,
public PublicationHolderService: PublicationHolderService
) {
this.loggeduser = SessionStore.user;
router.events.subscribe((val) => {
@@ -89,6 +89,12 @@ export class HeaderPage implements OnInit {
this.notificationLengthData()
}); */
window['header-updateCount'] = () => {
this.updateCount()
}
}
updateCount = () => {
}
@@ -16,7 +16,7 @@
<div *ngIf="publicationType!='1'" class="ion-item-container"
[class.input-error]="Form?.get('Subject')?.invalid && validateFrom ">
<ion-input autocomplete="on" autocorrect="on" spellcheck="true" [(ngModel)]="publicationFormMV.form.Title" name="title"
<ion-input autocomplete="on" autocorrect="on" spellcheck="true" [(ngModel)]="PublicationFromMvService.form.Title" name="title"
placeholder="Título*"></ion-input>
</div>
@@ -27,7 +27,7 @@
</div>
<div class="ion-textarea-class flex-grow-1"
[class.input-error]="Form?.get('Message')?.invalid && validateFrom ">
<ion-textarea autocomplete="on" autocorrect="on" spellcheck="true" [(ngModel)]="publicationFormMV.form.Message"
<ion-textarea autocomplete="on" autocorrect="on" spellcheck="true" [(ngModel)]="PublicationFromMvService.form.Message"
name="description" ngDefaultControl rows="12" cols="20" placeholder="Corpo de texto*"></ion-textarea>
</div>
</div>
@@ -40,12 +40,12 @@
<!-- Captured -->
<div *ngIf="publicationFormMV.form.Files.length > 0">
<div *ngIf="PublicationFromMvService.form.Files.length > 0">
<ion-label class="attached-title pb-10">Anexos</ion-label>
<div>
<div class="d-flex" >
<div *ngFor="let seleted of publicationFormMV.form.Files.slice(0, displayLimit), let i = index" lot="start" class="mr-10">
<div *ngFor="let seleted of PublicationFromMvService.form.Files.slice(0, displayLimit), let i = index" lot="start" class="mr-10">
<div>
@@ -20,10 +20,11 @@ import { environment } from 'src/environments/environment';
import { CaptureImageOptions, MediaCapture } from '@awesome-cordova-plugins/media-capture/ngx';
import { Directory, Filesystem, FilesystemDirectory } from '@capacitor/filesystem';
import { Platform } from '@ionic/angular';
import { PublicationAttachmentEntity, PublicationFormMV } from '../upload/upload-streaming.service';
import { PublicationFormMVService } from "src/app/shared/publication/upload/publication-form-mv.service"
import { PublicationAttachmentEntity } from '../upload/upload-streaming.service';
import { VideoconvertService } from 'src/app/services/videoconvert.service';
import { PublicationHolderService } from 'src/app/services/publication/publication-holder.service'
import { PublicationFromMvService } from "src/app/shared/publication/upload/publication-from-mv.service"
import { UploadStreamingService } from "src/app/shared/publication/upload/upload-streaming.service"
enum ActionType {
newRapid = "1",
new = "2",
@@ -68,11 +69,8 @@ export class NewPublicationPage implements OnInit {
photoOrVideo: boolean = false;
video: any;
publicationFormMV = new PublicationFormMV()
constructor(
PublicationFormMVService: PublicationFormMVService,
public PublicationFromMvService: PublicationFromMvService,
public photoService: PhotoService,
private publications: PublicationsService,
private toastService: ToastService,
@@ -87,9 +85,12 @@ export class NewPublicationPage implements OnInit {
private MiddlewareServiceService: MiddlewareServiceService,
private LakefsRepositoryService: LakefsRepositoryService,
private SocketConnectionMCRService: SocketConnectionMCRService,
private videoconvertService: VideoconvertService
private videoconvertService: VideoconvertService,
public UploadStreamingService: UploadStreamingService
) {
this.publicationTitle = 'Nova Publicação';
this.PublicationFromMvService.clear()
}
ngOnInit() {
@@ -124,8 +125,8 @@ export class NewPublicationPage implements OnInit {
processData(res) {
console.log("res process", res)
this.publicationFormMV.form.Files = []
this.publicationFormMV.form.setData({
this.PublicationFromMvService.form.Files = []
this.PublicationFromMvService.form.setData({
DateIndex: res.DateIndex,
DocumentId: res.DocumentId,
ProcessId: res.ProcessId,
@@ -146,7 +147,7 @@ export class NewPublicationPage implements OnInit {
})
for(const files of newFiles) {
this.publicationFormMV.form.Files.push(files)
this.PublicationFromMvService.form.Files.push(files)
}
}
@@ -181,7 +182,7 @@ export class NewPublicationPage implements OnInit {
FileType: 'image'
}
)
this.publicationFormMV.form.Files.push(newAttachment)
this.PublicationFromMvService.form.Files.push(newAttachment)
});
}
@@ -215,7 +216,8 @@ export class NewPublicationPage implements OnInit {
}
)
//newAttachment.needUpload();
this.publicationFormMV.form.Files.push(newAttachment)
this.PublicationFromMvService.form.Files.push(newAttachment)
});
}
@@ -252,12 +254,14 @@ export class NewPublicationPage implements OnInit {
}
)
// newAttachment.needUpload()
this.publicationFormMV.form.Files.push(newAttachment)
newAttachment.needUpload()
this.PublicationFromMvService.form.Files.push(newAttachment)
this.filecontent = true;
} else {
if (this.publicationFormMV.form.Files.length === 0)
if (this.PublicationFromMvService.form.Files.length === 0)
this.filesSizeSum = 0
this.httpErroHandle.validationMessagge('filessize');
@@ -300,7 +304,7 @@ export class NewPublicationPage implements OnInit {
})
/* fileObject.needUpload() */
this.publicationFormMV.form.Files.push(fileObject)
this.PublicationFromMvService.form.Files.push(fileObject)
})
.catch((err) => console.error(err));
} catch (error) {
@@ -309,7 +313,7 @@ export class NewPublicationPage implements OnInit {
}
} else {
if (this.publicationFormMV.form.Files.length === 0)
if (this.PublicationFromMvService.form.Files.length === 0)
this.filesSizeSum = 0
this.httpErrorHandle.validationMessagge('filessize')
@@ -325,11 +329,11 @@ export class NewPublicationPage implements OnInit {
injectValidation() {
this.Form = new FormGroup({
Subject: new FormControl(this.publicationFormMV.form.Title, [
Subject: new FormControl(this.PublicationFromMvService.form.Title, [
Validators.required,
// Validators.minLength(4)
]),
Message: new FormControl(this.publicationFormMV.form.Message, [
Message: new FormControl(this.PublicationFromMvService.form.Message, [
Validators.required,
Validators.maxLength(1000)
])
@@ -346,149 +350,32 @@ export class NewPublicationPage implements OnInit {
return false
}
this.PublicationFromMvService.setFolderId(this.folderId)
this.goBack();
await this.PublicationFromMvService.save()
if (this.publicationType == ActionType.edit) {
if (this.publicationFormMV.form.Files.length >= 1) {
const loader = this.toastService.loading()
const upload = await this.publicationFormMV.uploadVideosFiles()
if(upload) {
this.publicationFormMV.form.Files = this.publicationFormMV.form.Files.map((e:PublicationAttachmentEntity) => {
if(e.FileType == 'video' && e.blobFile && e.toUpload) {
e.OriginalFileName = e?.chucksManager?.path?.replace(".mp4", "") || e.OriginalFileName
e.FileExtension = "mp4"
}
return e
})
}
const publication: any = Object.assign({}, this.publicationFormMV.form)
publication.Files = publication.Files.map( (e:PublicationAttachmentEntity) => ({
FileBase64: e.url,
FileExtension: e.FileExtension,
OriginalFileName: e.OriginalFileName || 'foto'
}))
try {
const response = await this.publications.UpdatePublication(publication.ProcessId, publication).toPromise()
this.httpErroHandle.httpsSucessMessagge('Editar publicação')
this.goBack();
} catch (error) {
this.httpErroHandle.httpStatusHandle(error)
if (error.status == 404) {
this.PublicationFolderService.deletePost(this.publicationFormMV.form.ProcessId, this.publicationFormMV.form.DocumentId)
this.goBack();
}
} finally {
loader.remove()
}
} else {
this.toastService._badRequest("É necessário adicionar uma imagem ou vídeo")
}
}
else {
let time = new Date()
if (this.publicationFormMV.form.Files.length >= 1) {
const loader = this.toastService.loading()
const upload = await this.publicationFormMV.uploadVideosFiles()
console.log({upload})
if(upload) {
this.publicationFormMV.form.Files = this.publicationFormMV.form.Files.map((e:PublicationAttachmentEntity) => {
if(e.FileType == 'video' && e.blobFile && e.toUpload) {
e.OriginalFileName = e.chucksManager.path.replace(".mp4", "")
e.FileExtension = "mp4"
e.Base64 = ''
}
if(e.FileType == 'video' && !e.toUpload) {
e.Base64 = e.url
}
return e
})
const publication: any = Object.assign({}, this.publicationFormMV.form)
publication.Files = publication.Files.map( (e:PublicationAttachmentEntity) => ({
FileBase64: e.Base64,
FileExtension: e.FileExtension,
OriginalFileName: e.OriginalFileName || 'foto'
}))
publication.DocumentId = null;
publication.ProcessId = this.folderId
try {
await this.publications.CreatePublication(publication.ProcessId, publication).toPromise()
if (this.publicationTitle == '1') {
} else if (this.publicationTitle == '2') {
this.httpErroHandle.httpsSucessMessagge('Criar publicação')
} else if (this.publicationTitle == '3') {
this.httpErroHandle.httpsSucessMessagge('Editar publicação')
}
this.goBackToViewPublications.emit();
} catch (error) {
this.httpErroHandle.httpStatusHandle(error)
} finally {
loader.remove()
}
} else {
this.toastService._badRequest("Tive um erro ao enviar o ficheiro")
loader.remove()
}
} else {
this.toastService._badRequest("É necessário adicionar uma imagem ou vídeo")
}
}
this.publicationFormMV.ObjectMergeNotification.close()
// this.PublicationHolderService.setPublication(this.PublicationFromMvService)
}
ngOnDestroy() {
this.publicationFormMV.ObjectMergeNotification.close()
// if(!this.PublicationFromMvService.form.send) {
// this.PublicationFromMvService.cancel()
// }
}
close() {
this.goBack();
}
clear() {
this.publicationFormMV.form.Files = [];
this.PublicationFromMvService.form.Files = [];
}
deletePublicationImage() {
this.publicationFormMV.form.Files = []
this.PublicationFromMvService.form.Files = []
}
setAction() {
@@ -728,7 +615,7 @@ export class NewPublicationPage implements OnInit {
}
deleteFromSeletedContent(index) {
this.publicationFormMV.form.Files.splice(index, 1)
this.PublicationFromMvService.form.Files.splice(index, 1)
}
chossePhotoOrVideo() {
@@ -750,7 +637,7 @@ export class NewPublicationPage implements OnInit {
this.recordVideoPc(element.fullPath)
}
} else {
if (this.publicationFormMV.form.Files.length === 0)
if (this.PublicationFromMvService.form.Files.length === 0)
this.filesSizeSum = 0
this.httpErrorHandle.validationMessagge('filessize')
@@ -798,7 +685,7 @@ console.log(stringGerada);
}
)
/* fileObject.needUpload() */
this.publicationFormMV.form.Files.push(fileObject)
this.PublicationFromMvService.form.Files.push(fileObject)
})
.catch((erro) => console.error('read converted video erro ', erro));
} catch (error) {
@@ -840,7 +727,7 @@ console.log(stringGerada);
}
/* fileObject.needUpload() */
this.publicationFormMV.form.Files.push(fileObject)
this.PublicationFromMvService.form.Files.push(fileObject)
})
.catch((err) => console.error(err));
} catch (error) {
@@ -1,13 +1,13 @@
import { TestBed } from '@angular/core/testing';
import { PublicationFormMVService } from './publication-form-mv.service';
import { PublicationFromMvService } from './publication-from-mv.service';
describe('PublicationFormMVService', () => {
let service: PublicationFormMVService;
describe('PublicationFromMvService', () => {
let service: PublicationFromMvService;
beforeEach(() => {
TestBed.configureTestingModule({});
service = TestBed.inject(PublicationFormMVService);
service = TestBed.inject(PublicationFromMvService);
});
it('should be created', () => {
@@ -0,0 +1,356 @@
import { Injectable } from '@angular/core';
import { HttpErrorHandle } from 'src/app/services/http-error-handle.service';
import { PublicationsService } from 'src/app/services/publications.service';
import { ToastService } from 'src/app/services/toast.service';
import { PublicationFolderService } from 'src/app/store/publication-folder.service';
import { Chunks, ChunksBase64, IOUploadError, PublicationAttachmentEntity, PublicationFormModel, UploadFileUseCase } from './upload-streaming.service';
import { ObjectMergeNotification } from 'src/app/services/socket-connection-mcr.service';
import { v4 as uuidv4 } from 'uuid'
import { Result } from 'neverthrow';
import { IPublicationFormModelEntity } from '../new-publication/interface/interface';
import { CMAPIService } from "src/app/shared/repository/CMAPI/cmapi.service"
enum ActionType {
newRapid = "1",
new = "2",
edit = "3"
}
@Injectable({
providedIn: 'any'
})
export class PublicationFromMvService {
id: string = uuidv4()
private UploadFileUseCase = new UploadFileUseCase()
form = new PublicationFormModel()
ObjectMergeNotification = new ObjectMergeNotification()
totalPercentage = 0
publicationType: ActionType
folderId: string
constructor(
private publications: PublicationsService,
private toastService: ToastService,
private httpErroHandle: HttpErrorHandle,
public PublicationFolderService: PublicationFolderService,
private CMAPIService: CMAPIService,
public publicationFolderService: PublicationFolderService
) {}
clear() {
this.id = uuidv4()
this.UploadFileUseCase = new UploadFileUseCase()
this.form = new PublicationFormModel()
this.ObjectMergeNotification = new ObjectMergeNotification()
this.totalPercentage = 0
this.ObjectMergeNotification.connect();
window['upload-header-set-add'](this.id, this.totalPercentage, this.save)
}
cancel() {
window['upload-header-set-remove'](this.id)
}
setFolderId(folderId) {
this.folderId = folderId
}
save = async() => {
if (this.publicationType == ActionType.edit) {
if (this.form.Files.length >= 1) {
// const loader = this.toastService.loading()
this.form.send = true
const upload = await this.uploadVideosFiles()
if(upload) {
this.form.Files = this.form.Files.map((e:PublicationAttachmentEntity) => {
if(e.FileType == 'video' && e.toUpload) {
e.OriginalFileName = e?.chucksManager?.path?.replace(".mp4", "") || e.OriginalFileName
e.FileExtension = e.FileExtension || "mp4"
}
return e
})
}
const publication: any = Object.assign({}, this.form)
publication.Files = publication.Files.map( (e:PublicationAttachmentEntity) => ({
FileBase64: e.url,
FileExtension: e.FileExtension,
OriginalFileName: e.OriginalFileName || 'foto'
}))
try {
const response = await this.publications.UpdatePublication(publication.ProcessId, publication).toPromise()
this.httpErroHandle.httpsSucessMessagge('Editar publicação')
this.publicationFolderService.getPublicationsIds(this.folderId)
// this.goBack();
} catch (error) {
this.httpErroHandle.httpStatusHandle(error)
if (error.status == 404) {
this.PublicationFolderService.deletePost(this.form.ProcessId, this.form.DocumentId)
// this.goBack();
}
} finally {
// loader.remove()
}
} else {
this.toastService._badRequest("É necessário adicionar uma imagem ou vídeo")
}
}
else {
let time = new Date()
if (this.form.Files.length >= 1) {
// const loader = this.toastService.loading()
this.form.send = false
const upload = await this.uploadVideosFiles()
if(upload) {
this.form.Files = this.form.Files.map((e:PublicationAttachmentEntity) => {
if(e.FileType == 'video' && e.toUpload) {
e.OriginalFileName = e.chucksManager.path.replace(".mp4", "")
e.FileExtension = e.FileExtension || "mp4"
e.Base64 = ''
}
if(e.FileType == 'video' && !e.toUpload) {
e.Base64 = e.url
}
return e
})
const publication: any = Object.assign({}, this.form)
publication.Files = publication.Files.map( (e:PublicationAttachmentEntity) => ({
FileBase64: e.Base64,
FileExtension: e.FileExtension,
OriginalFileName: e.OriginalFileName || 'foto'
}))
publication.DocumentId = null;
publication.ProcessId = this.folderId
try {
await this.publications.CreatePublication(publication.ProcessId, publication).toPromise()
if (this.publicationType == '1') {
} else if (this.publicationType == '2') {
this.httpErroHandle.httpsSucessMessagge('Criar publicação')
} else if (this.publicationType == '3') {
this.httpErroHandle.httpsSucessMessagge('Editar publicação')
}
// this.goBackToViewPublications.emit();
window['upload-header-set-remove'](this.id);
this.publicationFolderService.getPublicationsIds(this.folderId)
} catch (error) {
this.httpErroHandle.httpStatusHandle(error)
} finally {
// loader.remove()
}
} else {
this.toastService._badRequest("ocorreu um erro ao enviar o ficheiro")
// loader.remove()
}
} else {
this.toastService._badRequest("É necessário adicionar uma imagem ou vídeo")
}
}
// this.PublicationHolderService.setPublication(this.publicationFormMV)
this.ObjectMergeNotification.close()
}
setDataToFrom(data: IPublicationFormModelEntity) {
this.form.setData(data)
}
private getVideoFiles() {
return this.form.Files.filter( x => x.FileType == 'video')
}
async commit(PublicationAttachmentEntity: PublicationAttachmentEntity) {
PublicationAttachmentEntity.chucksManager.doneChunkUpload()
const mergeRequest = await this.ObjectMergeNotification.socket.commit(PublicationAttachmentEntity.chucksManager.path)
if(mergeRequest.isOk()) {
console.log("commit")
PublicationAttachmentEntity.chucksManager.contentSetReady()
return true
} else {
console.log('no commit')
return false
}
}
private upload(PublicationAttachmentEntity: PublicationAttachmentEntity) {
return new Promise(async (resolve, reject)=> {
if(!PublicationAttachmentEntity.hasChunkManger) {
if(PublicationAttachmentEntity.hasBlob) {
const fileBlob = PublicationAttachmentEntity.blobFile;
const fileChunks = new Chunks({chunkSize: 1000 })
fileChunks.setFile(fileBlob)
PublicationAttachmentEntity.setChunkManger(fileChunks)
} else {
const Base64 = PublicationAttachmentEntity.Base64;
const fileChunks = new ChunksBase64({chunkSize: 1000 })
fileChunks.setFile(Base64)
PublicationAttachmentEntity.setChunkManger(fileChunks)
}
PublicationAttachmentEntity.chucksManager.updateTotalPercentageTrigger = () => {
this.uploadPercentage()
}
}
let attemp = 0;
let result: Result<true, IOUploadError>
if( PublicationAttachmentEntity.chucksManager.isUploading == false && PublicationAttachmentEntity.chucksManager.doneUpload == false) {
do {
attemp++
PublicationAttachmentEntity.chucksManager.clearManualRetry()
PublicationAttachmentEntity.chucksManager.setUploading()
result = await this.UploadFileUseCase.execute(PublicationAttachmentEntity)
PublicationAttachmentEntity.chucksManager.clearUploading()
} while (attemp<3 && result.isErr() && result.error == 'slow')
if(result.isErr()) {
PublicationAttachmentEntity.chucksManager.setManualRetry()
resolve(false)
} else {
return await resolve(this.commit(PublicationAttachmentEntity))
}
} else if ( PublicationAttachmentEntity.chucksManager.contentReady == false) {
console.log("try to send again")
return await resolve(this.commit(PublicationAttachmentEntity))
} else {
console.log('already uploading')
}
})
}
uploadVideosFiles(): Promise<Boolean> {
return new Promise((resolve, reject) => {
// this.ObjectMergeNotification.socket.registerWhenConnected(() => {
const videosFiles = this.getVideoFiles()
window['upload-header-set-percentage'](this.id, 1)
window['upload-header-remove-retry'](this.id);
const videosFilesToUploads = videosFiles.filter( e => e.FileType == "video" && e.toUpload)
const Promises: Promise<any>[] = []
for(const file of videosFilesToUploads) {
const promise = this.upload(file)
Promises.push(promise)
}
// Use Promise.all to wait for all promises to resolve
Promise.all(Promises)
.then((results) => {
// Check if every promise resolved successfully
const allPromisesResolvedSuccessfully = results.every((result) => result == true);
if (allPromisesResolvedSuccessfully) {
console.log('All promises resolved successfully.');
resolve(true)
} else {
window['upload-header-set-retry'](this.id);
resolve(false)
console.log('Some promises failed to resolve successfully.');
}
})
.catch((error) => {
resolve(false)
console.error('An error occurred while resolving promises:', error);
});
//})
})
}
uploadPercentage() {
const videosFiles = this.getVideoFiles()
const percentageArray = videosFiles.map((e) => e.chucksManager.calculatePercentage())
// Check if the array is not empty
if (percentageArray.length === 0) {
window['upload-header-set-percentage'](this.id, this.totalPercentage)
return 0;
} else {
console.log("===============!!==========================================")
let sum = percentageArray.reduce((acc, percentage) => acc + percentage, 0);
// Calculate the average percentage
let averagePercentage = sum / percentageArray.length;
this.totalPercentage = averagePercentage
window['upload-header-set-percentage'](this.id, this.totalPercentage)
return averagePercentage;
}
}
}
@@ -3,7 +3,7 @@ import { ok, err, Result } from 'neverthrow';
import { ObjectMergeNotification } from 'src/app/services/socket-connection-mcr.service';
import { CMAPIService } from "src/app/shared/repository/CMAPI/cmapi.service"
import { DomSanitizer } from '@angular/platform-browser';
import { v4 as uuidv4 } from 'uuid'
export enum UploadError {
@@ -26,7 +26,7 @@ export class UploadStreamingService {
}
}
class UploadFileUseCase {
export class UploadFileUseCase {
CMAPIService: CMAPIService = window["CMAPIAPIRepository"]
constructor() {}
async execute(PublicationAttachmentEntity: PublicationAttachmentEntity): Promise<Result<true, IOUploadError >> {
@@ -168,7 +168,7 @@ export class PublicationAttachmentEntity {
this.toUpload = true
}
setChunkManger (chunks: Chunks) {
setChunkManger (chunks: Chunks | ChunksBase64) {
this.chucksManager = new ChucksManager({chunks})
}
get hasChunkManger() {
@@ -178,6 +178,10 @@ export class PublicationAttachmentEntity {
get hasChunkManager() {
return this.chucksManager != null
}
get hasBlob() {
return this.blobFile
}
}
interface IPublicationFormModelEntity {
@@ -210,6 +214,7 @@ export class PublicationFormModel implements IPublicationFormModelEntity {
Files: PublicationAttachmentEntity[] = []
hasSet = false
send = false
setData(data: IPublicationFormModelEntity) {
if(data.Files) {
@@ -224,12 +229,15 @@ export class PublicationFormModel implements IPublicationFormModelEntity {
export class PublicationFormMV {
readonly id = uuidv4()
private UploadFileUseCase = new UploadFileUseCase()
form = new PublicationFormModel()
ObjectMergeNotification = new ObjectMergeNotification()
totalPercentage = 0
constructor() {
// this.ObjectMergeNotification.connect();
this.ObjectMergeNotification.connect();
window['upload-header-set-add'](this.id, this.totalPercentage)
}
setDataToFrom(data: IPublicationFormModelEntity) {
@@ -245,9 +253,11 @@ export class PublicationFormMV {
const mergeRequest = await this.ObjectMergeNotification.socket.commit(PublicationAttachmentEntity.chucksManager.path)
if(mergeRequest.isOk()) {
console.log("commit")
PublicationAttachmentEntity.chucksManager.contentSetReady()
return true
} else {
console.log('no commit')
return false
}
}
@@ -257,20 +267,31 @@ export class PublicationFormMV {
return new Promise(async (resolve, reject)=> {
if(!PublicationAttachmentEntity.hasChunkManger) {
const fileBlob = PublicationAttachmentEntity.blobFile;
const fileChunks = new Chunks({chunkSize: 50 })
fileChunks.setFile(fileBlob)
PublicationAttachmentEntity.setChunkManger(fileChunks)
if(PublicationAttachmentEntity.hasBlob) {
const fileBlob = PublicationAttachmentEntity.blobFile;
const fileChunks = new Chunks({chunkSize: 50 })
fileChunks.setFile(fileBlob)
PublicationAttachmentEntity.setChunkManger(fileChunks)
} else {
const Base64 = PublicationAttachmentEntity.Base64;
const fileChunks = new ChunksBase64({chunkSize: 50 })
fileChunks.setFile(Base64)
PublicationAttachmentEntity.setChunkManger(fileChunks)
}
PublicationAttachmentEntity.chucksManager.updateTotalPercentageTrigger = () => {
this.uploadPercentage()
}
} else if(PublicationAttachmentEntity.chucksManager.doneUpload) {
return resolve(true)
}
let attemp = 0;
let result: Result<true, IOUploadError>
if( PublicationAttachmentEntity.chucksManager.isUploading == false) {
if( PublicationAttachmentEntity.chucksManager.isUploading == false && PublicationAttachmentEntity.chucksManager.doneUpload == false) {
do {
attemp++
@@ -293,7 +314,7 @@ export class PublicationFormMV {
}
} else if ( PublicationAttachmentEntity.chucksManager.contentReady == false) {
console.log("try to send again")
return await resolve(this.commit(PublicationAttachmentEntity))
} else {
@@ -311,6 +332,8 @@ export class PublicationFormMV {
// this.ObjectMergeNotification.socket.registerWhenConnected(() => {
const videosFiles = this.getVideoFiles()
window['upload-header-set-percentage'](this.id, 1)
const videosFilesToUploads = videosFiles.filter( e => e.FileType == "video" && e.toUpload && e.blobFile)
const Promises: Promise<any>[] = []
@@ -328,8 +351,10 @@ export class PublicationFormMV {
if (allPromisesResolvedSuccessfully) {
console.log('All promises resolved successfully.');
window['upload-header-set-remove'](this.id);
resolve(true)
} else {
window['upload-header-set-remove'](this.id);
resolve(false)
console.log('Some promises failed to resolve successfully.');
}
@@ -344,22 +369,26 @@ export class PublicationFormMV {
}
get uploadPercentage() {
uploadPercentage() {
const videosFiles = this.getVideoFiles()
const percentageArray = videosFiles.map((e) => e.chucksManager.calculatePercentage())
// Check if the array is not empty
if (percentageArray.length === 0) {
return null;
window['upload-header-set-percentage'](this.id, this.totalPercentage)
return 0;
} else {
let sum = percentageArray.reduce((acc, percentage) => acc + percentage, 0);
// Calculate the average percentage
let averagePercentage = sum / percentageArray.length;
this.totalPercentage = averagePercentage
window['upload-header-set-percentage'](this.id, this.totalPercentage)
return averagePercentage;
}
let sum = percentageArray.reduce((acc, percentage) => acc + percentage, 0);
// Calculate the average percentage
let averagePercentage = sum / percentageArray.length;
return averagePercentage;
}
}
@@ -405,6 +434,51 @@ export class Chunks {
}
export class ChunksBase64 {
chunkSize: number
private base64: string
bytes: Uint8Array
constructor({chunkSize}) {
this.chunkSize = chunkSize * 1024
}
get totalChunks () {
return Math.ceil(this.bytes.length / this.chunkSize);
}
setFile(base64: string) {
this.base64 = base64
let utf8Encoder = new TextEncoder();
this.bytes = utf8Encoder.encode(base64);
}
// Function to read a chunk of the file
async readChunk(start: number, end: number) {
// Slice the last 1MB of bytes
let slicedBytes = this.bytes.slice(start, end);
// Convert the sliced bytes back to a string
let text = new TextDecoder().decode(slicedBytes);
return text
}
async getChunks(i: number): Promise<string> {
i--
if(i < this.totalChunks) {
const start = i * this.chunkSize;
const end = Math.min(start + this.chunkSize, this.bytes.length);
const chunk = await this.readChunk(start, end);
return chunk
}
}
}
interface IUploadResponse {
result: Result<any, Error>
attemp: number
@@ -424,6 +498,8 @@ export class ChucksManager {
needToCommit = true
subscribeToUseCaseResponse: Function[] = []
updateTotalPercentageTrigger = () => {}
getUploadPercentage() {
return this.uploadPercentage
}
@@ -483,6 +559,7 @@ export class ChucksManager {
setPercentage() {
const percentage: number = this.calculatePercentage()
console.log({percentage})
this.updateTotalPercentageTrigger()
this.uploadPercentage = percentage.toString()+"%"
}
@@ -30,7 +30,7 @@
<ion-content>
<ion-refresher name="refresher" slot="fixed" (ionRefresh)="doRefresh($event)">
<ion-progress-bar type="indeterminate" *ngIf="showLoader"></ion-progress-bar>
<ion-progress-bar type="indeterminate" *ngIf="showLoader || publicationFolderService.showLoader"></ion-progress-bar>
<ion-refresher-content>
</ion-refresher-content>
</ion-refresher>
@@ -17,6 +17,8 @@ import { AskModalPage } from 'src/app/modals/ask-modal/ask-modal.page';
import { checkFileTypeService } from 'src/app/services/checkFileType.service';
import { PublicationVideoManagerService } from "src/app/services/publication/publication-video-manager.service";
import { StopvideoService } from "src/app/services/stopvideo.service";
import { PublicationHolderService } from 'src/app/services/publication/publication-holder.service'
@Component({
selector: 'app-view-publications',
templateUrl: './view-publications.page.html',
@@ -72,7 +74,8 @@ export class ViewPublicationsPage implements OnInit {
public publicationFolderService: PublicationFolderService,
public checkFileType: checkFileTypeService,
private publicationVideoManagerService: PublicationVideoManagerService,
public StopvideoService: StopvideoService
public StopvideoService: StopvideoService,
public PublicationHolderService: PublicationHolderService
) {
@@ -175,42 +178,9 @@ export class ViewPublicationsPage implements OnInit {
this.showLoader = true;
const folderId = this.folderId
try {
const publicationIds = await this.publications.GetPublicationsList(folderId).toPromise();
await this.publicationFolderService.getPublicationsIds(folderId)
this.createPublicationList(folderId)
let loadLater = []
for (let publicationId of publicationIds) {
if (!this.publicationIsPresent(publicationId, folderId)) {
await this.loadPublication(publicationId, folderId)
} else {
loadLater.push(publicationId)
}
}
for (let publicationId of loadLater) {
await this.loadPublication(publicationId, folderId)
}
for (let localPublication of this.publicationFolderService.publicationList[folderId]) {
const apiPublication = publicationIds.includes(localPublication.DocumentId)
if (!apiPublication) {
this.publicationFolderService.deletePost(folderId, localPublication.DocumentId)
}
}
this.showLoader = false;
this.storage.set(folderId, this.publicationFolderService.publicationList[folderId]);
this.oldpublicationIds = publicationIds
} catch (error) {
this.showLoader = false;
}
this.showLoader = false;
}
@@ -231,31 +201,8 @@ export class ViewPublicationsPage implements OnInit {
}
async loadPublication(publicationId, folderId) {
let Publication = await this.publications.GetPublicationWithArrayOfFilesById(publicationId).toPromise();
let publicationDetails: Publication = this.publicationPipe.itemList(Publication)
const findIndex = this.publicationFindIndex(publicationId, folderId)
const found = this.publicationIsPresent(publicationId, folderId)
if (!found) {
this.publicationFolderService.publicationList[folderId].push(publicationDetails)
this.publicationFolderService.revertPublicationOrder(folderId)
} else {
let a: any = Object.assign({},this.publicationFolderService.publicationList[folderId][findIndex])
let b: any = Object.assign({}, publicationDetails)
a.Files = a.Files.length
b.Files = b.Files.length
if(JSON.stringify(a) != JSON.stringify(b)) {
this.publicationFolderService.publicationList[folderId][findIndex] = publicationDetails
} else {
// console.log({publicationDetails})
}
}
await this.publicationFolderService.loadPublication(publicationId, folderId)
}
@@ -268,28 +215,36 @@ export class ViewPublicationsPage implements OnInit {
async AddPublication(publicationType: any, folderId: any) {
if (window.innerWidth < 701) {
const modal = await this.modalController.create({
component: NewPublicationPage,
componentProps: {
//if(this.PublicationHolderService.PublicationFormMV.length == 0) {
if (window.innerWidth < 701) {
const modal = await this.modalController.create({
component: NewPublicationPage,
componentProps: {
publicationType: publicationType,
folderId: folderId,
},
cssClass: 'new-publication modal modal-desktop',
backdropDismiss: false
});
modal.onDidDismiss().then(() => {
this.doRefresh(event);
});
await modal.present();
} else {
this.addNewPublication.emit({
publicationType: publicationType,
folderId: folderId,
},
cssClass: 'new-publication modal modal-desktop',
backdropDismiss: false
});
folderId: folderId
})
}
// } else {
// this.toastService._successMessage('já existe uma publicação a ser processado');
//}
modal.onDidDismiss().then(() => {
this.doRefresh(event);
});
await modal.present();
} else {
this.addNewPublication.emit({
publicationType: publicationType,
folderId: folderId
})
}
}
@@ -378,24 +333,29 @@ export class ViewPublicationsPage implements OnInit {
stopVideo() {
var videos = document.querySelectorAll('video');
// Pause each video
videos.forEach(function (video) {
video.pause();
})
try {
var videos = document.querySelectorAll('video');
this.videoElements.forEach(videoElement => {
// You can access the native HTML video element using videoElement.nativeElement
const video: HTMLVideoElement = videoElement.nativeElement;
// Pause each video
videos.forEach(function (video) {
video.pause();
})
video.pause()
// Do something with each video element
// console.log(video);
});
} catch (e) {
try {
this.videoElements.forEach(videoElement => {
// You can access the native HTML video element using videoElement.nativeElement
const video: HTMLVideoElement = videoElement.nativeElement;
video.pause()
// Do something with each video element
// console.log(video);
});
} catch (e) {
}
} catch (error) {
}
+3 -3
View File
@@ -1,7 +1,7 @@
import { Environment } from './../app/models/envarioment'
import { environment as oaprProd } from './suport/oapr'
import { environment as doneITProd } from './suport/doneIt'
import { DevDev } from './suport/dev'
// import { environment as doneITProd } from './suport/doneIt'
import { DevDev } from './suport/dev'
export const environment: Environment = oaprProd;
export const environment: Environment = DevDev;
+1 -1
View File
@@ -1,6 +1,6 @@
import { Environment } from './../app/models/envarioment'
import { environment as oaprDev } from './suport/oapr'
import { doneITDev } from './suport/doneIt'
// import { doneITDev } from './suport/doneIt'
import { DevDev } from './suport/dev'