OneBitFood V2 – Aula 3

 

 

 


Aula 3: Conclusão do APP

Formulário de Endereço: 00:01:03:11
Modal para Incluir no Carrinho: 00:37:46:06
Desafio Adicionar Produto Repetido: 00:58:40:07
Criando o Carrinho: 00:59:48:02
Finalização do Pedido: 01:20:43:27
Página de Sucesso: 01:42:50:12
Desafio Página 404: 01:48:38:21
SSR, SSG e Production: 01:49:23:26


[Aviso importante: Caso você copie e cole os códigos, alguns caracteres invisíveis podem vir junto e dar alguns Bugs, então remova os espaços entre as linhas (e os crie novamente com a barra)]

Bons códigos 🤘

0 – Links importantes

 

1 – Formulário de Endereço

Nesta parte vamos criar a base do Formulário de endereço que é onde o usuário vai selecionar o endereço de busca de restaurantes e de entrega dos produtos.

1 – Vamos atualizar a API para que ela devolva as cidades disponíveis no padrão adequado, na API em views/available_cities/index.json.jbuilder coloque:

2 – Vamos atualizar o _app para que o RecoilRoot também envolva o Header (que vai usar estados dele):

3 – Crie o componente para o form de endereço:

4 – Para criar o modal de endereço coloque o seguinte código em components/AddressModal/index.js`:

5 – Para incluir a chamada do modal no Header, faça as seguintes inclusões:

6 – Crie um service chamado getAvailableCities.js e coloque nele:

7 – Agora, no component FormAddress coloque:

8 – Inclua ele no AddressModal inserindo:

9 – Ainda no AddressModal agora vamos exibir o modal de endereço sempre que ele não tenha sido preenchido ainda (exceto na página inicial):

10 – Para finalizar, atualize o getRestaurants para fazer o filtro por cidade:

 

 

 

2 – Modal para incluir no carrinho

1 – Crie o Atom cartAtom.js dentro de store/atoms e coloque nele:

2 – Crie o component AddProductModal rodando:

3 – Inclua a estrutura principal do component no arquivo criado:

4 – Inclua ele no component CategoryProducts do DetailsRestaurant:

5 – No AddModalProduct coloque a lógica:

6 – No component CategoryProducts na primeira coluna aumente o tamanho dela (md={4}) para 6 (md={6})

7 – Teste subindo o projeto (e observando o localstorage no application das ferramentas de depuração do browser):

 

 

3 – Desafio Adicionar Produto repetidoa

No Modal de adicionar produto, na hora da adição verifique se o produto já foi previamente adicionado ao carrinho, se sim, ao invés de adiciona-lo novamente aumente a sua quantidade no pedido.

 

 

4 – Criando o Carrinho

1 – Gere os components necessários para o carrinho rodando:

2 – No component Cart criei a estrutura do modal:

3 – Adicione a chamada dele no Header:

4 – No component Cart inclua a estrutura do component:

5 – Nesse mesmo component: a – Inclua o atom cart:

b – Inclua os components bootstrap e os services de formatação:

c – Coloque o métodos para calcular o subtotal e o total do carrinho e a lógica para avisar quando o carrinho está vázio:

d – Inclua o método para remover produtos do carrinho:

e – Agora inclua a parte visual:

6 – No component CartModal: a – Inclua o Cart:

b – Inclua o atom cart também:

c – Para podermos ir para a página de finalização inclua:

7 – Suba o projeto e veja como ficou:

Para referência: 1 – CartModal completo:

2 – Cart completo:

3 – Header completo:

 

 

 

5 – Finalização do pedido

1 – Crie a page Orders:

2 – Crie os components base:

3 – Crie a base dos components: a – NewOrder:

b – OrderForm:

4 – Coloque na página criada:

5 – Vamos criar a base do component NewOrder:

6 – Vamos importar e adicionar o Cart nele:

7 – Vamos criar um service para enviar a order para o backend, crie um service chamado createOrder.js e coloque nele:

8 – No component OrderForm: a – Importe o service criado:

b – Inclua também os atoms cart e address:

c – Crie um state para mostrar uma mensagem de erro quando a chamada falhar:

d – Importe também o router:

e – Importe os components do Bootstrap que vamos usar:

f – Crie um state order:

g – Inclua um método para atualizar o estado order:

h – Agora crie um método para chamar nosso serviço de criação de order:

i – Por fim inclua a parte visual do component:

8 – Atualize o component OrderNew para incluir o component criado anteriormente:

9 – Teste finalizar um pedido:

 

 

6 – Página de sucesso

1 – Dentro de pages/orders crie a página success.js e coloque nela:

2 – Suba o projeto e teste todo o processo de escolha, seleção do produto e realização do pedido:

 

 

 

7 – Desafio página 404

Crie uma página 404 bonita e faça com que o next exiba ela sempre que ele não encontrar uma URL pedida (inclusive quando você solicitar um restaurante que não existe).

 

 

8 – SSR, SSG e Production

Renderização do lado do cliente (CSR)

Prós

  • Rápido no servidor – Como você está apenas renderizando uma página em branco, é muito rápido renderizar.

  • Pode ser estática – a página em branco pode ser gerada estaticamente e servida a partir de algo como S3, o que a torna ainda mais rápida.

  • Oferece suporte a aplicativos de página única – a renderização do lado do cliente é o único modelo que oferece suporte a aplicativos de página única ou SPAs.

Contras

Sem renderização inicial – você está enviando uma página em branco para o cliente. Portanto, se seu aplicativo for grande ou o cliente estiver em uma conexão lenta, isso não será o ideal.

Renderização do lado do servidor (SSR)

Prós

  • Conteúdo imediatamente disponível – como você está enviando HTML renderizado para o cliente, o cliente começará a ver o conteúdo quase imediatamente.

  • Nenhuma busca adicional do cliente – Idealmente, o processo de renderização do servidor fará todas as chamadas necessárias para obter os dados, portanto, você não fará nenhuma chamada de serviço adicional do cliente. Pelo menos até que o usuário comece a brincar um pouco com a página.

  • Ótimo para SEO

Contras

  • Mais lento no servidor – você está renderizando a página duas vezes, uma no servidor e outra no cliente. Você provavelmente também está fazendo chamadas de serviço do servidor para processar a página. Tudo isso leva tempo, então o envio inicial do HTML ao cliente pode ser atrasado.

  • Incompatível com algumas bibliotecas de IU

 

Geração de site estático (SSG)

Prós

  • Conteúdo imediatamente disponível – como você está enviando HTML renderizado para o cliente, o cliente começará a ver o conteúdo quase imediatamente.

  • Nenhuma busca adicional do cliente – Idealmente, o processo de renderização do servidor fará todas as chamadas necessárias para obter os dados, portanto, você não fará nenhuma chamada de serviço adicional do cliente. Pelo menos até que o usuário comece a brincar um pouco com a página.

  • Ótimo para SEO – motores de busca como conteúdo HTML. Se você está usando apenas a renderização do lado do cliente, então está contando com os motores de busca rodando seu Javascript, o que pode ou não acontecer.

  • Rápido de servir incrível – O conteúdo estático é muito rápido de servir. Você também pode armazená-lo em cache de forma limpa.

  • Sem servidor – você não precisa executar um servidor. Portanto, você não precisa monitorar esse servidor e obterá muito menos pings de dever de pager.

Contras

  • Pode ser lento para reconstruir sites grandes – Se você tem dezenas de milhares de rotas, deve esperar lentidão. Embora a equipe do NextJS esteja trabalhando em reconstruções incrementais.

  • Incompatível com algumas bibliotecas de IU

 

Usando SSR no projeto

1 – Atualize a page restaurants/[id].js colocando: a – A função getServerSideProps para baixar as informações do servidor assim que a página for chamada:

b – Atualize a função Restaurant:

2 – Atualize o component DetailsRestaurant colocando:

3 – Suba o projeto para ver como ficou:

 

Usando SSG

1 – Atualize a page restaurants/[id].js colocando: a – A função getStaticPaths para pegar todos os ids dos restaurantes:

b – A função getStaticProps para baixar cada um dos restaurantes disponíveis:

c – Atualize a função Restaurante colocando:

2 – Atualize o component DetailsRestaurant colocando:

 

 

Colocando o projeto em modo Production

1 – Gere a versão para production do seu projeto rodando:

2 – Em package.json atualize a linha “start”: “next start” para:

3 – Rode seu projeto como production:

 

 

 

Feito com s2 por OneBitCode