Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/rafaelmartins92/fundamentos-react-native

🚀 Desafio sobre Fundamentos do React Native aplicado no Bootcamp GoStack - Rocketseat
https://github.com/rafaelmartins92/fundamentos-react-native

gostack react-native rocketseat typescript

Last synced: 9 days ago
JSON representation

🚀 Desafio sobre Fundamentos do React Native aplicado no Bootcamp GoStack - Rocketseat

Awesome Lists containing this project

README

        

GoStack


Desafio 08: Fundamentos do React Native

“Não existe linha de chegada, a vitória está em se manter correndo”!


GitHub language count


Made by Rocketseat

License


Stargazers


Sobre o desafio   |   
Entrega   |   
Licença

## :rocket: Sobre o desafio

Nesse desafio, vocĂȘ desenvolverĂĄ uma nova aplicação, a GoMarketplace. Dessa vez Ă© hora de vocĂȘ praticar o que vocĂȘ aprendeu atĂ© agora no React Native junto com o TypeScript, utilizando rotas, Async Storage e a Context API.

### Utilizando uma fake API

Antes de tudo, para que vocĂȘ tenha os dados para exibir em tela, criamos um arquivo que vocĂȘ poderĂĄ utilizar como fake API para te prover esses dados.

Para isso, deixamos instalado no seu package.json uma dependĂȘncia chamada `json-server`, e um arquivo chamado `server.json` que contĂ©m os dados para uma rota `/products`. Para executar esse servidor vocĂȘ pode executar o seguinte comando:

```js
yarn json-server server.json -p 3333
```

### Layout da aplicação

Essa aplicação possui um layout que vocĂȘ pode seguir para conseguir visualizar o seu funcionamento.

