OneBitFood V2 – Aula 2

 

 

 


Aula 2: Front-end com Next.js

Introdução ao Cliente Web: 00:01:13
Criação do projeto: 00:05:25
Instalação de dependências: 00:13:39
Estrutura do projeto e Estilos globais: 00:16:57
Component Header: 00:32:14
Tela Home: 00:45:57
Efeito de digitação: 00:58:09
Listando Restaurantes e Categorias: 01:10:46
Baixando os restaurantes da API: 01:33:37
Desafio dos Reviews: 01:50:57
Lista de Categorias: 01:52:50
Baixando as categorias da API: 02:10:07
Criando Busca: 02:19:58
Tela de Detalhes do Restaurante: 02:33:42
Instalando o Recoil: 02:55:36
Desafio Friendly id: 03:04:06


[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 – Planejamento

A ideia inicial

Criar um APP inspirado no Ifood usando Ruby On Rails como API e Next.js como cliente Web

 

O Planejamento

  1. Mockups

    1. Ferramenta: https://www.figma.com

    2. Material: https://drive.google.com/drive/folders/1mqVAQP-96Xa4I8AcdsuFc0v_XJ_elqVx?usp=sharing

  2. Modelo do banco de dados

    1. Ferramenta: DbDesigner

    2. Material: https://dbdesigner.page.link/RvxXdi581QjxiDqe8

  3. Documentação dos endpoints

    1. Ferramenta: https://www.postman.com

    2. Material: https://documenter.getpostman.com/view/10378249/TzRPk9yD

 

Dependências

A seguir, veja as dependências para este projeto (cliente Web)

  • Next.js 10.1.3

  • React 17.0.2

  • React-bootstrap 1.5.2

  • Bootstrap 5.0.0

  • Swr 0.5.5

  • Sass 1.32.8

  • Recoil ^0.2.0

  • Recoil Persist ^2.5.0

  • Slick Carousel ^1.8.1

 

2 – Criação do projeto

Nesta aula nós vamos gerar o nosso projeto básico usando o Create React APP.

1 – Crie um novo projeto ReactJS. Para isso abra seu terminal e digite:

2 – Após isso, acesse o diretório do projeto.

3 – Para testar que seu projeto funcionou rode:

4 – Apague o arquivo styles/Home.module.css

5 – Atualize o arquivo _app.js:

5 – Limpe o arquivo pages/index.js :

Assim teremos um código menos verboso nesse inicio removendo arquivos que não serão utilizados.

6 – Atualize no arquivo package.json o script dev:

 

 

3 – Instalação de dependências

Nesta aula nós vamos instalar as principais dependências do projeto como Swr para as chamadas web, sass para utilizadas o sass ao invés do css comum e o Bootstrap para a estilização do projeto.

1 – Instale também o Swr para fazermos requisições em Apis:

2 – Instale o node-sass, para que possamos adicionar SCSS no nosso projeto

3 – Instale o framework CSS Bootstrap

4 – Instale a biblioteca de ícones:

 

 

4 – Estrutura do Projeto e estilos globais

Para manter a organização vamos criar a estrutura principal de diretórios do nosso projeto já no inicio e também vamos criar alguns estilos comuns a todos os elementos do SPA como cores, espaçamentos e imagem de background.

1 – Crie a de components do nosso projeto:

2 – Baixe as seguintes imagens e as coloque dentro da pasta public: https://drive.google.com/drive/folders/1-iHaCLfuyYktwen46bOMnxSF3dRD22XD?usp=sharing

3 – Limpe o conteúdo do arquivo styles/globals.css e renomeie ele para globals.scss

4 – Atualize o arquivo pages/_app.js colocando:

5 – Crie um arquivo chamado styles/colors.scss coloque nele:

6 – Em globals.scss coloque:

7 – Também adicione uma extensão da variável spacer do bootstrap para termos mais tamanhos de margins e padings e também o efeito de bold para font-weight 600 disponíveis:

8 – Agora vamos importar o Bootstrap no mesmo arquivo (globals.scss):

Obs: Coloque esse import depois do $spacers.

9 – Para incluir o Background acrescente em globals.scss:

Aqui nós incluímos o background fixo da nossa aplicação.

10 – Para mudar definir a fonte padrão inclua a importação da fonte e atualize os estilos do “html, body” incluídos anteriormente em globals.scss:

11 – Para alterar o comportamento da classe container do bootstrap para que o conteúdo ocupe mais espaço lateral na tela no mobile, coloque em globals.scss:

12 – No arquivo pages/index.js, coloque:

13 – Suba o projeto e vejo o background + bootstrap em ação

 

 

5 – Criando o component Header

Nesta parte, vamos criar o componente Header que será utilizado em toda aplicação que será o Header.

1 – Primeiro, vamos criar o diretório src/components/header e dentro dele o arquivo index.js

2 – No arquivo components/Header/index.js` coloque:

3 – Agora vamos adicionar o Header (e o Container) no nosso app. Importe e adicione o componete Header em src/_app.js

4 – Verifique com ficou subindo o projeto:

5 – Para incluir uma classe geral que vai dar destaque ao que for clicável:

a – No globals.scss coloque:

b – Na imagem do Header inclua a classe:

6 – Suba o projeto, passe o mouse sobre o logo e veja o efeito.

 

 

6 – Criando a Home

1 – Adicione em pages/index.js

 

 

 

7 – Efeito de digitação

Vamos incluir na nossa Home um efeito de “digitando” para tornar a experiencia do usuário ainda melhor

1 – Crie um component em components/Typewriter/index.js

2 – Crie a estrutura do Component:

3 – Crie um estado para armazenar o que vai aparecer na página:

4 – Inclua um “efeito”:

5 – Atualize o component pages/index.js para colocar o Typewriter:

 

 

8 – Listando Restaurantes

1- Crie um diretório src/screens/restaurants e dentro dele o arquivo index.js

2 – Crie a estrutura da página:

3 – Agora vamos criar um componente para a lista de restaurantes desta tela:

4 – Adicione o seguinte conteúdo no component criado:

5 – Volte no arquivo pages/restaurants/index.js e altere o conteúdo para:

6 – Agora vamos criar dois métodos úteis que serão reutilizados depois, o toCurrency para formatar o valores financeiros e o trucanteString para exibir no máximo X caracteres de uma string.

a – Crie uma pasta chamada services, rodando:

b – Dentro dela crie o arquivo toCurrency.js e coloque nele:

c – Crie dentro de services também o arquivo trucanteString.js e coloque nele:

7 – Vamos criar o component restaurant que será o box usado para mostrar as informações de cada restaurant no listagem

8 – Adicione o seguinte conteúdo no component criado:

9 – Atualize o component src/components/ListRestaurants/index.js para renderizarmos uma lista de restaurants:

10 – Veja o que foi feito subindo o projeto e acessando /restaurants:

 

 

9 – Baixando os restaurantes da API

1 – Uma pequena correção, na API, na partial _restaurante acrescente (faltou devolvermos esse campo importante):

2 – Crie um arquivo na raiz do projeto chamado next.config.js e coloque nele:

ps: Reinicie o servidor se ele estiver ativo

3 – Para fazer as chamadas do restaurante crie um service chamado getRestaurants.js e coloque nele:

4 – No component ListRestaurants inclua essa chamada atualizando o conteúdo dele para:

 

 

10 – Desafio dos Reviews

1 – Crie uma tabela na API para armazenar os reviews que o restaurante recebeu.

2 – Associe essa tabela ao resturante.

3 – Popule ela com reviews fake nos seeds.

4 – Devolva a nota média do restaurante junto com os outros dados dele.

5 – Exiba ela no frontend (onde colocamos o valor default dos reviews para 5).

 

 

11 – Lista de Categorias

Nesta aula nós vamos desenvolver o component que mostrada a lista de categorias para filtrarmos os restaurantes.

1 – Crie uma pasta src/components/categories e o arquivo index.js para o componente Categories

2 – Para este componentes, primeiro é necessário instalar o plugin Slick Carousel e seu sua adaptação para o React

3 – Dentro da pasta src/components/categories crie um arquivo slick_settings.js para as configurações do Slick com o seguinte conteúdo

4 – No component categories, crie a base colocando:

5 – Atualize a screen Restaurants pages/restaurants/index.js

7 – Crie o component Category (components/categories/Category/index.js) e coloque nele:

8 – Atualize o components Categories importando o Category e passando dados Fake:

9 – Veja como ficou:

 

 

12 – Baixando as categorias da API

Assim como fizemos com restaurantes na aula passada, agora vamos conectar a API para carregar as categorias

1 – Crie um service chamado getCategories.js e coloque nele:

2 – No component Categories:

a – Importe o getCategories:

b – Remova a const categories.

c – Inclua a chamada ao getCategories no component:

d – Crie um método para renderizar o erro, a mensagem de carregando e o conteúdo:

e – Atualize as importações dos elementos do bootstrap:

f – Atualize o conteúdo do método return:

3 – Atualize o getRestaurants.js para permitir o filtro por categoria:

4 – Teste o APP:

 

 

13 – Criando a Busca

Nesta aula vamos criar o componente de busca que vai ficar no cabeçalho do app

1- Crie o diretório components/SearchBox e o arquivo index.js

2- Acrescente o seguinte conteúdo no component criado:

3 – Atualize o código do components/Header/index.js para

4 – Atualize o getRestaurant.js colocando:

5 – Teste o APP (teste na versão mobile também):

 

 

14 – Tela de detalhes do Restaurante

Nesta aula vamos criar a tela de visualização do restaurante com os pratos que ele possui

1- Crie uma page para mostrar os detalhes do restaurante em pages/restaurants, crie um arquivo chamado [id].js

2 – Crie um component para colocar os detalhes do restaurante chamado DetailsRestaurant:

 

3 – Na página [id].js coloque a estrutura da página:

 

4 – Para dividirmos melhor a tela de detalhes crie os seguintes components:

 

5 – Crie a base do component DetailsRestaurant/index.js colocando:

 

6 – Prepare a base dos components que serão usados: a – Details

 

b – CategoryProducts

 

7 – Vamos criar um service para pegar os detalhes do restaurante, em services crie getRestaurant.js e coloque nele:

 

8 – Vamos baixar os dados do restaurante no component DetailsRestaurant/index.js usando nosso getRestaurant:

 

9 – No component Details criado, coloque:

10 – No component CategoryProducts coloque:

 

 

15 – Instalando o Recoil

O que é o Recoil?

O Recoil é uma biblioteca criada dentro do Facebook (assim como o próprio React) que tem como objetivo te ajudar a gerenciar estados de uma forma fácil e intuitiva (usar o recoil é como usar um hook qualquer no React).

Entendendo o Recoil

Na versão atual o Recoil é baseado principalmente em dois pilares, os Atoms e os Selectors.

Atoms

Atoms são unidades de estado, é possível atualizar e ler estes estados de uma forma fácil. Também é possível conectar seus components a estes Atoms para que quando eles sejam atualizados os components sejam renderizados novamente. Você também pode usar os Atoms ao invés dos estados locais dos components e utiliza-los para compartilhar os estados entre muitos components.

Selectors

Os Selectors sâo funções puras (que tem como objetivo devolver valores derivados dos Atoms) que recebem um Atom como argumento, quando o Atom que veio como argumento é atualizado o selector também atualiza o valor de retorno. Assim como no caso dos Atoms, os Components também podem se ‘inscrever’ para serem avisados quando os selectors forem atualizados, quando isso acontece eles são renderizados novamente.

1 – Instale o recoil + recoil persist rodando:

2 – No arquivo _app.js:

a – importe o recoil:

b – Em volta de <Component {…pageProps} /> coloque:

c – Crie as seguintes pastas:

d – No atom address criado coloque:

 

 

16 – Desafio friendly id

1 – Instale o friendly id na API e configure ele nos Restaurantes

2 – Devolva o slug do restaurante junto com os outros detalhes dele em /restaurants e /restaurants/:id

3 – Altere o cliente web para usar o friendly id na url e na chamada da API

 

 

Feito com s2 por OneBitCode