1 00:00:02,100 --> 00:00:03,360 Assim, conseguimos muito, 2 00:00:03,390 --> 00:00:05,460 somos capazes de gravar dados, buscar dados, 3 00:00:05,460 --> 00:00:08,190 usar nosso token para escopo de dados ou produtos 4 00:00:08,190 --> 00:00:10,950 e pedidos para nosso usuário atualmente conectado, somos capazes 5 00:00:10,950 --> 00:00:12,610 de efetuar login e assim por 6 00:00:12,620 --> 00:00:14,280 diante, e isso é ótimo. 7 00:00:14,280 --> 00:00:20,130 Uma coisa que não estamos fazendo agora é que não continuamos nossas sessões, 8 00:00:20,130 --> 00:00:23,970 por assim dizer. Se eu recarregar, sempre preciso fazer 9 00:00:24,030 --> 00:00:25,230 o login novamente 10 00:00:25,230 --> 00:00:31,170 e não é exatamente isso que eu quero, seria bom se pudéssemos entrar automaticamente se tivermos um token 11 00:00:31,170 --> 00:00:38,310 válido e, para isso, precisamos fazer duas coisas - precisamos armazenar o token em algum lugar do dispositivo, não no Redux, porque 12 00:00:38,310 --> 00:00:43,110 o Redux está na memória e isso será perdido sempre que o aplicativo reiniciar. 13 00:00:43,110 --> 00:00:45,920 Portanto, ele precisa estar em algum lugar 14 00:00:45,930 --> 00:00:53,480 no disco rígido do dispositivo, por assim dizer, além disso, precisamos verificar esse armazenamento sempre que nosso aplicativo iniciar e definir automaticamente 15 00:00:53,480 --> 00:00:58,080 o token no Redux e redirecionar o usuário se encontrarmos um token válido. 16 00:00:59,160 --> 00:01:05,590 Agora vamos começar com o armazenamento, porque esse é um primeiro passo lógico. Para armazenar, precisamos importar algo aqui 17 00:01:05,590 --> 00:01:10,090 no criador da ação, não no criador da ação 18 00:01:10,090 --> 00:01:20,810 do produto, mas na realidade aqui no criador da ação do auth. É necessário importar o armazenamento assíncrono do React Native. 19 00:01:21,930 --> 00:01:23,280 Com isso 20 00:01:23,460 --> 00:01:32,130 importado, podemos usar isso para salvar dados no dispositivo, o armazenamento assíncrono é uma API React Native que, no final, usa um armazenamento 21 00:01:32,130 --> 00:01:38,370 de valor-chave no dispositivo que está disponível no iOS e no Android, onde podemos armazenar dados 22 00:01:38,370 --> 00:01:45,150 que persistem nas reinicializações de aplicativos, para que possamos usar para salvar dados que não são perdidos quando 23 00:01:45,150 --> 00:01:47,460 o aplicativo é iniciado ou reiniciado. 24 00:01:47,460 --> 00:01:52,910 Então, adicionarei uma nova função, salvarei os dados no armazenamento ou algo assim e espero obter 25 00:01:53,040 --> 00:02:00,100 meu token e meu userId, os dois dados em que estou interessado aqui e agora podemos usar o armazenamento assíncrono defina 26 00:02:00,140 --> 00:02:08,970 um item que é como você salva os dados e o item que você define precisa ser uma cadeia de caracteres, mas antes de tudo você 27 00:02:08,970 --> 00:02:11,560 precisa definir uma chave e eu irei chamá-los 28 00:02:11,580 --> 00:02:14,840 de dados do usuário, mas isso depende de você, 29 00:02:14,850 --> 00:02:19,260 você precisará dessa chave mais tarde recuperar seus dados e o segundo valor 30 00:02:19,330 --> 00:02:21,170 agora é uma string, 31 00:02:21,180 --> 00:02:26,310 portanto, a string que você deseja salvar lá e você deve salvar essencialmente uma string. 32 00:02:26,440 --> 00:02:27,340 Agora 33 00:02:27,340 --> 00:02:33,990 isso não é problema, podemos usar json. stringify para converter um objeto Javascript em uma string, e o 34 00:02:33,990 --> 00:02:40,200 objeto que eu quero converter é um objeto que contém meu token que recebo como argumento aqui e que contém o 35 00:02:40,200 --> 00:02:41,740 userId que recebo como argumento. 36 00:02:41,790 --> 00:02:48,980 Então, no final, salvamos esse objeto como uma string no dispositivo. 37 00:02:48,990 --> 00:02:54,590 Agora só precisamos chamar salvar dados no armazenamento sempre que terminarmos o login ou a inscrição, então talvez depois de despachar 38 00:02:54,590 --> 00:03:01,080 o login, possamos chamar salvar dados no armazenamento e encaminhar resData. idToken 39 00:03:01,140 --> 00:03:08,100 e resData. localId, as mesmas coisas que usamos no Redux e 40 00:03:08,100 --> 00:03:11,610 definitivamente queremos usá-las lá, porque o Redux é importante para 41 00:03:11,850 --> 00:03:18,090 o aplicativo em execução, mas também o guardo no dispositivo para quando queremos carregá-lo quando o aplicativo reiniciar. 42 00:03:18,140 --> 00:03:22,810 Agora, porém, isso por si só não fará o truque e, é claro, também precisamos fazê-lo 43 00:03:22,820 --> 00:03:28,340 ao se inscrever, mas isso por si só não fará o truque, precisaremos de uma informação extra aqui antes de continuar. 44 00:03:28,430 --> 00:03:35,780 Você sabe qual? Precisamos saber quanto tempo o token é válido, pois você não 45 00:03:36,230 --> 00:03:42,920 deve esquecer que, eventualmente, ele expirará, e é por isso que, para fazer login e se inscrever, você obtém a 46 00:03:43,310 --> 00:03:50,510 chave expiresIn na resposta, que indica em segundos quanto tempo leva para o seu token. é inválido e o Firebase não 47 00:03:50,510 --> 00:03:51,510 aceita mais. 48 00:03:51,650 --> 00:03:57,590 Também precisamos armazenar essas informações, porque, se voltarmos mais tarde, se reiniciarmos o aplicativo após três horas, 49 00:03:57,590 --> 00:04:01,390 nosso token provavelmente será inválido; portanto, precisamos saber quando o token 50 00:04:01,460 --> 00:04:04,370 será invalidado para que, quando verificarmos isso, 51 00:04:04,370 --> 00:04:09,800 quando o o aplicativo reinicia, quando verificamos se temos um token, sabemos se esse token que 52 00:04:09,800 --> 00:04:16,460 podemos encontrar ainda é relevante ou se já é inválido e precisamos de um novo token de qualquer maneira, 53 00:04:16,460 --> 00:04:20,120 caso em que não devemos fazer login automaticamente no usuário. 54 00:04:20,480 --> 00:04:23,360 Então, eu quero armazenar a data de 55 00:04:23,360 --> 00:04:31,180 validade e criarei a data de validade aqui como uma constante, um novo objeto de data que, no final, deve 56 00:04:31,180 --> 00:04:35,020 ter a data atual e adicionar o tempo de validade. 57 00:04:37,810 --> 00:04:45,790 Agora, a nova data pega um objeto de data, mas, com o get time, obtemos o timestamp atual em milissegundos desde o 58 00:04:45,790 --> 00:04:49,590 início dos tempos, por assim dizer, que é aqui em 59 00:04:49,780 --> 00:04:51,200 1970 em Javascript. 60 00:04:51,570 --> 00:04:57,630 Portanto, é uma quantidade em milissegundos e, para isso, podemos adicionar resData. expira em. 61 00:04:58,210 --> 00:05:01,720 Isso é uma quantidade de segundos, então precisamos convertê-lo 62 00:05:01,720 --> 00:05:06,910 em milissegundos e também é uma string, por isso precisamos convertê-lo em um número. 63 00:05:06,910 --> 00:05:16,490 Então, aqui, adicionarei um sinal de mais aqui ou simplesmente analise-o alternativamente para convertê-lo em um número inteiro e, em seguida, multiplico-o 64 00:05:16,490 --> 00:05:23,550 por 1000 para convertê-lo de segundos para milissegundos, porque obter tempo também nos fornece milissegundos. 65 00:05:23,570 --> 00:05:29,690 Agora, o que isso me dá é um novo registro de data e hora no futuro, que é 66 00:05:29,690 --> 00:05:35,990 o horário atual mais o horário de expiração, e o embrulho em outro objeto de data para convertê-lo novamente 67 00:05:36,110 --> 00:05:44,520 de um número enorme de milissegundos em um objeto de data concreto. Agora, essa data de validade é o que também precisamos passar para 68 00:05:44,530 --> 00:05:48,880 salvar os dados no armazenamento. Portanto, espero obter a data de validade 69 00:05:48,880 --> 00:05:51,070 também e precisamos anexá-la aqui. 70 00:05:51,400 --> 00:05:55,810 Então, aqui eu posso nomear essa data de validade talvez 71 00:05:55,840 --> 00:06:05,830 para misturar as coisas, essa é a minha data de validade e lá quero chamar esse pequeno método toISOString, que podemos chamar em 72 00:06:05,830 --> 00:06:11,500 objetos de data, porque isso a converterá em uma string em um formato 73 00:06:11,500 --> 00:06:14,240 padronizado que Eu quero salvar 74 00:06:14,400 --> 00:06:18,150 Agora, é isso que eu quero fazer para me inscrever, então isso 75 00:06:18,150 --> 00:06:20,190 pode ser copiado por lá e 76 00:06:20,520 --> 00:06:22,120 é isso que eu 77 00:06:22,170 --> 00:06:26,220 quero fazer lá também, crie a data de validade e salve-a no armazenamento. 78 00:06:26,220 --> 00:06:29,220 Agora, estamos salvando isso no armazenamento, o que é bom, 79 00:06:29,670 --> 00:06:35,670 mas agora também precisamos verificar isso ao fazer login. Uma boa maneira de fazer isso é criar 80 00:06:35,670 --> 00:06:41,040 uma nova tela e, na verdade, eu o crio fora das minhas pastas existentes na pasta screens, 81 00:06:41,040 --> 00:06:47,570 mas nem na loja nem no usuário, e vou nomear essa tela de inicialização e você pode nomear como quiser. quer. 82 00:06:47,610 --> 00:06:54,240 A ideia é que eu mostre essa tela enquanto meu aplicativo estiver inicializando e estou descobrindo se o usuário está autenticado ou não 83 00:06:54,240 --> 00:06:55,380 e isso será 84 00:06:55,380 --> 00:06:56,770 super rápido, é provável que 85 00:06:56,790 --> 00:07:02,350 nem a tela seja exibida quando o aplicativo for iniciado. Agora, aqui, criamos um componente React 86 00:07:02,370 --> 00:07:06,670 regular importando reagir de reagir e, lá, importo coisas do React 87 00:07:06,910 --> 00:07:11,120 Native, para ser preciso, preciso de uma visualização, o indicador de 88 00:07:11,130 --> 00:07:17,310 atividade para mostrar um botão giratório de carregamento enquanto o aplicativo está inicializando e também folha 89 00:07:17,310 --> 00:07:23,280 de estilo e também armazenamento assíncrono, porque aqui também quero acessar o armazenamento assíncrono para 90 00:07:23,280 --> 00:07:26,450 descobrir se temos ou não um token válido. 91 00:07:26,460 --> 00:07:33,660 Então, aqui, eu tenho meu componente da tela de inicialização, que é um componente React regular e o objeto 92 00:07:33,780 --> 00:07:44,570 da folha de estilo aqui na Folha de estilo. criar e, no final, podemos exportar essa tela de inicialização assim. Agora, no componente, apresentarei aqui o 93 00:07:44,580 --> 00:07:56,450 indicador de atividade com um tamanho grande e uma cor de cores. primário e, para isso, é necessário importar essas cores 94 00:07:56,450 --> 00:08:05,100 constantemente, é claro, e também atribuir um pouco de estilo aqui para a visualização, 95 00:08:05,100 --> 00:08:13,520 e eu vou usar apenas estilos. tela aqui que agora podemos adicionar à folha de 96 00:08:13,520 --> 00:08:16,530 estilo e que deve ser muito 97 00:08:16,690 --> 00:08:23,690 simples, flexione uma, justifique o centro de conteúdo e alinhe o centro de itens para algum 98 00:08:23,720 --> 00:08:29,870 conteúdo centralizado na vertical e na horizontal. Agora é claro que as coisas realmente importantes acontecem 99 00:08:29,870 --> 00:08:33,520 acima do código jsx, é aqui que agora precisamos verificar o 100 00:08:33,620 --> 00:08:39,820 armazenamento assíncrono em busca de um token válido e posso fazer isso com a ajuda do efeito de uso, 101 00:08:39,820 --> 00:08:42,230 o que me permite executar alguma 102 00:08:42,250 --> 00:08:51,190 lógica aqui quando esse componente montado e, de fato, aqui, não precisarei de nenhuma dependência, porque aqui dentro do efeito de uso, agora quero adicionar uma nova 103 00:08:51,190 --> 00:08:58,060 função que chamarei de tentar inscrever-se ou tentar fazer login é mais adequada e uso a função separada porque aqui eu 104 00:08:58,090 --> 00:09:04,390 deseja usar o Async Aguardar, o que eu posso fazer, criando a função interna que agora posso chamar aqui, 105 00:09:04,390 --> 00:09:05,310 tente fazer 106 00:09:05,410 --> 00:09:10,840 o login, porque novamente, async aqui nesta função que você passa a usar efeito não seria 107 00:09:10,840 --> 00:09:14,020 realmente permitido e, aqui, tente o login, o objetivo 108 00:09:14,170 --> 00:09:21,460 agora é verificar se há um token válido no armazenamento assíncrono. Então, eu recebo meus dados de usuário aqui acessando o 109 00:09:21,520 --> 00:09:23,030 AsyncStorage. getItem 110 00:09:23,240 --> 00:09:28,750 e use a chave que você usou para armazenar. 111 00:09:28,960 --> 00:09:35,950 Portanto, no meu caso, são dados do usuário, mas você deve usar a chave que usou na sua autenticação. js na pasta actions para 112 00:09:35,950 --> 00:09:43,160 armazenar seus dados com armazenamento assíncrono. Então, eu recupero isso e agora o importante a saber aqui 113 00:09:43,160 --> 00:09:49,970 é que o item get, como todos os métodos de armazenamento assíncrono, é realmente assíncrono, o que significa que o nome 114 00:09:50,030 --> 00:09:55,520 sugere, eu acho, o que significa que você recebe uma promessa aqui, para que possamos aguardar isso 115 00:09:55,520 --> 00:09:58,560 e isso nos devolverá os dados do usuário. 116 00:09:58,570 --> 00:10:05,200 Agora, esses são os dados como uma string. Para convertê-los em um dado com o 117 00:10:05,230 --> 00:10:14,410 qual podemos trabalhar, terei meus dados transformados com JSON. analisa os dados do usuário e isso analisa uma sequência 118 00:10:14,410 --> 00:10:24,220 no formato JSON e a converte em um objeto ou matriz Javascript. Agora, antes mesmo de tentar isso, vou verificar se os dados do usuário não são 119 00:10:24,220 --> 00:10:24,850 verdadeiros; 120 00:10:24,850 --> 00:10:31,030 portanto, se não estiverem configurados, se não conseguirmos encontrar nenhum dado para essa chave, porque sei que certamente não 121 00:10:31,030 --> 00:10:31,720 estamos logados. 122 00:10:31,780 --> 00:10:36,370 Então, aqui eu quero retornar e não continuar e fazer uma 123 00:10:36,370 --> 00:10:43,810 coisa importante, usarei a navegação de acessórios e navegarei para a tela de autenticação porque essa tela de inicialização 124 00:10:43,810 --> 00:10:44,770 deve ser 125 00:10:45,190 --> 00:10:52,960 adicionada ao navegador, para que possamos importá-la, importar a tela de inicialização a partir da pasta screens, é claro, 126 00:10:54,070 --> 00:10:57,590 a tela de inicialização e a adicionamos ao 127 00:10:57,760 --> 00:11:07,190 navegador principal aqui, então, onde também temos auth e shop e lá no topo, adiciono startup e aponto na minha tela de inicialização. 128 00:11:07,350 --> 00:11:11,490 Isso significa que esta é a primeira coisa que carrego aqui. 129 00:11:11,490 --> 00:11:17,010 Agora, nesta tela de inicialização, portanto, vou para a tela de autenticação se não conseguirmos encontrar um token; 130 00:11:17,010 --> 00:11:22,230 portanto, graças ao navegador de comutadores, deixo essa tela e vou para a tela de autenticação ou 131 00:11:22,230 --> 00:11:28,810 para a pilha de autenticação porque não encontro um token. Portanto, se passarmos disso por verificação, temos pelo menos alguns dados, mas o token 132 00:11:28,810 --> 00:11:29,950 ainda pode ser inválido. 133 00:11:30,370 --> 00:11:39,980 Portanto, é claro que teremos o token, o userId e a data de validade que podemos extrair dos dados transformados 134 00:11:40,520 --> 00:11:42,770 após esta linha, aqui 135 00:11:43,600 --> 00:11:46,860 com este objeto destruindo a sintaxe e 136 00:11:46,870 --> 00:11:54,580 estes são os três dados com os três nomes exatamente iguais que eu armazeno aqui no 137 00:11:54,580 --> 00:11:56,400 auth. arquivo js. Portanto, 138 00:11:56,410 --> 00:12:00,700 aqui temos um objeto com um campo token, userId 139 00:12:00,700 --> 00:12:03,000 e data de validade, é 140 00:12:03,010 --> 00:12:08,580 o que armazenamos no armazenamento assíncrono, é o que posso recuperar aqui. 141 00:12:08,610 --> 00:12:11,360 Agora precisamos verificar se o token ainda é 142 00:12:11,460 --> 00:12:20,670 válido e, para isso, posso recriar minha data de validade usando a nova data e a data de validade que na verdade são uma string no formato ISO e 143 00:12:20,670 --> 00:12:23,220 agora podemos adicionar uma verificação if e 144 00:12:23,220 --> 00:12:27,270 ver se data de validade, portanto, a data em que o token se 145 00:12:27,270 --> 00:12:33,660 torna inválido, se for menor ou igual à nova data, que é o carimbo de data / hora atual, o 146 00:12:33,660 --> 00:12:39,570 que significa que a data de validade está no passado e, se estiver no passado, nosso token é inválido. 147 00:12:40,320 --> 00:12:45,300 Também é inválido se não conseguirmos encontrar um token ou se não 148 00:12:45,360 --> 00:12:51,900 conseguirmos encontrar um userId, se alguma das três condições for verdadeira, teremos um token inválido ou 149 00:12:51,900 --> 00:12:54,550 um userId inválido ou algo assim. 150 00:12:54,570 --> 00:12:58,700 Portanto, nesse caso, também quero retornar e, é claro, 151 00:12:59,340 --> 00:13:05,640 navegar para a tela de autenticação. Se passarmos por isso, se verificar, temos 152 00:13:05,700 --> 00:13:10,110 um token, temos um userId e o token ainda é válido. 153 00:13:10,110 --> 00:13:17,720 Então, se você fizer isso aqui, chamarei adereços. navegação. navegar na loja para ir para a tela 154 00:13:17,720 --> 00:13:21,020 da loja e também importante, preciso fazer o login do usuário e, 155 00:13:21,030 --> 00:13:24,230 para isso, precisamos de uma nova ação, porque não quero enviar 156 00:13:24,240 --> 00:13:29,900 uma solicitação agora, só quero alterar alguns dados no Redux. Então, adicionarei um novo criador de 157 00:13:31,550 --> 00:13:44,200 ação aqui, exportar const autentique talvez o que leva meu userId e meu token e que é usado para alterar meus dados no Redux e, para isso, agora adicionarei 158 00:13:44,200 --> 00:13:45,250 um 159 00:13:45,250 --> 00:13:54,390 novo identificador de ação, autenticado com uma string de autenticar aqui e usá-lo aqui como um tipo de autenticação, anexe meu 160 00:13:55,290 --> 00:14:02,190 userId, que é meu userId aqui, e meu token, que é o token que recebo como 161 00:14:02,190 --> 00:14:08,360 argumento, e agora essa ação de autenticação é o que quero despachar aqui na 162 00:14:08,370 --> 00:14:09,600 tela de inicialização. 163 00:14:10,730 --> 00:14:15,950 Mas antes de fazer isso, a propósito, também podemos voltar para o criador da ação 164 00:14:15,950 --> 00:14:22,520 e, no final da inscrição, em vez de despachar minha própria ação de inscrição personalizada aqui, também podemos despachar autenticar 165 00:14:22,550 --> 00:14:23,390 e executar 166 00:14:23,510 --> 00:14:33,930 isso aqui, esse criador da ação e simplesmente encaminhe resData. localId como userId e resData. idToken como um token 167 00:14:33,950 --> 00:14:40,040 e faça o mesmo no final do login. 168 00:14:40,040 --> 00:14:45,400 Então agora eu realmente combinei esses dois fluxos porque, no final, acontece o mesmo; agora, 169 00:14:45,560 --> 00:14:51,350 no redutor, no redutor de autenticação, é claro, em vez de verificar o login e a inscrição, 170 00:14:51,350 --> 00:14:57,780 podemos simplesmente importar autenticar e usar esse identificador aqui, Livre-se da inscrição e eu apenas comentarei para continuar vivendo 171 00:14:57,800 --> 00:15:00,830 aqui como referência, porque acontece a mesma coisa. 172 00:15:00,860 --> 00:15:05,980 Portanto, agora a combinação faz sentido, porque também precisamos dele para esse login automático. 173 00:15:06,020 --> 00:15:11,090 Então aqui também o despacho aqui para o login manual e a inscrição manual 174 00:15:11,090 --> 00:15:17,150 e, é claro, agora com isso, se você quiser, também pode se livrar do login e se inscrever 175 00:15:17,150 --> 00:15:20,200 aqui, desses dois identificadores, porque não use-os mais. 176 00:15:20,390 --> 00:15:24,380 Mas com isso, de volta à tela de inicialização, 177 00:15:24,600 --> 00:15:34,480 agora também podemos despachar isso e, para isso, você só precisa importar o despacho de uso do React Redux e importar a ação; portanto, importe tudo 178 00:15:34,490 --> 00:15:41,650 como ações de autenticação, talvez da pasta da loja, do diretório pasta de ações e do arquivo de autenticação 179 00:15:41,650 --> 00:15:43,190 lá e, em 180 00:15:43,270 --> 00:15:49,590 seguida, aqui no início, obtenha acesso à função de despacho chamando use dispatch e com isso 181 00:15:49,800 --> 00:15:55,230 disponível, aqui podemos adicionar despacho como uma dependência, mas isso nunca muda, portanto o 182 00:15:55,240 --> 00:16:01,330 efeito nunca será executado novamente e aqui, depois de navegar para a loja, agora também quero 183 00:16:01,450 --> 00:16:10,510 despachar ações de autenticação, autenticar e encaminhar o userId extraído, portanto, este campo aqui e o token extraído, portanto, este campo que obtive do 184 00:16:10,510 --> 00:16:19,150 meu armazenamento assíncrono e que agora deve me conectar automaticamente . Foi muito trabalho, vamos ver 185 00:16:19,150 --> 00:16:24,310 se funciona. Se eu recarregar isso, acabarei aqui na tela de 186 00:16:24,340 --> 00:16:27,010 logon, porque agora não tenho tokens válidos armazenados no armazenamento assíncrono. 187 00:16:27,880 --> 00:16:37,510 Portanto, agora, se eu tentar fazer login aqui, sou encaminhado, se agora recarregar, acabarei aqui novamente e isso é ótimo, porque 188 00:16:37,510 --> 00:16:43,560 agora isso significa que isso parece funcionar e que o token está armazenado. 189 00:16:43,730 --> 00:16:48,230 Agora, é claro, seria bom se também pudéssemos sair, porque, no momento, não há como 190 00:16:48,230 --> 00:16:49,070 fazer isso.