O layout pode ser acessado através da pågina do Figma, no [seguinte link](https://www.figma.com/file/VgK3hsmyGbqiGu9FdqfUzF/GoMarketplace?node-id=0%3A1).

VocĂȘ precisarĂĄ de uma conta (gratuita) no Figma pra inspecionar o layout e obter detalhes de cores, tamanhos, etc.

### Funcionalidades da aplicação

Agora que vocĂȘ jĂĄ estĂĄ com o template clonado e pronto para continuar, vocĂȘ deve verificar os arquivos da pasta `src` e completar onde nĂŁo possui cĂłdigo, com o cĂłdigo para atingir os objetivos de cada rota.

- **`Listar os produtos da fake API`**: Sua pågina `Dashboard` deve ser capaz de exibir uma listagem através de uma tabela, com os campos `title`, `image_url` e `price`.

**Dica**: VocĂȘ pode utilizar a função [Intl](https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat) para formatar os valores. Dentro da pasta `utils` no template vocĂȘ encontrarĂĄ um cĂłdigo para te ajudar.

- **`Adicionar itens ao carrinho`**: Em toda sua aplicação, vocĂȘ deve utilizar o Contexto chamado `cart` que deixamos disponĂ­vel. VocĂȘ vai precisar completar as funcionalidades dentro de `hooks/cart.tsx` para que vocĂȘ consiga adicionar itens ao carrinho.

**Dica**: No seu contexto de carrinho, utilize uma propriedade chamada `quantity` para controlar quantos desse item existem no seu carrinho.

**Dica 2**: Caso um produto que vocĂȘ estĂĄ adicionando jĂĄ exista no carrinho, apenas altere a quantidade dele no seu contexto para evitar itens duplicados.

- **`Exibir itens do carrinho`**: Na pĂĄgina `Cart` vocĂȘ deve exibir todos os itens do carrinho, junto com a quantidade, valor Ășnico, valor subtotal dos itens e total de todos os items.

- **`Aumentar quantidade de itens do carrinho`**: Na pĂĄgina `Cart` vocĂȘ deve permitir que o usuĂĄrio aumente a quantidade de itens do mesmo produto, para isso vocĂȘ pode utilizar a função `increment` dentro do seu contexto em `/src/hooks/cart.tsx`.

- **`Diminuir quantidade de um item do carrinho`**: Na pĂĄgina `Cart` vocĂȘ deve permitir que o usuĂĄrio decremente a quantidade de itens do mesmo produto, para isso vocĂȘ pode utilizar a função `decrement` dentro do seu contexto em `/src/hooks/cart.tsx`.

- **`Exibir valor total dos itens no carrinho`**: Tanto na pĂĄgina `Dashboard`, tanto na pĂĄgina `Cart` vocĂȘ deve exibir o valor total de todos os itens que estĂŁo no seu carrinho.

### Específicação dos testes

Em cada teste, tem uma breve descrição no que sua aplicação deve cumprir para que o teste passe.

Caso vocĂȘ tenha dĂșvidas quanto ao que sĂŁo os testes, e como interpretĂĄ-los, dĂ© uma olhada em **[nosso FAQ](https://github.com/Rocketseat/bootcamp-gostack-desafios/tree/master/faq-desafios).**

Para esse desafio, temos os seguintes testes:

- **`should be able to list the products`**: Para que esse teste passe, sua aplicação deve permitir que sejam listados na sua tela `Dashboard`, toda os produtos que são retornadas do Fake API. Essa listagem deve exibir o `title` e o `price` que deve ser formatado utilizando a função `Intl`.

- **`should be able to add a product to the cart`**: Para que esse teste passe, vocĂȘ deve permitir que seja possĂ­vel adicionar produtos da sua `Dashboard` ao carrinho, utilizando o contexto de `cart` disponibilizado.

- **`should be able to list the products on the cart`**: Para que esse teste passe, vocĂȘ deve permitir que seja possĂ­vel listar os produtos que estĂŁo salvos no contexto do seu carrinho na pĂĄgina `Cart`, nessa pĂĄgina exiba o nome do produto e o subtotal total de cada produto (price \* quantity).

- **`should be able to calculate the cart total`**: Para que esse teste passe, tanto na pĂĄgina `Dashboard`, tanto na pĂĄgina `Cart` vocĂȘ deve exibir o valor total de todos os itens que estĂŁo no seu carrinho.

**Dica**: Para calcular o total de todos os itens, vocĂȘ pode utilizar o [reduce](https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce) para somar todos os valores e retornar o valor total.

- **`should be able to show the total quantity of itens in the cart`**: Para que esse teste passe, tanto na pĂĄgina `Dashboard`, tanto na pĂĄgina `Cart` vocĂȘ deve exibir o nĂșmero total de itens que estĂŁo no seu carrinho.

**Dica**: Para calcular o total de todos os itens, vocĂȘ pode utilizar o [reduce](https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce) para somar todos os valores e retornar o valor total.

**Dica 2**: Utilize o useMemo para armazenar o valor total do carrinho que vocĂȘ calculou.

- **`should be able to increment product quantity on the cart`**: Para que esse teste passe, vocĂȘ deve permitir que seja possĂ­vel incrementar a quantidade de um produto do seu carrinho, utilizando o contexto de `cart` disponibilizado.

- **`should be able to decrement product quantity on the cart`**: Para que esse teste passe, vocĂȘ deve permitir que seja possĂ­vel decrementar a quantidade de um produto do seu carrinho, utilizando o contexto de `cart` disponibilizado.

**Dica**: Ao decrementar a quantidade de um produto, nĂŁo permita que ele seja decrementado para um valor negativo, sendo a quantidade mĂ­nima 1 para estar no carrinho.

- **`should be able to navigate to the cart`**: Para que esse teste passe, no seu componente `FloatingCart` na Dashboard, vocĂȘ deve permitir que ao clicar no botĂŁo de carrinho com o testID de `navigate-to-cart-button`, o usuĂĄrio seja redirecionado para a pĂĄgina `Cart`.

- **`should be able to add products to the cart`**: Para que esse teste passe, no seu arquivo onde contĂ©m o contexto do carrinho, vocĂȘ deve permitir que a função `addToCart` adicione um novo item ao carrinho.

- **`should be able to increment quantity`**: Para que esse teste passe, no seu arquivo onde contĂ©m o contexto do carrinho, vocĂȘ deve permitir que a função `increment` incremente em `1` unidade a quantidade de um item que estĂĄ armazenado no contexto.

- **`should be able to decrement quantity`**: Para que esse teste passe, no seu arquivo onde contĂ©m o contexto do carrinho, vocĂȘ deve permitir que a função `decrement` decremente em `1` unidade a quantidade de um item que estĂĄ armazenado no contexto.

- **`should store products in AsyncStorage while adding, incrementing and decrementing`**: Para que esse teste passe, no seu arquivo onde contĂ©m o contexto do carrinho vocĂȘ deve permitir que todas as atualizaçÔes que vocĂȘ fizer no carrinho, sejam salvas no AsyncStorage. Por exemplo, ao adicionar um item ao carrinho, adicione-o tambĂ©m no AsyncStorage. Lembre de tambĂ©m atualizar o valor do AsyncStorage quando vocĂȘ incrementar ou decrementar a quantidade de um item.

- **`should load products from AsyncStorage`**: Para que esse teste passe, no seu arquivo onde contĂ©m o contexto do carrinho, vocĂȘ deve permitir que todos os produtos que foram adicionados sejam buscados do AsyncStorage.

## :calendar: Entrega

Esse desafio deve ser entregue a partir da plataforma da Rocketseat, envie o link do repositĂłrio que vocĂȘ fez suas alteraçÔes. ApĂłs concluir o desafio, fazer um post no Linkedin e postar o cĂłdigo no Github Ă© uma boa forma de demonstrar seus conhecimentos e esforços para evoluir na sua carreira para oportunidades futuras.

## :memo: Licença

Esse projeto estå sob a licença MIT. Veja o arquivo [LICENSE](LICENSE) para mais detalhes.

---

Feito com 💜 by Rocketseat :wave: [Entre na nossa comunidade!](https://discordapp.com/invite/gCRAFhc)