Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Sempre recebo a mensagem de erro.

Estou conseguindo salvar, vejo os dados na tabela quando inspeciono, mas sempre recebo a mensagem de erro.

Inclusive, no meu vs code, está marcando o conteúdo do mergeMap como se tivesse errado.

cadastro.ts

import { Component } from '@angular/core';
import { IonicPage, NavController, NavParams, AlertController, Alert } from 'ionic-angular';
import { Carro } from '../../app/modelos/carro';
import { AgendamentosServiceProvider } from '../../providers/agendamentos-service/agendamentos-service';
import { HomePage } from '../home/home';
import { Agendamento } from '../../app/modelos/agendamento';
import { Storage } from '@ionic/storage';
import { Observable } from 'rxjs/Observable';

@IonicPage()
@Component({
  selector: 'page-cadastro',
  templateUrl: 'cadastro.html',
})

export class CadastroPage {

public carro: Carro;
public precoTotal: number;

public nome: string = "";
public endereco: string = "";
public email: string = "";
public data: string = new Date().toISOString();

private _alerta: Alert;

  constructor(public navCtrl: NavController, 
    public navParams: NavParams,
    private _agendamentosService: AgendamentosServiceProvider,
    private _alertCtrl: AlertController,
    private _storage: Storage,
  ) {
      this.carro = this.navParams.get('carroSelecionado');
      this.precoTotal = this.navParams.get('precoTotal');


  }

  agenda(){

    if(!this.nome || !this.email || !this.endereco || !this.data){
      this._alertCtrl.create({
        title: 'Preenchimento Obrigatóeio!',
        subTitle: 'Preencha todos os campos.',
        buttons: [{ 
          text: 'ok',
        }],
      }).present();
      return null;
    }

    this._alerta = this._alertCtrl.create({
      title: 'Aviso',
      buttons: [{
        text: 'ok',
        handler: () => {
          this.navCtrl.setRoot(HomePage)
        }
      }]
    });

    let agendamento: Agendamento = {
      nomeCliente: this.nome,
      enderecoCliente: this.endereco,
      emailCLiente: this.email,
      modeloCarro: this.carro.nome,
      data: this.data,
      precoTotal: this.precoTotal,
      confirmado: false,
      enviado: false,

    }

    let mensagem = '';
    this._agendamentosService.agenda(agendamento)
    .mergeMap(() => this.salva(agendamento))
    .finally(
      () => {
        this._alerta.setSubTitle(mensagem);
        this._alerta.present();
      }
    ).subscribe(
      () => mensagem = 'Agendamento concluído com sucesso.',
      () => mensagem = 'Ocorreu um problema.'
    );
  }

  salva(agendamento) {
    let chave = this.email+this.data.substr(0, 10);
    let promise = this._storage.set(chave, agendamento);

    Observable.fromPromise(promise);
  }

}

agendamento-service.ts

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs/Observable';


@Injectable()
export class AgendamentosServiceProvider {

  private _url= 'http://localhost:8080/api';



  constructor(private _http: HttpClient) {

  }

  agenda(agendamento){
    return this._http
    .post(this._url+'/agendamento/agenda', agendamento)
    .do(() => agendamento.enviado = true);
  }

}
2 respostas

app.module.ts

import { BrowserModule } from '@angular/platform-browser';
import { ErrorHandler, NgModule } from '@angular/core';
import { IonicApp, IonicErrorHandler, IonicModule } from 'ionic-angular';
import { SplashScreen } from '@ionic-native/splash-screen';
import { StatusBar } from '@ionic-native/status-bar';
import { HttpModule } from '@angular/http';
import { MyApp } from './app.component';
import { HomePage } from '../pages/home/home';
import { HttpClientModule } from '@angular/common/http';
import { CarrosServiceProvider } from '../providers/carros-service/carros-service';
import { NgModel } from '@angular/forms/src/directives/ng_model';
import { AgendamentosServiceProvider } from '../providers/agendamentos-service/agendamentos-service';

import { IonicStorageModule } from '@ionic/storage';

import 'rxjs/add/operator/finally';
import 'rxjs/add/operator/do';
import 'rxjs/add/operator/mergeMap';
import 'rxjs/add/operator/catch';
import 'rxjs/add/observable/fromPromise';
import 'rxjs/add/observable/of';


@NgModule({
  declarations: [
    MyApp,
    HomePage,
  ],
  imports: [
    BrowserModule,
    IonicModule.forRoot(MyApp),
    HttpClientModule,    
    IonicStorageModule.forRoot({
      name: 'aluracar',
      storeName: 'agendamentos',
      driverOrder: ['indexeddb'],
    })
  ],
  bootstrap: [IonicApp],
  entryComponents: [
    MyApp,
    HomePage,
  ],
  providers: [
    StatusBar,
    SplashScreen,
    {provide: ErrorHandler, useClass: IonicErrorHandler},
    CarrosServiceProvider,
    HttpClientModule,
    AgendamentosServiceProvider,
  ]
})
export class AppModule { }
solução!

Boa noite, José! Como vai?

O problema é que o callback do mergeMap() deve retornar um Observable e o seu método agenda() não está retornando esse Observable esperado! O método agenda() deveria ficar assim:

salva(agendamento) {
    let chave = this.email+this.data.substr(0, 10);
    let promise = this._storage.set(chave, agendamento);

    return Observable.fromPromise(promise);
}

Grande abraço e bons estudos, meu aluno!