2
respostas

Problemas no Pipe

![](Insira aqui a descrição dessa imagem para ajudar na acessibilidade

import { Router } from '@angular/router';
import { AnimaisService } from './../animais.service';
import { FormGroup, FormBuilder, Validators } from '@angular/forms';
import { Component, OnInit } from '@angular/core';
import { finalize } from 'rxjs/operators';
import { HttpEvent, HttpEventType } from '@angular/common/http';

@Component({
  selector: 'app-novo-animal',
  templateUrl: './novo-animal.component.html',
  styleUrls: ['./novo-animal.component.css'],
})
export class NovoAnimalComponent implements OnInit {
  formularioAnimal!: FormGroup;
  file!: File;
  preview!: string;
  percentualConcluido = 0;

  constructor(
    private animaisService: AnimaisService,
    private formbuilder: FormBuilder,
    private router: Router
  ) {}

  ngOnInit(): void {
    this.formularioAnimal = this.formbuilder.group({
      file: ['', Validators.required],
      description: ['', Validators.maxLength(300)],
      allowComments: [true],
    });
  }

  upload() {
    const allowComments =
      this.formularioAnimal.get('allowComments')?.value ?? false;
    const description = this.formularioAnimal.get('description')?.value ?? '';

    this.animaisService
      .upload(description, allowComments, this.file)
      .pipe(finalize(() => this.router.navigate(['animais'])))
      .subscribe(
        (event: HttpEvent<any>) => {
          if (event.type === HttpEventType.UploadProgress) {
            const total = event.total ?? 1;
            this.percentualConcluido = Math.round(100 * (event.loaded / total));
          }
        },
        (error) => console.log(error)
      );
  }

  gravaArquivo(arquivo: any): void {
    const [file] = arquivo?.files;
    this.file = file;
    const reader = new FileReader();
    reader.onload = (event: any) => (this.preview = event.target.result);
    reader.readAsDataURL(file);
  }
}
2 respostas

Olá Rafaela,

notei que seu finalize está importando de 'rxjs/operators: import { finalize } from 'rxjs/operators'; .

Penso que o correto seria importar direto de rxjs dessa forma a seguir: import { finalize } from 'rxjs';

Espero que te ajude!

Olá Rafaela!

Também tive esse problema. Ele acontece porque o pipe espera trabalhar com um Observable ao invés de um void.

Provavelmente faltou colocar um return no momento de fazer a requisição lá no método de upload do animais.service.ts. O meu método upload lá no animais.service.ts ficou assim:

  upload(descricao: string, permiteComentario: boolean, arquivo: File): Observable<any> {
    const formData = new FormData();
    formData.append('description', descricao);
    formData.append('allowComments', permiteComentario ? 'true' : 'false');
    formData.append('imageFile', arquivo);

    return this.http.post(`${this._url}/photos/upload`, formData, {
      observe: 'events',
      reportProgress: true,
    });
  }

Se você reparar, também tipei o retorno do método como um Observable<any> pois iremos observar o progresso do upload, embora a requisição em si não retorne nada.

Espero que isso te ajude!