que_tal_uma_confirmacao - VWJavascript/Alurapic GitHub Wiki

Que tal uma confirmação

Completamos nossa aplicação concluindo nosso cadastro de fotos, contudo podemos deixar ainda melhor a experiência dos nossos usuários.

Em ListagemComponent, a remoção de uma foto ocorre sem hiato, instantaneamente. Como esta operação é irreversível, vamos solicitar a confirmação do usuário, garantindo assim uma segunda chance para que ele reflita sobre a operação que irá realizar.

Podemos conseguir essa funcionalidade adicionando no método remove de ListagemComponent uma confirmação rudimentar, porém não menos eficaz:

// alurapic/client/app/listagem/listagem.component.ts

// código anterior omitido
remove(foto: FotoComponent): void {
    if(confirm('Tem certeza')) {
        this.service.remove(foto)
            .subscribe(
                fotos => {

                    let novasFotos = this.fotos.slice(0);
                    let indice = novasFotos.indexOf(foto);
                    novasFotos.splice(indice, 1);
                    this.fotos = novasFotos;
                    this.mensagem = 'Foto removida com sucesso';
                },
                erro => {
                    console.log(erro);
                    this.mensagem = 'Não foi possível remover a foto';
                });
    }
}
// código posterior omitido

Isolando a lógica de confirmação em um componente

Problema resolvido, mas será que é a melhor solução? Se tivermos ações de outros componentes que necessitem confirmação do usuário? Sairemos espalhando o código de confirmação em todos eles?

Vamos remover a lógica de confirmação que acabamos de adicionar no método remove de ListagemComponent. Agora, Vamos isolar a lógica de confirmação em um componente reutilizável por outros componentes que necessitem dessa verificação antes de executar determinada ação. Ele se chamará BotaoComponent:

// alurapic/client/app/botao/botao.component.ts

import { Component, Input } from '@angular/core';

@Component({
    selector: 'botao',
    templateUrl: './botao.component.html'
})
export class BotaoComponent {

    @Input() nome: string = 'Ok';
    @Input() estilo: string = 'btn-default';
    @Input() tipo: string = 'button';
    @Input() desabilitado: boolean = false;
}

Vamos criar agora o módulo BotaoModule:

// alurapic/client/app/botao/botao.module.ts

import { NgModule } from '@angular/core';
import { BotaoComponent } from './botao.component';

@NgModule({
  declarations: [ BotaoComponent ],
  exports: [ BotaoComponent ]
})
export class BotaoModule { }

E claro, não podemos nos esquecer de importá-lo em AppModule:

import 'rxjs/add/operator/map';
import { NgModule }      from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { AppComponent }   from './app.component';
import { ListagemComponent }   from './listagem/listagem.component';
import { CadastroComponent }   from './cadastro/cadastro.component';
import { HttpModule } from '@angular/http';
import { RouterModule, Routes } from '@angular/router';
import { FotoModule } from './foto/foto.module';
import { PainelModule } from './painel/painel.module';
import { routing } from './app.routes';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';

// importando o novo módulo! Não esqueça de adicioná-lo também no array da propriedade imports

import { BotaoModule } from './botao/botao.module';

@NgModule({
  imports:      [ 
    BrowserModule, 
    HttpModule, 
    PainelModule, 
    FotoModule,
    routing,
    FormsModule,
    ReactiveFormsModule,
    BotaoModule
  ],
  declarations: [ AppComponent, ListagemComponent, CadastroComponent ],
  bootstrap:    [ AppComponent ]
})
export class AppModule { }

Nosso componente aceita receber quatro parâmetros. O primeiro é o nome do botão. Se nenhum nome for passado seu valor padrão será "Ok". O segundo parâmetro é o estilo do botão que possui valor padrão btn-default. É este parâmetro que nos permite exibir diferentes botões do Bootstrap, contanto que passemos a classe correta do botão como parâmetro. Há também o parâmetro tipo, para indicar o type, que possui valor padrão button. Por fim, temos o parâmetro desabilitado para permitir a habilitação ou não do botão.