Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
ecfe1d5
esqueleto dos componentes
rtakeshi13 May 26, 2020
0d5b117
layout pronto
rtakeshi13 May 26, 2020
a062cc7
CardProduto sem estilo
rtakeshi13 May 26, 2020
8f6df55
GridProdutos sem estilo
rtakeshi13 May 26, 2020
264fc23
Merge pull request #1 from future4code/produtos
arturmmagalhaes May 26, 2020
acc5c24
Função carrinho
arturmmagalhaes May 26, 2020
e52978b
Adicionando a função de remover
arturmmagalhaes May 26, 2020
0a810c5
desafio1
rtakeshi13 May 26, 2020
472465e
Filtros em construção
Kaueny-Alves May 26, 2020
dca338b
seçao carrinho
arturmmagalhaes May 27, 2020
f323d52
Ajustando a quantidade
arturmmagalhaes May 27, 2020
fd3ca7a
adicionando reduce
arturmmagalhaes May 27, 2020
6aa33db
Filtros Atualizados
Kaueny-Alves May 27, 2020
e9f7979
link do surge no readme
rtakeshi13 May 27, 2020
f6e000f
Merge pull request #4 from future4code/carrinho
rtakeshi13 May 27, 2020
908a778
Merge branch 'master' into Filtros
rtakeshi13 May 27, 2020
eda02a1
Merge pull request #3 from future4code/Filtros
rtakeshi13 May 27, 2020
e07c21b
Merge branch 'master' into desafio1
rtakeshi13 May 27, 2020
8830423
Merge pull request #2 from future4code/desafio1
rtakeshi13 May 27, 2020
8e1836e
indentacao
rtakeshi13 May 27, 2020
0be25f0
alterações
Kaueny-Alves May 27, 2020
67a8558
removi umas variaveis que nao eram usadas
rtakeshi13 May 27, 2020
e888d59
Filtro-Estilizado
Kaueny-Alves May 27, 2020
11272bd
Merge branch 'master' into filtros2
arturmmagalhaes May 28, 2020
b65526e
Merge pull request #5 from future4code/filtros2
arturmmagalhaes May 28, 2020
b54fbbe
Ajustando css do carrinho
arturmmagalhaes May 28, 2020
87fe5a0
Merge pull request #6 from future4code/carrinhoCSS
rtakeshi13 May 28, 2020
2a03149
acho que ta combinando
rtakeshi13 May 28, 2020
3ce2f94
Merge pull request #7 from future4code/produtos-css
rtakeshi13 May 29, 2020
28efab4
logica para aumentar quantidade no carrinho
rtakeshi13 May 30, 2020
5a7b7f2
Delete App.css
rtakeshi13 May 30, 2020
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -125,3 +125,4 @@ dist
npm-debug.log*
yarn-debug.log*
yarn-error.log*
package-lock.json
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1 @@
Sejam bem vindos ao Labe-commerce, esse repositório contém um esqueleto de app React e um .gitignore.
http://mello-labe-commerce11.surge.sh/
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@
"@testing-library/user-event": "^7.1.2",
"react": "^16.13.1",
"react-dom": "^16.13.1",
"react-scripts": "3.4.1"
"react-scripts": "3.4.1",
"styled-components": "^5.1.1"
},
"scripts": {
"start": "react-scripts start",
Expand Down
38 changes: 0 additions & 38 deletions src/App.css

This file was deleted.

180 changes: 157 additions & 23 deletions src/App.js
Original file line number Diff line number Diff line change
@@ -1,26 +1,160 @@
import React from 'react';
import logo from './logo.svg';
import './App.css';

function App() {
return (
<div className="App">
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<p>
Edit <code>src/App.js</code> and save to reload.
</p>
<a
className="App-link"
href="https://reactjs.org"
target="_blank"
rel="noopener noreferrer"
>
Learn React
</a>
</header>
</div>
);
import React from "react";
import styled from "styled-components";
import Filter from "./components/Filter/Filter";
import Carrinho from "./components/Carrinho/Carrinho";
import GridProdutos from "./components/GridProdutos/GridProdutos";
Comment on lines +3 to +5
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Excelente componentização!


const produtos = [
{
id: 1,
nome: "produto 1",
valor: 10,
imgUrl: "https://picsum.photos/200/200?a=1",
},
{
id: 2,
nome: "produto 2",
valor: 20,
imgUrl: "https://picsum.photos/200/200?a=2",
},
Comment on lines +7 to +19
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Boooa! Excelente prática isolar o array do estado fora do componente!

{
id: 3,
nome: "produto 3",
valor: 30,
imgUrl: "https://picsum.photos/200/200?a=3",
},
{
id: 4,
nome: "produto 4",
valor: 40,
imgUrl: "https://picsum.photos/200/200?a=4",
},
{
id: 5,
nome: "produto 5",
valor: 50,
imgUrl: "https://picsum.photos/200/200?a=5",
},
{
id: 6,
nome: "produto 6",
valor: 60,
imgUrl: "https://picsum.photos/200/200?a=6",
},
{
id: 7,
nome: "produto 7",
valor: 70,
imgUrl: "https://picsum.photos/200/200?a=7",
},
{
id: 8,
nome: "produto 8",
valor: 80,
imgUrl: "https://picsum.photos/200/200?a=8",
},
];


const MainContainer = styled.div`
display: grid;
grid-template-columns: 1fr 3fr 1fr;
`;



Comment on lines +58 to +65
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pro código do componente não ficar tão grande, vcs podem isolar suas constantes do styled-componente em um arquivo separado, chamado styled.js, fazer toda a configuração CSS lá e apenas importar as constantes pro arquivo do componente.

class App extends React.Component {
state = {
produtos: produtos,
carrinho: [],
ordenacao: "crescente",
filtroMax: "",
filtroMin: "",
regex: "",
}

atualizarMaximo = (evento) => {
this.setState({ filtroMax: Number(evento.target.value) })
}

atualizarMinimo = (evento) => {
this.setState({ filtroMin: Number(evento.target.value) })
}

atualizarRegex = (evento) => {
this.setState({ regex: evento.target.value })
}

filtrarProdutos = () => {
let filtrados = this.state.produtos;
if (this.state.filtroMax) {
filtrados = filtrados.filter(item => item.valor <= this.state.filtroMax)
}
if (this.state.filtroMin) {
filtrados = filtrados.filter(item => item.valor >= this.state.filtroMin)
}
if (this.state.regex) {
const regexp = new RegExp(this.state.regex, 'i')
filtrados = filtrados.filter(item => regexp.test(item.nome))
}
return filtrados
}


adicionarAoCarrinho = (produto) => {
const novoCarrinho = [...this.state.carrinho, produto];
this.setState({ carrinho: novoCarrinho });
};

cancelarCompra = (id) => {
const removido = this.state.carrinho.filter(compra => {
if (compra.id !== id) {
return true
}
return false
});
this.setState({
carrinho: removido
})
}

mudarOrdenacao = (evento) => {
this.setState({ ordenacao: evento.target.value });
};

componentDidUpdate() {
localStorage.setItem('carrinho', JSON.stringify(this.state.carrinho))
}

componentDidMount() {
const carrinhoStr = localStorage.getItem('carrinho');
if (carrinhoStr) {
const carrinhoObj = JSON.parse(carrinhoStr);
this.setState({ carrinho: carrinhoObj });
}
};

render() {
return (
<MainContainer>
<Filter
funcaoMax={this.atualizarMaximo}
funcaoMin={this.atualizarMinimo}
funcaoRegex={this.atualizarRegex}
/>
<GridProdutos
produtos={this.filtrarProdutos()}
ordenacao={this.state.ordenacao}
funcaoAdicionar={this.adicionarAoCarrinho}
funcaoOrdenacao={this.mudarOrdenacao}
/>
<Carrinho
meuCarrinho={this.state.carrinho}
funcaoRemover={this.cancelarCompra}
/>
</MainContainer>
)
}
}

export default App;
34 changes: 34 additions & 0 deletions src/components/CardProduto/CardProduto.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import React from "react";
import styled from "styled-components";

const CardContainer = styled.div`
display: flex;
flex-direction: column;
padding: 5px;
border: 1px solid black;
margin-top: 5px;
`;
const Imagem = styled.img``;

const BotaoAdicionar = styled.button`
margin: 5px;
`;

const Descricao = styled.p`
margin: 5px;
`

function CardProduto(props) {
const { produto, funcao } = props;

return (
<CardContainer>
<Imagem src={produto.imgUrl} />
<Descricao>{produto.nome}</Descricao>
<Descricao>R$: {produto.valor.toFixed(2)}</Descricao>
<BotaoAdicionar onClick={funcao}>Adicionar ao Carrinho</BotaoAdicionar>
</CardContainer>
);
}

export default CardProduto;
60 changes: 60 additions & 0 deletions src/components/Carrinho/Carrinho.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import React from "react";
import styled from "styled-components";

const CarrinhoLateral = styled.div`
display: flex;
flex-direction: column;
font-family: Roboto;
border: 1px solid black;
margin: 30px 20px 0px 20px;
padding: 5px;
`
const Title = styled.h3`
margin: 10px 5px;
`
const Produtos = styled.div`
font-size: 20px;
`

function Carrinho(props) {

const { meuCarrinho, funcaoRemover } = props;
const novoCarrinho = []
let total = 0

meuCarrinho.forEach(item => {

total += item.valor;

const estaNoArray = novoCarrinho.findIndex(index => index.id === item.id);
if (estaNoArray === -1) {
const produto = {
id: item.id,
nome: item.nome,
qtd: 1,
}
novoCarrinho.push(produto)
} else {
novoCarrinho[estaNoArray].qtd++;
}
});

const carrinhoLateral = novoCarrinho.map((produto) =>
<div>
<span>{produto.qtd}x - {produto.nome} </span>
<button onClick={() => funcaoRemover(produto.id)}>X</button>
<hr />
</div>
)

return <CarrinhoLateral>
<Title>CARRINHO</Title>
<Produtos>
<hr />
{carrinhoLateral}
<b>Total:</b> {`R$ ${total.toFixed(2)}`}
</Produtos>
</CarrinhoLateral>;
}

export default Carrinho;
41 changes: 41 additions & 0 deletions src/components/Filter/Filter.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import React from "react";
import styled from "styled-components";

const BarraLateral = styled.div`
display:flex;
flex-direction: column;
padding: 5px;
font-family: Roboto;
border: 1px solid black;
margin: 30px 20px 0px 20px;

`
const SeçãoFiltro = styled.div`
margin: 10px 5px;
`

const Title = styled.h3`
margin: 10px 5px;
`


function Filter(props) {
const { funcaoMax, funcaoMin, funcaoRegex } = props;
return <BarraLateral>
<Title>FILTROS</Title>
<SeçãoFiltro>
<label>Valor Máximo</label> <br />
<input type="number" onChange={funcaoMax} />
</SeçãoFiltro>
<SeçãoFiltro>
<label>Valor Mínimo</label> <br />
<input type="number" onChange={funcaoMin} />
</SeçãoFiltro>
<SeçãoFiltro>
<label>Buscar Produtos</label> <br />
<input onChange={funcaoRegex} />
</SeçãoFiltro>
</BarraLateral>;
}

export default Filter;
Loading