import { Injectable } from '@angular/core' import { HttpEventType } from '@angular/common/http' import { FileSystemFileEntry, NgxFileDropEntry } from 'ngx-file-drop' import { ConsumerStatusService, FileStatusPhase, } from './consumer-status.service' import { DocumentService } from './rest/document.service' import { Subscription } from 'rxjs' @Injectable({ providedIn: 'root', }) export class UploadDocumentsService { private uploadSubscriptions: Array = [] constructor( private documentService: DocumentService, private consumerStatusService: ConsumerStatusService ) {} uploadFiles(files: NgxFileDropEntry[]) { for (const droppedFile of files) { if (droppedFile.fileEntry.isFile) { const fileEntry = droppedFile.fileEntry as FileSystemFileEntry fileEntry.file((file: File) => { let formData = new FormData() formData.append('document', file, file.name) let status = this.consumerStatusService.newFileUpload(file.name) status.message = $localize`Connecting...` this.uploadSubscriptions[file.name] = this.documentService .uploadDocument(formData) .subscribe({ next: (event) => { if (event.type == HttpEventType.UploadProgress) { status.updateProgress( FileStatusPhase.UPLOADING, event.loaded, event.total ) status.message = $localize`Uploading...` } else if (event.type == HttpEventType.Response) { status.taskId = event.body['task_id'] status.message = $localize`Upload complete, waiting...` this.uploadSubscriptions[file.name]?.complete() } }, error: (error) => { switch (error.status) { case 400: { this.consumerStatusService.fail( status, error.error.document ) break } default: { this.consumerStatusService.fail( status, $localize`HTTP error: ${error.status} ${error.statusText}` ) break } } this.uploadSubscriptions[file.name]?.complete() }, }) }) } } } }