Aula 19
Autenticação com o Firebase Através do signInWithEmailAndPassword
Summary
## Resumo da Conversa sobre loginform.js
### Estrutura e Função do Botão "Entrar"
1. **Configuração do Botão "Entrar"**:
- O botão chamará a função `onLoginPress` ao ser clicado.
2. **Implementação da Função `onLoginPress`**:
- Criar a função `onLoginPress` dentro do componente, que será chamada ao clicar no botão.
3. **Uso do `this` e Binders**:
- É necessário o uso de binders para garantir que `this` referencie o componente correto.
### Chamada do Action Creator
4. **Chamada do Action Creator**:
- A função `onLoginPress` irá disparar um action creator para realizar o login, assumindo que existe um `loginUser`.
5. **Argumentos Necessários**:
- Para o login, serão necessários `email` e `password`.
- Os dados podem ser passados como um objeto: `{ email: this.props.email, password: this.props.password }`.
6. **Destructuring para Props**:
- É sugerido usar destructuring para simplificar o acesso às propriedades.
### Injeção e Definição do Action Creator
7. **Injeção do Action Creator**:
- É necessário injetar `loginUser` nas props usando `mapDispatchToProps`.
8. **Definição do Action Creator**:
- A função `loginUser` deve ser definida em `actions`, retornando uma função que faz uma chamada assíncrona à Firebase para autenticação.
9. **Uso do Redux Thunk**:
- Usar Redux Thunk para permitir que o action creator retorne uma função que envia uma ação depois de realizar uma operação assíncrona (login via Firebase).
### Chamada à API Firebase
10. **Chamada à Firebase**:
- A função `signinWithEmailAndPassword` é utilizada para autenticar, passando `email` e `password`.
11. **Tratamento de Promessa**:
- Usar `.then` e `.catch` para lidar com a resposta da autenticação, logando a resposta ou erro no console.
### Teste da Implementação
12. **Testando a Autenticação**:
- Criar um usuário no Firebase para testar o login.
- Ao clicar em "entrar", chamar o `onLoginPress`, que aciona o action creator e faz a autenticação.
### Problema Relatado
13. **Erro Encontrado**:
- Recebido o erro "this.props.loginUser is not a function".
- Revisar se a key foi injetada corretamente, se o action foi exportado corretamente e se não há erro nos types.
Video Transcript
Vamos para o arquivo loginform.js.
Vamos configurar esse botão aqui, entrar.
Quando a gente entrar, vamos chamar a função.
Nesse caso, vamos fazer uma função,
vamos entrar press, onLoginPress, alguma coisa assim.
Dentro do componente, vou criar uma função, onLoginPress.
Tá bom?
Que vai ser a função que a gente vai chamar quando clicar no botão entrar.
Pode usar a função de Flash ou pode usar só assim, des.
OnLoginPress, tá bom?
Detalhe, a gente vai ter que, talvez, botar binders,
ou seja, a gente usar a palavra-chave des dentro da função
para se referir ao componente ter que botar binders.
Eu deixei só de caso a gente tenha problema.
O que vai acontecer quando a gente chama onLoginPress?
A gente vai chamar um action creator para logar.
Então, a gente vai assumir que tem,
vai fazer de conta que tem.
Então, des.props, tá bom?
Eu estou usando a palavra-chave des, então, eu tenho que fazer o binders.
Porque se eu botar sem binders, o des vai ser o componente-botão.
Não vai ser o componente-login.
Então, preciso binders para setar, ajustar o contexto da palavra-chave des
dentro dessa função para se referir ao loginform.
Des.props, vamos botar login-user, alguma coisa assim,
para o action creator, tá bom?
E para logar, a gente vai precisar do que? Emel e do password.
Tá bom?
Você pode passar esses como dois argumentos separados
ou como um objeto com as chaves email e password.
Tá bom?
Então, do jeito que eu vou fazer, eu vou fazer um objeto.
Vamos passar o objeto aqui.
Vai ter o email que vai ser o quê? Des.props.email.
Vai ter o password que vai ser o quê? Des.props.password.
Se lembra que esse password email está injetado do redux
via esse maps.t2props.
E note que também é o valor do input. Des.props.maps.email, né?
Tá bom? Vou só quebrar uma linha aqui.
Assim.
Vou chamar o action creator para logar o usuário.
Note que eu estou usando des.props várias vezes,
então eu posso dar um destructuring.
É igual a des.props para remover esse cara.
Fica amanhã melhor, né?
Como eu tenho chave e o valor mesmo nome,
eu posso remover assim e vai dar no mesmo.
Muito mais fácil, né?
E nem preciso quebrar a linha.
Tá bom?
Tá bom.
Agora vamos adicionar esse login user.
Primeiro para usar como login user, a gente tem que injetar como props.
Então, onde é que a gente vai injetar?
Isso. Maps despatos de props lá embaixo.
Adiciona. Login user.
Mas a gente não tem esse cara ainda.
Vamos lá importar.
Login user.
Ah, mas a gente não definiu.
Vamos definir. Detudo actions.
Actions. Export const login user.
Vai ter um objeto, né?
Um password.
Email e password, né?
Vamos botar, sei lá, user info.
Uma coisa assim.
O que vai acontecer aqui?
A gente tem que chamar Firebase para autenticar.
Tá bom?
Mas isso vai demorar um pouco porque é o pedido acíncrono.
Então, a gente vai usar o Redux Tank, finalmente, né?
Em vez de retornar uma ação agora,
eu vou retornar uma função.
Então, Redux Tank permite você,
em vez de retornar só uma ação, retornar uma função.
Então, eu vou return a função assim.
O argumento da função é o dispatch, na verdade.
Então, vai ser assim.
Return dispatch. Retornar a função, né?
O que a gente vai fazer?
A gente vai fazer o pedido Firebase, né?
Então, eu vou usar o módulo Firebase
off.sideinwithemailandpassword.
É longo.
É esse nome aí.
Tá bom? Mas a gente não importou Firebase ainda, né?
Não é? Então, vamos lá no top.
Import Firebase from... o quê?
Firebase.
Tá bom?
Salva aqui, vou voltar.
A gente chama essa função aqui.
Então, Firebase.off
vai retornar no objeto que tem funções
para logar, para cadastrar essas coisas.
Então, chama esse cara e chama essa função
signinwithemailandpassword
para logar, para entrar com o email e o password.
O argumento é primeiro o email,
que vai ser userinfo.email
e o segundo é userinfo.password,
que tá passado com esse cara aqui, né?
E o resultado dessa coisa toda
vai ser retornar uma promessa.
Tá bom?
Para lidar com promessas, a gente usa
ponto then.
Then e o resposta aqui,
response no seu quê?
Vamos dar uma olhada o que acontece com a response.
Vou dar um console log, tá bom?
E se não descer, a gente dá um catch
para o erro, né?
Vou dar um console log também,
para ver o que acontece.
Se autenticar com sucesso,
vai dar esse console log da resposta.
Se não, vai dar esse erro.
Para a gente testar isso, vamos lá.
Vamos lá, de volta no Firebase,
vai para o console do Firebase,
ponto global, ponto com, tá bom?
Eu quero que você vá lá,
selecione seu projeto,
eu já estava lá, mas
autenticação com Firebase.
Vai no authentication,
clica aqui, autenticação,
vai no add user,
adicionar o usuário,
para adicionar o novo cara.
Por exemplo, sei lá,
usar marco,
meio ponto com, password, um 2, 3, 4, 5, 6,
vou adicionar esse cara para testar.
A gente tem esse usuário marco, né?
Não sei o que, vamos lá.
A gente salvar aqui,
tudo definido,
ver se não tem erro aqui ainda, a gente não testou.
Cadê meu Google Chrome para o debugger,
para ver o que acontece.
Demorando, hein?
Tá aí, agora vamos lá,
digitar aqui marco,
meio ponto com, note que tem capitalização aqui,
a gente pode desitabilitar depois, tá bom?
Ah, aqui, saco.
Tá aí.
1, 2, 3, 4, 5, 6,
vamos clicar em entrada, no momento que clicar em entrar,
vai fazer o que? Vamos lá, login form,
salvar aqui, no momento que você clicar,
entrar, vai chamar essa função,
login press, que chama o quê?
Chama o action creator com email, password,
e vai dar no quê?
Vai dar no index do action,
login user, vai dar
Firebase off no seu quê?
Isso vai dar log1,
e vai dar o console log, vamos ver se o console log aparece.
Entrar.
This props login user, not a function,
o que é que aconteceu?
Vamos lá.
Login form, this props login user,
not a function.
Será que a gente fez tudo certo?
Injetou com props,
adicionou a key from actions,
deu no types,
export console login user,
tá tudo ok?
Mas por que deu isso?
Nenhum comentário ainda (loading...)
Nenhum comentário ainda (loading...)
Gostou da aula? 😆👍
Apoie nosso trabalho com uma doação: