Segundo desafio do curso Ignite trilha ReactJS da Rocketseat - Modulo 1.
Essa será uma aplicação onde o principal objetivo é criar um hook de carrinho de compras. Tendo acesso a duas páginas, um componente e um hook para implementar as funcionalidades pedidas nesse desafio:
- Adicionar um novo produto ao carrinho;
- Remover um produto do carrinho;
- Alterar a quantidade de um produto no carrinho;
- Cálculo dos preços sub-total e total do carrinho;
- Validação de estoque;
- Exibição de mensagens de erro;
- components/Header/index.tsx
- pages/Home/index.tsx
- cartItemsAmount: Deve possuir as informações da quantidade de cada produto no carrinho. Sugerimos criar um objeto utilizando reduce onde a chave representa o id do produto e o valor a quantidade do produto no carrinho. Exemplo: se você possuir no carrinho um produto de id 1 e quantidade 4 e outro produto de id 2 e quantidade 3, o objeto ficaria assim:
{
1: 4,
2: 3
}
-
loadProducts: Deve buscar os produtos da Fake API e formatar o preço utilizando o helper
utils/format
; -
handleAddProduct: Deve adicionar o produto escolhido ao carrinho.
-
pages/Cart/index.tsx
Nesse arquivo, temos cinco pontos importantes a serem implementados:
-
cartFormatted: Deve formatar o carrinho adicionando os campos
priceFormatted
(preço do produto) esubTotal
(preço do produto multiplicado pela quantidade) ambos devidamente formatados com outils/format
; -
total: Deve possuir a informação do valor total do carrinho devidamente formatado com o
utils/format
; -
handleProductIncrement: Deve aumentar em 1 unidade a quantidade do produto escolhido ao carrinho;
-
handleProductDecrement: Deve diminuir em 1 unidade a quantidade do produto escolhido ao carrinho, onde o valor mínimo é 1 (nesse caso o botão deve estar desativado);
-
handleRemoveProduct: Deve remover o produto escolhido do carrinho.
-
hooks/useCart.tsx
Apesar de não retornar diretamente nenhuma renderização de elementos na interface como os outros arquivos, esse é o coração do desafio. Ele é responsável por:
- hook
useCart
; - context
CartProvider
; - manipular
localStorage
; - exibir
toasts
.
Então é aqui que você vai implementar as funcionalidades que serão utilizadas pelo restante do app. Os principais pontos são:
- cart: Deve verificar se existe algum registro com o valor
@RocketShoes:cart
e retornar esse valor caso existir. Caso contrário, retornar um array vazio. - addProduct: Deve adicionar um produto ao carrinho. Porém, é preciso verificar algumas coisas:
- O valor atualizado do carrinho deve ser perpetuado no localStorage utilizando o método
setItem
. - Caso o produto já exista no carrinho, não se deve adicionar um novo produto repetido, apenas incrementar em 1 unidade a quantidade;
- Verificar se existe no estoque a quantidade desejada do produto. Caso contrário, utilizar o método
error
da react-toastify com a seguinte mensagem:
- O valor atualizado do carrinho deve ser perpetuado no localStorage utilizando o método
toast.error('Quantidade solicitada fora de estoque');
- Capturar utilizando
trycatch
os erros que ocorrerem ao longo do método e, no catch, utilizar o métodoerror
da react-toastify com a seguinte mensagem:
toast.error('Erro na adição do produto');
-
removeProduct: Deve remover um produto do carrinho. Porém, é preciso verificar algumas coisas:
- O valor atualizado do carrinho deve ser perpetuado no localStorage utilizando o método
setItem
. - Capturar utilizando
trycatch
os erros que ocorrerem ao longo do método e, no catch, utilizar o métodoerror
da react-toastify com a seguinte mensagem:
toast.error('Erro na remoção do produto');
- O valor atualizado do carrinho deve ser perpetuado no localStorage utilizando o método
-
updateProductAmount: Deve atualizar a quantidade de um produto no carrinho. Porém, é preciso verificar algumas coisas:
- O valor atualizado do carrinho deve ser perpetuado no localStorage utilizando o método
setItem
. - Se a quantidade do produto for menor ou igual a zero, sair da função updateProductAmount instantaneamente.
- Verificar se existe no estoque a quantidade desejada do produto. Caso contrário, utilizar o método
error
da react-toastify com a seguinte mensagem:
- O valor atualizado do carrinho deve ser perpetuado no localStorage utilizando o método
toast.error('Quantidade solicitada fora de estoque');
- Capturar utilizando
trycatch
os erros que ocorrerem ao longo do método e, no catch, utilizar o métodoerror
da react-toastify com a seguinte mensagem:
toast.error('Erro na alteração de quantidade do produto');
Link para vídeo demonstrativo: Clique aqui.
Este projeto foi desenvolvido utilizando as seguintes tecnologias:
- React
- Json-server
- TypeScript
- localStorage API
- React-Toastfy
Antes de começar, verifique se você atendeu aos seguintes requisitos:
Clone o repositório:
$ git clone git@github.com:xDouglas90/ignite-react-mod2-challenge-1.git
- Entre na pasta do repositório clonado e no terminal:
$ yarn install ou npm install
$ yarn server ou npm run server
$ yarn start ou npm start
Agora basta abrir em um navegador: http://localhost:8080/, para visualizar a aplicação funcionando.
Para visualizar o conteúdo da Fake API: http://localhost:3333/
Este projeto está sob a licença MIT. Veja mais detalhes no arquivo LICENSE.