Skip to content

Commit

Permalink
commit final
Browse files Browse the repository at this point in the history
  • Loading branch information
Lucas Montezuma committed Feb 23, 2024
1 parent 2f074d0 commit 8301a69
Show file tree
Hide file tree
Showing 11 changed files with 217 additions and 76 deletions.
2 changes: 1 addition & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"editor.formatOnSave": false,
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true
"source.fixAll.eslint": "explicit"
}
}
97 changes: 94 additions & 3 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
"version": "0.1.0",
"private": true,
"dependencies": {
"@reduxjs/toolkit": "^2.2.1",
"@testing-library/jest-dom": "^5.16.5",
"@testing-library/react": "^13.4.0",
"@testing-library/user-event": "^13.5.0",
Expand All @@ -12,6 +13,7 @@
"@types/react-dom": "^18.0.11",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-redux": "^9.1.0",
"react-scripts": "5.0.1",
"styled-components": "^5.3.6",
"typescript": "^4.9.5",
Expand Down
43 changes: 6 additions & 37 deletions src/App.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { useEffect, useState } from 'react'
import Header from './components/Header'
import Produtos from './containers/Produtos'

import { GlobalStyle } from './styles'
import { Provider } from 'react-redux'
import { store } from './store'

export type Produto = {
id: number
Expand All @@ -12,46 +13,14 @@ export type Produto = {
}

function App() {
const [produtos, setProdutos] = useState<Produto[]>([])
const [carrinho, setCarrinho] = useState<Produto[]>([])
const [favoritos, setFavoritos] = useState<Produto[]>([])

useEffect(() => {
fetch('https://fake-api-tau.vercel.app/api/ebac_sports')
.then((res) => res.json())
.then((res) => setProdutos(res))
}, [])

function adicionarAoCarrinho(produto: Produto) {
if (carrinho.find((p) => p.id === produto.id)) {
alert('Item já adicionado')
} else {
setCarrinho([...carrinho, produto])
}
}

function favoritar(produto: Produto) {
if (favoritos.find((p) => p.id === produto.id)) {
const favoritosSemProduto = favoritos.filter((p) => p.id !== produto.id)
setFavoritos(favoritosSemProduto)
} else {
setFavoritos([...favoritos, produto])
}
}

return (
<>
<Provider store={store}>
<GlobalStyle />
<div className="container">
<Header favoritos={favoritos} itensNoCarrinho={carrinho} />
<Produtos
produtos={produtos}
favoritos={favoritos}
favoritar={favoritar}
adicionarAoCarrinho={adicionarAoCarrinho}
/>
<Header />
<Produtos />
</div>
</>
</Provider>
)
}

Expand Down
17 changes: 8 additions & 9 deletions src/components/Header/index.tsx
Original file line number Diff line number Diff line change
@@ -1,17 +1,16 @@
import { useSelector } from 'react-redux'
import * as S from './styles'

import { Produto } from '../../App'

import cesta from '../../assets/cesta.png'
import { paraReal } from '../Produto'

type Props = {
itensNoCarrinho: Produto[]
favoritos: Produto[]
}
import { RootReducer } from '../../store'

const Header = () => {
const itens = useSelector((state: RootReducer) => state.carrinho.itens)
const favoritos = useSelector((state: RootReducer) => state.favoritos.itens)

const Header = ({ itensNoCarrinho, favoritos }: Props) => {
const valorTotal = itensNoCarrinho.reduce((acc, item) => {
const valorTotal = itens.reduce((acc, item) => {
acc += item.preco
return acc
}, 0)
Expand All @@ -23,7 +22,7 @@ const Header = ({ itensNoCarrinho, favoritos }: Props) => {
<span>{favoritos.length} favoritos</span>
<img src={cesta} />
<span>
{itensNoCarrinho.length} itens, valor total: {paraReal(valorTotal)}
{itens.length} itens, valor total: {paraReal(valorTotal)}
</span>
</div>
</S.Header>
Expand Down
19 changes: 9 additions & 10 deletions src/components/Produto/index.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
import { useDispatch } from 'react-redux'
import { Produto as ProdutoType } from '../../App'
import * as S from './styles'

import { adicionar } from '../../store/reducers/carrinho'
import { favoritar } from '../../store/reducers/favoritos'

type Props = {
produto: ProdutoType
aoComprar: (produto: ProdutoType) => void
favoritar: (produto: ProdutoType) => void
estaNosFavoritos: boolean
}

Expand All @@ -13,12 +15,9 @@ export const paraReal = (valor: number) =>
valor
)

const ProdutoComponent = ({
produto,
aoComprar,
favoritar,
estaNosFavoritos
}: Props) => {
const ProdutoComponent = ({ produto, estaNosFavoritos }: Props) => {
const dispatch = useDispatch()

return (
<S.Produto>
<S.Capa>
Expand All @@ -28,12 +27,12 @@ const ProdutoComponent = ({
<S.Prices>
<strong>{paraReal(produto.preco)}</strong>
</S.Prices>
<S.BtnComprar onClick={() => favoritar(produto)} type="button">
<S.BtnComprar onClick={() => dispatch(favoritar(produto))} type="button">
{estaNosFavoritos
? '- Remover dos favoritos'
: '+ Adicionar aos favoritos'}
</S.BtnComprar>
<S.BtnComprar onClick={() => aoComprar(produto)} type="button">
<S.BtnComprar onClick={() => dispatch(adicionar(produto))} type="button">
Adicionar ao carrinho
</S.BtnComprar>
</S.Produto>
Expand Down
22 changes: 6 additions & 16 deletions src/containers/Produtos.tsx
Original file line number Diff line number Diff line change
@@ -1,38 +1,28 @@
import { Produto as ProdutoType } from '../App'
import Produto from '../components/Produto'
import { useGetProdutosQuery } from '../services/api'
import favoritos from '../store/reducers/favoritos'

import * as S from './styles'

type Props = {
produtos: ProdutoType[]
favoritos: ProdutoType[]
adicionarAoCarrinho: (produto: ProdutoType) => void
favoritar: (produto: ProdutoType) => void
}
const ProdutosComponent = () => {
const { data: produtos } = useGetProdutosQuery()

const ProdutosComponent = ({
produtos,
favoritos,
adicionarAoCarrinho,
favoritar
}: Props) => {
const produtoEstaNosFavoritos = (produto: ProdutoType) => {
const produtoId = produto.id
const IdsDosFavoritos = favoritos.map((f) => f.id)
const IdsDosFavoritos = favoritos.map((iten: { id: any }) => iten.id)

return IdsDosFavoritos.includes(produtoId)
}

return (
<>
<S.Produtos>
{produtos.map((produto) => (
{produtos?.map((produto) => (
<Produto
estaNosFavoritos={produtoEstaNosFavoritos(produto)}
key={produto.id}
produto={produto}
favoritar={favoritar}
aoComprar={adicionarAoCarrinho}
/>
))}
</S.Produtos>
Expand Down
17 changes: 17 additions & 0 deletions src/services/api.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react'
import { Produto } from '../App'

const api = createApi({
baseQuery: fetchBaseQuery({
baseUrl: 'https://fake-api-tau.vercel.app'
}),
endpoints: (builder) => ({
getProdutos: builder.query<Produto[], void>({
query: () => 'api/ebac_sports'
})
})
})

export const { useGetProdutosQuery } = api

export default api
Loading

0 comments on commit 8301a69

Please sign in to comment.