Simples aplicação real time com Angular 4 e Firebase, parte 6

No artigo anterior falei sobre autenticar um usuário no firebase, nesse quero mostrar como criar um novo usuário e também falar sobre rotas filhas

Angular + Firebase
Angular + Firebase
#1 | #2 | #3 | #4 | #5 | #6
Disclaimer
Esses artigos foram escritos entre maio e junho de 2017, muita coisa mudou desde lá, então procure usar as libs e referências mais atualizadas para implementar os passos que são aqui descritos
fontes: https://github.com/evlymn/simplesapprealtime

Por questões de segurança, eu acredito, o firebase não implementa uma forma de listar os usuários registrados, o que vejo muito é usarem a base dados regular, linkando o uid do usuário com um novo registro e assim fornecendo outro dados que a api de autenticação não suporta, como endereço, etc… Mas existe um porém, lembrem-se que essa base de dados não é relacional, e esse é o primeiro pecado que temos que evitar, não trazer o mundo relacional para o Firebase #FicaDica

Vamos colocar a mão na massa então

Primeiramento, vamos gerar o componente que irá criar o novo usuário.
No terminal, na pasta da aplicação digite:

ng g c login/login-cadastro-form

Estava olhando agora, e os nomes dos componentes não estão ficando legais, eu pelo menos não estou gostando, mas isso de certa forma nos dará uma oportunidade fazer um belo e trabalhoso refatoring no projeto rsrs
Mais tarde veremos isso 🙂

componente criado
componente criado

Feito isso vamos fazer uma parte meio chatinha, não sei se chatinha é a palavra correta, mas complexa pelo menos é, vamos criar uma rota filha, para isso digite no terminal dentro da pasta da aplicação o seguinte:

touch src/app/login/login.routing.module.ts
arquivo do módulo de rotas filhas criado
arquivo do módulo de rotas filhas criado

Ótimo, agora vamos adicionar os imports necessários para as rotas funcionarem.

import { NgModule, ModuleWithProviders } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';import { LoginCadastroFormComponent } from './login-cadastro-form/login-cadastro-form.component';
import { LoginFormComponent } from './login-form/login-form.component';
import { LoginComponent } from './login.component';
imports
imports

E escrever a constante que conterá as rodas

const LoginRoutes: Routes = [
{
path: ‘login’, component: LoginComponent, children: [
{ path: ‘’, component: LoginFormComponent },
{ path: ‘cadastro’, component: LoginCadastroFormComponent }
]
}
]

Notem que existe um novo parâmetro sendo passado “path: ‘login’, component: LoginComponent, children: [“, para declarar que é uma rota filha.

constante LoginRoutes
constante LoginRoutes

Com isso ok vamos escrever e decorar nossa classe com a diretiva@NgModule

@NgModule({
imports: [RouterModule.forChild(LoginRoutes)],
exports: [RouterModule]
})export class LoginRoutingModule { }

Reparem no RouterModule.forChild(LoginRoutes) definindo que é uma rota filha.

classe LoginRoutingModule
classe LoginRoutingModule

Passamos todo esse trabalho e dando um ng serve vemos que nossa aplicação está funcionando igual ao que era antes rsrs
Calma sua afobada, vamos ver o que falta 🙂 
Primeira coisa a ser feita, vc lembra que dentro de app.routing.module.ts a gente chamava login-form.component?
Não?! Hmmm… Sem problema, mas fizemos isso sim 🙂
Vamos trocar esse import pelo login.component

import { NgModule, ModuleWithProviders } from ‘@angular/core’;
import { Routes, RouterModule } from ‘@angular/router’;
import { LoginComponent } from ‘./login/login.component’;
import { CadastroPessoaComponent } from ‘./cadastro-pessoa/cadastro-pessoa.component’;const AppRoutes: Routes = [
{ path: ‘’, component: LoginComponent },
{ path: ‘cadastro’, component: CadastroPessoaComponent }
]
app.routing.module
app.routing.module

Depois disso feito se vc rodar a aplicação com ng serve irá ver a seguinte tela

Mas não é bem isso que queremos…
Queremos que nos mostre a tela de login novamente =D
Para isso iremos modificar o login.module, importar o LoginRoutingModule e exportar o LoginCadastroComponent.

import { LoginCadastroFormComponent } from ‘./login-cadastro-form/login-cadastro-form.component’;
import { LoginRoutingModule } from ‘./login.routing.module’;
login.module
login.module

Vamos rodar para ver se está tudo ok
No terminal:

ng serve
Erros!!!!
Erros!!!!

Então gente, rodei e deu vários erros…
Pode ser que vcs não tenham passado por isso.
Mas descobri que tem uma pegadinha no autoimport ao trazer o RouterModule, ele coloca assim:

import { RouterModule } from “@angular/router/src”;

O problema é, não é dentro de /src, é até /router, deve ficar assim o import

import { RouterModule } from “@angular/router”;

Agora sim, tudo ok!

ufa, tudo funcionando!!
ufa, tudo funcionando!!

Mas ainda não é tudo, ainda precisamos colocar a tag router-outlet no template html do login.component

<router-outlet></router-outlet>
Não é o mesmo outlet que vc vai para comprar as brusinhas e sapatinhos baratinhos não! :P
Não é o mesmo outlet que vc vai para comprar as brusinhas e sapatinhos baratinhos não! 😛

Vamos rodar a aplicação?

ng serve
minimalista
minimalista

Dai você pensa, todo esse trabalho para isso?!?!!
Simmmmmm kkkkkk!!
Amiga, take easy, a gente apenas não escreveu o html e nem colocamos os links para as novas rotas, mas por baixo dos panos está tudo lindo e funcionando! 😛
Mas para saciar sua vontade de ver algo vamos fazer uma pequena modificação no arquivo app.routing.module, vamos trocar a rota para toda vez que entrar na aplicação ela redirecione para /login

{ path: ‘’, component: LoginComponent },

por

{ path: ‘’, redirectTo: ‘/login’, pathMatch: ‘full’ },

Deverá ficar assim:

Rota modificada
Rota modificada

Agora em no template html do login componente vamos adicionar os linkspara login e cadastro de novo usuários

<nav>
<a routerLink=”/” ActivatedRoute routerLinkActive=”active”>Login</a>
<a routerLink=”/cadastro”>Cadastro</a>
</nav>
<router-outlet></router-outlet>
linkadinhos!
linkadinhos!

Vamos rodar a aplicação e ver se está tudo ok =D

ng serve

Com as modificações que fizemos nas rotas e nos componentes deve mandar direto para a página de login

login como index
login como index

E no link de cadastro deve ir para o login-cadastro-form

login-cadastro-form

Agora vamos adicionar algumas coisinhas no template html do componente criado, os campos de email e senha, parecido como login mas precisaremos validá-los dessa vez, vamos lá.

<h1>Cadastro de usuário</h1><form #f=”ngForm” (submit)=”form_cadastro(f)”><input type=”text” required ngModel name=”email” placeholder=”Email”>
<br />
<input type=”text” required ngModel name=”emailconfirmacao” placeholder=”Confirme o email”>
<br />
<input type=”password” required ngModel name=”senha” placeholder=”Senha”>
<br /><input type=”password” required ngModel name=”senhaconfirmacao” placeholder=”Confirme a senha”><br /><button type=”submit”>Cadastrar</button></form>

Fica assim:

login-cadastro-form.component
login-cadastro-form.component

Dentro do .ts desse componente iremos apenas declarar o método form_cadastro

form_cadastro declarado
form_cadastro declarado

Resultado

Formulário de cadastro de usuário
Formulário de cadastro de usuário

Agora vamos dar uma olhada na validação, a primeira coisa a se fazer caso o formulário não seja válido é não deixar ser submetido, para isso iremos adicionar essa pequena definição ao botão [disabled]=”!f.form.valid”.Ficando assim:

<button type=”submit” [disabled]=”!f.form.valid”>Cadastrar</button>

Também iremos mudar o tipo de input do campos de text para type=”email” adicionar a propriedade email a cada campo, que fará que o angular valide como tal

<input type=”email” required ngModel email name=”email” placeholder=”Email”>
<br />
<input type=”email” required ngModel email name=”emailconfirmacao” placeholder=”Confirme o email”>
<br />

Resultado:

template html modificado
template html modificado

Note que botão fica desativado, e só se habilitará quando os campos estiverem preenchidos e no tipo correto de informação.

Site rodando com botão desativado
Site rodando com botão desativado

Botão não habilitado por não estar nos tipos de dados corretos

Wrong!!!
Wrong!!!

Botão habilitado com os tipos válidos

tido válido
tudo válido

Ainda precisamos validar se os campos de confirmação correspondem aos de cadastro, pois somente assim o botão deverá ser habilitado.

Essa é uma validação simples, sem componentes, mas que nos dá chance colocarmos mais a mão no código 🙂

Para isso criei 3 métodos no login-cadastro-form.component.ts

verificaSeEmailsSaoIguais(f: NgForm): boolean {if (f.controls.email)
return f.controls.email.value.toString().trim() == f.controls.emailconfirmacao.value.toString().trim();return false;
}
verificaSeSenhasSaoIguais(f: NgForm): boolean {
if (f.controls.senha)
return f.controls.senha.value.toString().trim() == f.controls.senhaconfirmacao.value.toString().trim();return false;
}
verificaSeFormEValido(f: NgForm): boolean {
return f.form.valid && this.verificaSeEmailsSaoIguais(f) && this.verificaSeSenhasSaoIguais(f);
}
login-cadastro-form.component.ts
login-cadastro-form.component.ts

No login-cadastro-form.html chamamos o método verificaSeFormEValido

<button 
type=”submit” [disabled]=”!verificaSeFormEValido(f)”>Cadastrar</button>
login-cadastro-form.htm
login-cadastro-form.htm

Com tudo pronto deve habilitar o botão de cadastrar e submeter o formulário

funfando!!!!!
funfando!!!!!

Mas acho que só isso para o usuário não vai achar muito legal, quem sabe não colocamos algum aviso mais visual para ele.
Para isso vamos os métodos que já criamos, olha como é fácil

Avisos
Avisos

Olha como fica no navegador!

Olha que linduuuu!!!! ❤
Olha que linduuuu!!!! ❤

Bom, feito isso vamos criar o usuário no firebase? 
Por incrível que pareça, essa é a parte mais simples rsrs
Apenas vamos adicionar algumas linhas ao método form_cadastro, do login-cadastro-form.component.ts,não vamos nos preocupar em validarnada aqui pois isso já foi feito antes

form_cadastro(f: NgForm) {
let email = f.controls.email.value.toString().trim();
let senha = f.controls.senha.value.toString().trim();
this.afAuth.auth.createUserWithEmailAndPassword(email, senha)
.then(t => {
alert(‘Uhuu!! Usuário criado! =D \n Id: ‘ + t.uid);
})
.catch(c => {
alert(‘Ihhh deu probleminha aqui! \n Erro: ‘ + c.message);
})
}

Vamos testar?!?!

ng serve

Digite os dados do usuário e clique em cadastrar

\o/

Usuário criado
Usuário criado

Vamos ver como ficou no firebase

Emocionada!!! Você não?!? ❤
Emocionada!!! Você não?!? ❤

Gente, por hoje é só, na próxima parte vamos ver mais um pouquinho de autenticação, quem sabe adicionar uma foto para esse nosso usuário, ou enviarmos um email de confirmação de cadastro?! =D

Bjuss e obrigada pela paciência ❤

1

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *